Was ist der Unterschied zwischen diesen vier Befehlen (FIFO, Prozessersetzung, Umleitung …)

Was ist der Unterschied zwischen diesen vier Befehlen (FIFO, Prozessersetzung, Umleitung …)

ncMein Ziel ist es, einen einfachen Echo-Server mit und einem einzelnen zu erstellen fifo. Ich suche nicht nach der besten Methode, sondern versuche lediglich, die Semantik der folgenden Befehle zu verstehen (wann findet die Fork statt, warum, was ändert sich, warum verhalten sich die Befehle unterschiedlich ...).

shIch verwende Bash, daher bin ich nicht sicher, ob alle Befehle mit POSIX oder zsh, ksh, ... funktionieren.

Hier sind die vier Befehle, die ich im Titel erwähne (vorausgesetzt, ich habe dies bereits getan mkfifo fifo):

cat fifo | nc -l localhost 8888 > fifo
exec 3<> fifo && nc -l localhost 8888 <&3 >&3 && exec 3>&-
nc -l localhost 8888 <(cat fifo) > fifo
nc -l localhost 8888 < fifo > fifo

Nun würde ich erwarten, dass die vier Befehle dasselbe tun, zumindest die letzten beiden.

  1. Der erste Befehl verhält sich wie erwartet, ein einfacher Echoserver, der heruntergefahren wird, wenn der Client die Verbindung schließt.
  2. Verhält sich wie 1.
  3. Ich kann eine Verbindung zum Server herstellen und Daten senden, aber ich erhalte nie etwas zurück. Wenn ich die Client-Verbindung schließe, wird der Server heruntergefahren.
  4. Es kann keine Verbindung zum Server hergestellt werden, der Server hört ewig zu.

Antwort1

Der Schlüssel hier ist, dass das Öffnen eines FIFO ein blockierender Vorgang ist. Es openwird nur zurückgegeben, wenn beide Enden verbunden sind, d. h. wenn der FIFO sowohl zum Lesen als auch zum Schreiben geöffnet ist.

Mann fifo(7)

Normally, opening the FIFO blocks until the other end is opened also.

Im ersten Fall verzweigt sich die Shell, um die Pipeline auszuführen, sodass das Öffnen des FIFO zum Lesen ( cat fifo) und das Öffnen des FIFO zum Schreiben ( > fifo) in getrennten Prozessen und somit unabhängig voneinander erfolgen.

Im 2. Fall 3<>fifoerfolgen das Öffnen zum Lesen und das Öffnen zum Schreiben () in einem einzigen Schritt.

Im dritten Fall <(cat fifo)wird es zu einem Dateinamen erweitert, z. B. /dev/fd/42. Es ist also so, als würden Sie ausführen nc -l localhost 8888 /dev/fd/42 > fifo. Sie benötigen ein zusätzliches Attribut, <damit es gleichwertig ist, z . B. nc -l localhost 8888 < <(cat fifo) > fifo.

Im vierten Fall versucht die Shell, den FIFO zum Lesen ( < fifo) und zum Schreiben ( > fifo) als Teil desselben Prozesses zu öffnen. Die Shell führt beides einzeln von links nach rechts aus. Sie versucht also, ihn fifozum Lesen zu öffnen, blockiert aber für immer, während sie darauf wartet, dass etwas fifozum Schreiben geöffnet wird. Ich denke, Sie werden feststellen, dass in diesem Fall ncnie damit begonnen wurde und der Port nie zum Abhören geöffnet wurde.

verwandte Informationen