我有一个父进程,它在启动时启动一个线程,该线程创建一个监听端口 X 的 TCP 服务器实例。在此之后,父进程开始 fork 子进程(它只做一些事情并退出)。请注意,这些子进程从父进程继承 fds,因此最终监听端口 X。
父程序有一个用于处理来自端口 X 的请求的处理程序,但子进程没有这样的处理程序(它是一个 os.execv()-ed C++ 程序)
我知道子进程可以关闭所有的fd,这样就不会出现上面的情况了。端口 X 上的传入请求会发生什么情况?它是如何处理的?
这是我目前观察到的... 父类中的 tcp 请求处理程序在收到请求时执行 commands.getstatusoutput(..) 。大多数时候,它的行为符合预期(或我预期的方式) - 执行上述命令没有任何错误......但偶尔我会得到
File "/home/y/lib/python2.7/commands.py", line 61, in getstatusoutput
sts = pipe.close()
IOError: [Errno 10] No child processes
最佳答案
在操作系统级别,这应该没有任何问题。这基本上是预 fork 服务器的工作方式:
- 在主线程中创建套接字
- 将套接字绑定(bind)到一个地址
- 调用 listen() 将套接字置于监听模式——此时,任何连接请求都将被操作系统接受并排队
- fork 一堆 child ,每个 child 都继承打开的套接字
- 然后子进程处理每个调用 accept(),它会阻塞,直到有一个连接供它们处理。
如果 child 选择不在监听套接字上调用 accept(),(因为您的执行过程不会)那么该过程或仍在接受连接的过程应该没有任何问题.
我能看到的唯一复杂情况是无法关闭套接字——为了让操作系统真正关闭它,所有引用它的进程都必须调用它的 close(),将其打开描述符倒数到零。
在您的情况下,如果该行为干扰您的应用程序的其余部分,最好关闭子进程中的监听套接字 - 在您 fork 之后,但在您调用 exec 之前。
关于python - 当父子监听同一个端口时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133337/