Warum wird die Datei nicht zu und von einer Named-Pipe-Funktion umgeleitet, die Piping-Funktion jedoch an Cat?


8

Dies ist ein einfacher Echoserver unter Unix, der nc verwendet:

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

(basierend darauf )

Wie ich sehen kann, funktioniert der Datenfluss wie folgt:

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

Und hier ist die Frage: Warum funktioniert das nicht?

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

Sie werden feststellen , dass , wenn Sie versuchen , telnetzu localhostauf 4458Sie ein „Connection refused“ Fehler erhalten.


Ich habe keine Antwort, aber hoffentlich hilft dies jemandem, der besser informiert ist als ich. cat myfifo | nc -k -l 4458 > myfifofunktioniert auch. Wenn Sie eine Textdatei verwenden, file.txt wie nc -k -l 4458 < file.txt > file.txtfolgt. Die erste Verbindung wird hergestellt und geschlossen (sinnvoll, da die Eingabe abgeschnitten wurde und EOF den Socket schließt). Die zweite Verbindung wird zu einem vergesslichen Echoserver: Sie gibt jede zweite Zeile wieder und speichern Sie die nicht aktivierten Zeilen in der Textdatei.
— user1794469

Antworten:


9

Dies liegt daran, dass der Befehl netcat noch nicht einmal gestartet wurde! Die Shell wird blockiert, wenn versucht wird, das FIFO für die Eingabe zu öffnen. Versuchen

strace cat >fifo <fifo

und du wirst nichts sehen. Verwenden Sie stattdessen beispielsweise

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

Dadurch wird das Fifo zum Lesen und Schreiben als stdin geöffnet und anschließend auf stdout kopiert.


Das Verfolgen des vollständigen Bash-Befehls zeigt, dass weder das Öffnen zum Lesen noch zum Schreiben zurückgegeben wird (bis das entgegengesetzte Öffnen ausgeführt wird):

$ 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: Das Öffnen eines FIFO zum Lesen blockiert normalerweise, bis ein anderer Prozess das gleiche FIFO zum Schreiben öffnet, und umgekehrt.


1
Die Blockierung ist dokumentiert: tldp.org/LDP/lpg/node19.html
— Thrig

Warum blockiert die Shell bei Verwendung von "> fifo <fifo"? Es scheint, dass es es zum Schreiben und dann zum Lesen öffnet. Sollte es nicht normal weitergehen, da bereits ein Handle zum Schreiben geöffnet ist?
— Razvan

@Razvan Ich habe die Antwort mit der tatsächlichen Strace für die zwei alternativen Öffnungsreihenfolgen des Fifo aktualisiert, und Sie können sehen, dass beide Blöcke zum Schreiben oder Lesen geöffnet sind.
— Meuh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.