Perché il reindirizzamento dei file verso e da una pipe denominata non funziona, ma il piping su cat funziona?


8

Questo è un semplice server echo in Unix, usando nc:

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

(basato su questo )

Come posso vedere, il flusso di dati funziona come segue:

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

Ed ecco la domanda: perché non funziona?

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

Si noterà che se si tenta di telnetper localhostil 4458si otterrà un "Connessione rifiutata" errore.


Non ho una risposta, ma spero che questo possa aiutare qualcuno più esperto di me. cat myfifo | nc -k -l 4458 > myfifofunziona anche. Se si utilizza un file di testo, file.txt in questo modo nc -k -l 4458 < file.txt > file.txtLa prima connessione si connetterà e si chiuderà (ha senso perché l'input è stato troncato e EOF chiude il socket), la seconda connessione diventerà un server di eco smemorato: farà eco ogni altra riga e salva le righe non copiate nel file di testo.
user1794469

Risposte:


9

Questo perché il comando netcat non è nemmeno ancora stato avviato! La shell quando si tenta di aprire il fifo per l'input si bloccherà. Provare

strace cat >fifo <fifo

e non vedrai nulla. Utilizzare invece, ad esempio,

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

che apre il fifo per leggere e scrivere come stdin, quindi lo duplica su stdout.


Tracciare il comando bash completo mostra che né l'apertura per la lettura né la scrittura restituiscono (fino a quando non viene eseguita l'apertura opposta):

$ 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: l'apertura di un FIFO per la lettura normalmente blocca fino a quando un altro processo apre lo stesso FIFO per la scrittura e viceversa.


1
Il blocco è documentato: tldp.org/LDP/lpg/node19.html
thrig

Perché la shell si blocca quando si utilizza "> fifo <fifo"? Sembrerebbe che lo apra per la scrittura e poi per la lettura. Quindi, poiché esiste già una maniglia per la scrittura aperta, non dovrebbe continuare normalmente?
Razvan,

@Razvan Ho aggiornato la risposta con la sequenza effettiva per i due ordini alternativi di open del fifo, e puoi vederlo aperto per scrivere o leggere entrambi i blocchi.
Meuh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.