防止fork()复制套接字

我有以下情况(伪代码):

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 )。