我有以下情况(伪代码):
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”。但只要子进程仍在运行,XML-RPC客户端就会挂起。当我终止子进程时,XML-RPC客户端正确完成RPC调用。
在我看来,我遇到问题fork()
将套接字描述符复制到子进程(父进程名为closesocket
,但是子进程仍然拥有引用 - >连接仍然建立)。我怎么能绕过这个?
编辑:我已经阅读了FD_CLOEXEC
,但我不能强制所有描述符都在exec
关闭?
答案 0 :(得分:5)
不,你不能强制在exec上关闭所有文件描述符。您需要在fork()
之后循环遍历子项中的所有不需要的文件描述符并关闭它们。不幸的是,没有一种简单,可移植的方法 - 通常的方法是使用getrlimit()
来获取RLIMIT_NOFILE
的当前值并从3循环到该数字,尝试{{1每个候选人。
如果您乐意只使用Linux,则可以阅读close()
目录以确定打开的文件描述符并关闭它们(0,1和2除外 - 它们应单独保留或重新打开到{ {1}})。