har*_*ish 1 python sockets networking operating-system fork
我有一个父它启动时,揭开序幕的是创建一个端口上侦听X.这之后TCP Server实例的一个线程,家长开始分叉关子进程(这做几件事情并退出).请注意,这些子进程从父级继承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
Run Code Online (Sandbox Code Playgroud)
在操作系统级别,这应该没有任何问题.这基本上是预分叉服务器的工作方式:
如果一个孩子选择不在侦听套接字上调用accept(),(因为你的执行过程不会),那么该过程或者仍然接受连接的人不应该有任何问题.
我能看到的唯一复杂因素是套接字无法关闭 - 为了让操作系统实际关闭它,所有引用它的进程都必须在其上调用close(),带来它的开放描述符数降到零.
在你的情况下,最好的情况是,如果这种行为干扰你的应用程序的其余部分,要关闭子进程中的侦听套接字 - 在fork之后,但在调用exec之前.