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.

Razvan
quelle
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.

meuh
quelle
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