Python 当父子侦听同一端口时会发生什么情况?

Python 当父子侦听同一端口时会发生什么情况?,python,sockets,networking,operating-system,fork,Python,Sockets,Networking,Operating System,Fork,我有一个父进程,它在启动时启动一个线程,该线程创建一个侦听端口X的TCP服务器实例。在此之后,父进程开始分叉子进程(只做很少的事情并退出)。请注意,这些子进程从父进程继承FD,因此最终侦听端口X 父程序有一个处理C++端口的请求,但子进程没有这样的处理程序(它是一个OS .ExcVE)- ED C++程序) 我知道子进程可以关闭所有FD,在这种情况下不会出现上述情况。端口X上的传入请求会发生什么情况?它是如何处理的 这是我到目前为止观察到的。。。 父对象中的tcp请求处理程序在收到请求时执行co

我有一个父进程,它在启动时启动一个线程,该线程创建一个侦听端口X的TCP服务器实例。在此之后,父进程开始分叉子进程(只做很少的事情并退出)。请注意,这些子进程从父进程继承FD,因此最终侦听端口X

父程序有一个处理C++端口的请求,但子进程没有这样的处理程序(它是一个OS .ExcVE)- 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

在操作系统级别,这不应该有任何问题。这基本上就是预分叉服务器的工作方式:

  • 在主线程中创建套接字
  • 将套接字绑定到一个地址
  • 调用listen()将套接字置于listen模式——此时,任何连接请求都将被操作系统接受并排队
  • 分叉一组子代,每个子代都继承开放式套接字
  • 然后子进程处理每个调用accept(),该调用将阻塞,直到有一个连接供它们处理
  • 如果一个子进程选择不在侦听套接字上调用accept()(您的执行进程不会这样做),那么该进程或仍在接受连接的进程就不会有任何问题

    我能看到的唯一的复杂之处是套接字不能被关闭——为了让操作系统真正关闭它,所有引用它的进程都必须对它调用close(),将其打开描述符计数降为零


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

    这与(非特定于python的)相同