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

8

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

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

(com base em this )

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

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

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

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

Você notará que, se tentar telnet to localhost on 4458 , receberá um erro "Conexão recusada".

    
por Razvan 19.05.2016 / 16:14

1 resposta

9

Isso ocorre porque o comando netcat ainda nem começou! O shell ao tentar abrir o fifo para entrada irá bloquear. Experimente

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 ler e escrever como stdin e depois dups para stdout.

Rastrear o 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: Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa.

    
por 19.05.2016 / 17:30