它是如何做到的

它是如何做到的

如何内网将控制权转移给服务,以下是我的理解

  • 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

相关内容