如何內網將控制權轉移給服務,以下是我的理解
- inetd 偵聽中提到的每個端口
/etc/inetd.conf
- 如果用戶端向 inetd 偵聽的連接埠之一發出請求,則 inetd 會將該請求的控制權轉移給服務,方法是將其旋轉為子進程,方法是查看
/etc/inetd.conf
- 它充當多路復用器。
我的疑問如下
- 請求是如何切換到子程序(各自的服務守護程序)的?
- inetd 已在該端口上建立連接,因此子進程無法再次使用該端口,直到 inetd 釋放該端口。如果 inetd 釋放該端口,則現有的客戶端連接將被刪除(如果我的理解錯誤,請糾正我)。
答案1
inetd
偵聽端口,然後將其連接到將處理它的服務的 stdin、stdout 和 stderr。
它是如何做到的
accept
連接後,它的其中一個上有一個套接字fd
。- 然後它將
dup
複製fd
to0
、1
、and2
。 - 那麼就會的
fork
。所有檔案描述符將保持開啟狀態,除非採取某些操作來關閉它們(因此 0、1 和 2 保持開啟狀態)。 - 然後子進程將調用
exec
,fd
s 仍然保持開啟狀態。 - 該服務現在正在運行,遠端客戶端連接到 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