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

标签 python sockets networking operating-system fork

我有一个父进程,它在启动时启动一个线程,该线程创建一个监听端口 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 之前。

关于python - 当父子监听同一个端口时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133337/

相关文章:

python - Pandas:使用 np.where() 删除值小于今天的行?

c# - 客户端服务器身份验证

java - 从Android手机发送数据到java服务器

python - 在 Python 中访问 R 用户定义的函数

带有元类的 Python 工厂模式实现

c++ - 处理 7000 多个客户? -多线程(TCP,高流量)

c - 使用数据包 MMAP 过滤数据包?

使用阻塞 I/O 的 Java 线程池服务器

python - 使用 lambda 深复制索引整数

node.js - 如何在测试过程中手动触发net.socket错误事件