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 , telnet
zu localhost
auf 4458
Sie ein „Connection refused“ Fehler erhalten.
cat myfifo | nc -k -l 4458 > myfifo
funktioniert auch. Wenn Sie eine Textdatei verwenden, file.txt wienc -k -l 4458 < file.txt > file.txt
folgt. 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.Antworten:
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
und du wirst nichts sehen. Verwenden Sie stattdessen beispielsweise
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):
quelle