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

8

Este es un servidor echo simple en Unix, que usa nc:

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

(basado en esto )

Como puedo ver, 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

Usted se dará cuenta de que si se intenta telnetcon localhostel 4458que obtendrá un "Conexión rechazada" error.

Razvan
fuente
No tengo una respuesta, pero espero que esto pueda ayudar a alguien más informado que yo. cat myfifo | nc -k -l 4458 > myfifoTambién funciona. Si usa un archivo de texto, file.txt así, nc -k -l 4458 < file.txt > file.txtla primera conexión se conectará y cerrará (tiene sentido porque la entrada se truncó y EOF cierra el zócalo), la segunda conexión se convertirá en un servidor de eco olvidadizo: hará eco en cualquier otra línea y guarde las líneas sin eco en el archivo de texto.
user1794469

Respuestas:

9

Esto se debe a que el comando netcat aún no se ha iniciado. El shell cuando intente abrir el fifo para la entrada se bloqueará. Tratar

strace cat >fifo <fifo

y no verás nada En su lugar, use, por ejemplo,

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

que abre el fifo para leer y escribir como stdin, y luego lo duplica a stdout.


El seguimiento del comando bash completo muestra que ni la apertura para lectura ni la escritura devuelven (hasta que se haga 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 leer normalmente bloquea hasta que algún otro proceso abra el mismo FIFO para escribir, y viceversa.

meuh
fuente
1
El bloqueo está documentado: tldp.org/LDP/lpg/node19.html
thrig
¿Por qué el shell se bloquea cuando se usa "> fifo <fifo"? Parece que lo abre para escribir y luego para leer. Entonces, dado que ya hay un identificador abierto para la escritura, ¿no debería continuar normalmente?
Razvan
@Razvan He actualizado la respuesta con la secuencia real para las dos órdenes de apertura alternativas del fifo, y puedes ver esa apertura para escribir o leer ambos bloques.
meuh