Este es un servidor de eco simple en Unix, usando nc:
mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo
(Residencia eneste)
Como puedo verlo, el flujo de datos funciona de la siguiente manera:
fifo (my named pipe)
|
| (using cat)
|
v
nc
|
| (using cat)
|
v
fifo
Y aquí está la pregunta: ¿por qué esto no funciona?
nc -k -l 4458 -v >fifo <fifo
Notarás que si intentas hacerlo, telnet
obtendrás localhost
el 4458
error "Conexión rechazada".
Respuesta1
¡Esto se debe a que el comando netcat ni siquiera se ha iniciado todavía! El shell se bloqueará al intentar abrir el FIFO para realizar entradas. Intentar
strace cat >fifo <fifo
y no verás nada. En su lugar utilice, por ejemplo,
nc -k -l 4458 -v <>fifo >&0
que abre el FIFO para lectura y escritura como stdin, y luego lo duplica a stdout.
El seguimiento del comando bash completo muestra que ni la apertura para lectura ni escritura regresa (hasta que se realiza la apertura opuesta):
$ 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 un FIFO para lectura normalmente se bloquea hasta que algún otro proceso abre el mismo FIFO para escribir, y viceversa.