我有以下情况(伪代码):
function f: pid = fork() if pid == 0: exec to another long-running executable (no communication needed to that process) else: return "something"
f
通过XmlRpc ++服务器公开。 当函数通过XML-RPC调用时,父进程在函数返回“something”后打印“done closing socket”。 但是,只要subprocess仍在运行,XML-RPC客户端就会挂起。 当我终止subprocess时,XML-RPC客户端正确地完成RPC调用。
在我看来,我有问题与fork()
复制套接字描述符的subprocess(父母称为closesocket
但子仍然拥有引用 – >连接仍然build立)。 我怎样才能绕过这个?
编辑:我已经阅读了FD_CLOEXEC
,但不能强制所有描述符closures在exec
?
不,您不能强制所有文件描述符在exec上关闭。 您将需要在fork()
之后遍历子节点中的所有不需要的文件描述符,然后关闭它们。 不幸的是,并不是一个简单的,可移植的方法来做到这一点 – 通常的做法是使用getrlimit()
来获取RLIMIT_NOFILE
的当前值,并从3循环到那个数字,尝试close()
每个候选人。
如果你很高兴能成为Linux系统,你可以通过阅读/proc/self/fd/
目录来确定打开的文件描述符并关闭它们(除了0,1和2之外),应该把它们放在一边或者重新打开到/dev/null
)。