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.