Wie macht es das?

Wie macht es das?

Wie funktioniertinetdÜbertragen Sie die Kontrolle an den Dienst. Nachfolgend finden Sie mein Verständnis

  • inetd lauscht auf jedem Port, der in/etc/inetd.conf
  • Wenn ein Client eine Anfrage an einen der Ports stellt, die inetd abhört, überträgt inetd die Kontrolle über diese Anfrage an einen Dienst, indem es sie als untergeordneten Prozess auslagert./etc/inetd.conf
  • Es fungiert als Multiplexer.

Mein Zweifel ist unten

  • Wie wird die Anfrage an den Kindprozess (jeweils Service-Daemon) übergeben?
  • Es besteht bereits eine Verbindung über den Port durch inetd, daher kann der untergeordnete Prozess diesen Port nicht erneut verwenden, bis inetd den Port freigibt. Wenn inetd den Port freigibt, wird die bestehende Client-Verbindung getrennt (korrigieren Sie mich bitte, wenn ich das falsch verstanden habe).

Antwort1

inetdlauscht auf einem Port und verbindet ihn dann mit stdin, stdout und stderr des Dienstes, der ihn verarbeiten wird.

Wie macht es das?

  • Nach acceptdem Herstellen der Verbindung verfügt es über einen Socket an einem seiner fdEnden.
  • Anschließend werden dupdie fdin 0, 1, und reliert 2.
  • Dann wird es so sein fork. Alle Dateideskriptoren bleiben geöffnet, sofern sie nicht durch eine Aktion geschlossen werden (also bleiben 0, 1 und 2 geöffnet).
  • Der untergeordnete Prozess ruft dann auf exec, fds bleiben weiterhin geöffnet.
  • Der Dienst wird jetzt ausgeführt, wobei der Remote-Client mit stdin (0), stdout (1) und stderr (2) verbunden ist.
  • Der Dienst muss lediglich wissen, dass der Client diese Datei-Deskriptoren verwendet, und darf nicht listenselbst eine ausführen.

(Ich habe ein bisschen gesucht, kann inetddem Serviceprogramm aber nicht sagen, dass es von aufgerufen wurde inetd. Ich würde ein Befehlszeilenargument erwarten.)

Antwort2

Erwägen Sie Maßnahmen wie diese:

[Elternteil]

sfd = socket(), listen(), connect(), fork();

Für andere Deskriptoren, die nicht von untergeordneten Prozessen geerbt werden sollen close()oder die zuvor auf FD_CLOEXEC;nach gesetzt wurden fork, könnte der übergeordnete Prozess dieses SFD schließen.

[Kind]

execve();Kopie des verbundenen Socket-Deskriptors übernommen, kann für Client-E/A verwendet werden

Antwort3

Es ist gut erklärt inQue-Linux-Socket-Programmierungunter dem AbschnittThe Design Parameters of inetd Servers

verwandte Informationen