我有一个父级,当它启动时,启动一个线程,创建一个侦听端口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
答案 0 :(得分:8)
在操作系统级别,这应该没有任何问题。这基本上就是预分叉服务器的工作方式:
如果一个孩子选择不在侦听套接字上调用accept(),(因为你的exec'ed进程不会),那么该进程或者仍然接受连接的进程不会有任何问题
我能看到的唯一复杂因素是套接字无法关闭 - 为了让操作系统实际关闭它,所有引用它的进程都必须调用它上面的close(),带来它打开描述符倒数到零。
在你的情况下,最好的情况是,如果这种行为干扰你的应用程序的其余部分,关闭子进程中的侦听套接字 - 在fork之后,但在你调用exec之前。