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, telnet
receberá localhost
um 4458
erro "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.