Por que o redirecionamento de arquivos de e para um pipe nomeado não funciona, mas o pipe para cat funciona?

Por que o redirecionamento de arquivos de e para um pipe nomeado não funciona, mas o pipe para cat funciona?

Este é um servidor de eco simples em Unix, usando nc:

mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo

(baseado emesse)

Pelo que posso ver, o fluxo de dados funciona da seguinte maneira:

fifo (my named pipe)
 |
 | (using cat)
 |
 v
nc
 |
 | (using cat)
 |
 v
fifo 

E aqui fica a pergunta: por que isso não funciona?

nc -k -l 4458 -v >fifo <fifo

Você notará que, se tentar, telnetreceberá localhostum 4458erro "Conexão recusada".

Responder1

Isso ocorre porque o comando netcat ainda nem foi iniciado! O shell ao tentar abrir o fifo para entrada será bloqueado. Tentar

strace cat >fifo <fifo

e você não verá nada. Em vez disso, use, por exemplo,

nc -k -l 4458 -v <>fifo >&0

que abre o fifo para leitura e gravação como stdin e depois o duplica para stdout.


O rastreamento do comando bash completo mostra que nem a abertura para leitura nem gravação retorna (até que a abertura oposta seja feita):

$ strace -f -e open bash -c 'nc -k -l 4458 -v  >fifo <fifo'
...
Process 3631 attached
[pid  3631] open("fifo", O_WRONLY|O_CREAT|O_TRUNC, 0666

$ strace -f -e open bash -c 'nc -k -l 4458 -v  <fifo >fifo'
...
Process 3684 attached
[pid  3684] open("fifo", O_RDONLY

man 3 mkfifo: Abrir um FIFO para leitura normalmente bloqueia até que algum outro processo abra o mesmo FIFO para escrita e vice-versa.

informação relacionada