Por que o processo não existe (parece existir) antes da leitura do fifo

5

Eu tenho um script Python trivial:

#!/usr/bin/python

import os, sys

sys.stderr.write('I am %s' % os.getpid())
sys.stderr.flush()

print "hello"

sys.stderr.write('I am done')

Quando eu executo este script do Bash e redireciono o stdout para FIFO:

$ mkfifo fifo
$ /pyscript > fifo

o estranho é que, antes de ler o FIFO:

  • Não receberei a mensagem "Eu sou (PID)"

  • Não consigo ver o script usando ps -ef

  • e usando lsof , não consigo ver que alguém tenha o arquivo fifo aberto!

Depois de ler o FIFO, as duas mensagens que estou escrevendo para stderr aparecem de uma só vez.

O que está acontecendo?

O fundo: Estou escrevendo um teste onde eu crio o FIFO e escrevo 'olá' para ele; então eu executo um teste e espero que o SUT não leia a partir dele; ie. apenas ignore o arquivo. Eu tentei fazer mkfifo test_fifo; /bin/echo hello > test_fifo &; run_the_test; killall echo mas para minha surpresa, o processo echo nunca existe! Como devo "limpar" após esse teste (além de rm test_fifo ) ...?

    
por Alois Mahdal 26.10.2015 / 13:49

2 respostas

5

O shell não executará um programa até que qualquer redirecionamento de arquivo tenha sido concluído com êxito. O comando pyscript > fifo fará com que o shell bifurque e tente abrir fifo . Isso só será bem sucedido quando algum processo tiver aberto fifo para leitura. Até lá, o shell filho estará em espera de espera.

$ (sleep 10;ps -l -t pts/0)&
[1] 2574
$ pyscript > fifo
F S   UID    PID   PPID WCHAN  TTY    CMD
0 S  1000   2554   2535 wait   pts/0  bash  //interactive shell
1 S  1000   2574   2554 wait   pts/0  bash  //fork of shell, parent of sleep and ps
1 S  1000   2576   2554 pipe_w pts/0  bash  //fork of shell, waiting to open fifo
0 R  1000   2577   2574 -      pts/0  ps
    
por 26.10.2015 / 15:24
4

A pipe or FIFO has to be open at both ends simultaneously. If you read from a pipe or FIFO file that doesn’t have any processes writing to it (perhaps because they have all closed the file, or exited), the read returns end-of-file. Writing to a pipe or FIFO that doesn’t have a reading process is treated as an error condition; it generates a SIGPIPE signal, and fails with error code EPIPE if the signal is handled or blocked.

link

    
por 26.10.2015 / 13:58