如何内网将控制权转移给服务,以下是我的理解
- 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