Skip to main content
 首页 » 编程设计

python之当父子监听同一个端口时会发生什么

2025年05月04日11qlqwjy

我有一个父进程,它在启动时启动一个线程,该线程创建一个监听端口 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 服务器的工作方式:

  1. 在主线程中创建套接字
  2. 将套接字绑定(bind)到一个地址
  3. 调用 listen() 将套接字置于监听模式——此时,任何连接请求都将被操作系统接受并排队
  4. fork 一堆 child ,每个 child 都继承打开的套接字
  5. 然后子进程处理每个调用 accept(),它会阻塞,直到有一个连接供它们处理。

如果 child 选择不在监听套接字上调用 accept(),(因为您的执行过程不会)那么该过程或仍在接受连接的过程应该没有任何问题.

我能看到的唯一复杂情况是无法关闭套接字——为了让操作系统真正关闭它,所有引用它的进程都必须调用它的 close(),将其打开描述符倒数到零。

在您的情况下,如果该行为干扰您的应用程序的其余部分,最好关闭子进程中的监听套接字 - 在您 fork 之后,但在您调用 exec 之前。