它是如何做到的

它是如何做到的

如何內網將控制權轉移給服務,以下是我的理解

  • inetd 偵聽中提到的每個端口/etc/inetd.conf
  • 如果用戶端向 inetd 偵聽的連接埠之一發出請求,則 inetd 會將該請求的控制權轉移給服務,方法是將其旋轉為子進程,方法是查看/etc/inetd.conf
  • 它充當多路復用器。

我的疑問如下

  • 請求是如何切換到子程序(各自的服務守護程序)的?
  • inetd 已在該端口上建立連接,因此子進程無法再次使用該端口,直到 inetd 釋放該端口。如果 inetd 釋放該端口,則現有的客戶端連接將被刪除(如果我的理解錯誤,請糾正我)。

答案1

inetd偵聽端口,然後將其連接到將處理它的服務的 stdin、stdout 和 stderr。

它是如何做到的

  • accept連接後,它的其中一個上有一個套接字fd
  • 然後它將dup複製fdto 01、and 2
  • 那麼就會的fork。所有檔案描述符將保持開啟狀態,除非採取某些操作來關閉它們(因此 0、1 和 2 保持開啟狀態)。
  • 然後子進程將調用execfds 仍然保持開啟狀態。
  • 該服務現在正在運行,遠端客戶端連接到 stdin (0)、stdout (1) 和 stderr (2)。
  • 服務只需要知道客戶端位於這些文件描述符上,而不需要執行listen自己的操作。

(我做了一些搜索,但看不到inetd告訴服務程序它是由 調用的inetd。我希望有一個命令行參數。)

答案2

考慮這樣的行動:

[家長]

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

對於其他不應該被子進程繼承的描述符, close()或者之前將它們設為FD_CLOEXEC;after fork,父進程可以關閉這個 sfd

[孩子]

execve();繼承的已連接套接字描述符的副本,可用於客戶端 I/O

答案3

它被清楚地解釋在Que-Linux-Socket 程式設計在該部分下The Design Parameters of inetd Servers

相關內容