当亲子在同一个端口上听时会发生什么?

时间:2012-02-03 18:06:55

标签: python sockets networking operating-system fork

我有一个父级,当它启动时,启动一个线程,创建一个侦听端口X的TCP服务器实例。此后,父级开始分离子进程(执行少量操作并退出)。请注意,这些子进程从父进程继承fds,因此最终会侦听端口X.

父程序有一个处理程序,用于处理端口X上的请求,但子进程没有这样的处理程序(它是一个os.execv() - ed C ++程序)

我知道子进程可以关闭所有fds,在这种情况下不会出现上述情况。端口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

1 个答案:

答案 0 :(得分:8)

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

  1. 在主线程中创建套接字
  2. 将套接字绑定到地址
  3. 调用listen()将套接字置于侦听模式 - 此时,任何连接请求都将被操作系统接受并排队
  4. 分叉一堆孩子,每个孩子都继承了开放的插座
  5. 然后,子进程处理每个调用accept(),这将阻塞,直到有一个连接供他们处理。
  6. 如果一个孩子选择不在侦听套接字上调用accept(),(因为你的exec'ed进程不会),那么该进程或者仍然接受连接的进程不会有任何问题

    我能看到的唯一复杂因素是套接字无法关闭 - 为了让操作系统实际关闭它,所有引用它的进程都必须调用它上面的close(),带来它打开描述符倒数到零。

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