¿Por qué no funciona la redirección de archivos hacia y desde una tubería con nombre, pero sí la tubería a cat?

¿Por qué no funciona la redirección de archivos hacia y desde una tubería con nombre, pero sí la tubería a cat?

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, telnetobtendrás localhostel 4458error "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.

información relacionada