Por que “cat / tmp / out1 / tmp / in2 &” aparece como “bash” com o comando “ps”?

5

Considere:

mkfifo /tmp/out1
mkfifo /tmp/in2
cat /tmp/out1 > /tmp/in2 &

Quando eu corro

ps 

aparece como bash na seção CMD .

Por quê?

    
por PerrierCitror 23.10.2014 / 14:24

1 resposta

14

ps lista bash como o processo em execução porque o processo bash está bloqueado ao tentar abrir o fifo /tmp/in2 antes de gerar o comando cat . Como bash é responsável por manipular seu redirecionamento ( > /tmp/in2 ), ele deve primeiro abrir /tmp/in2 para poder usar posteriormente a chamada do sistema dup2 para alterar o comando STDOUT do cat para o arquivo descritor para /tmp/in2 . Infelizmente, a chamada para open está bloqueando neste caso.

Se você fosse executar o comando dentro da strace:

strace -f bash -c "cat /tmp/out1 > /tmp/in2"

você veria parar em:

[pid 18457] open("/tmp/in2", O_WRONLY|O_CREAT|O_TRUNC, 0666

Ele é bloqueado até que outro processo abra o arquivo para leitura. De acordo com a página do manual fifa (7) :

The kernel maintains exactly one pipe object for each FIFO special file that is opened by at least one process. The FIFO must be opened on both ends (reading and writing) before data can be passed. Normally, opening the FIFO blocks until the other end is opened also.

A process can open a FIFO in nonblocking mode. In this case, opening for read only will succeed even if no-one has opened on the write side yet, opening for write only will fail with ENXIO (no such device or address) unless the other end has already been opened.

Se você tivesse que abrir /tmp/in2 para ler primeiro (digamos, adicionando cat /tmp/in2 & antes do seu comando final), você veria seu comando cat final aparecer na sua árvore de processos.

    
por 23.10.2014 / 14:39