我有以下情况(伪代码):
function f:
pid = fork()
if pid == 0:
exec to another long-running executable (no communication needed to that process)
else:
return "something"
f
暴露在XmlRpc++ http://sourceforge.net/projects/xmlrpcpp/服务器。当通过 XML-RPC 调用该函数时,父进程在函数返回“something”后打印“done opening socket”。但只要子进程仍在运行,XML-RPC 客户端就会挂起。当我终止子进程时,XML-RPC 客户端正确完成 RPC 调用。
在我看来,我遇到了问题fork()
将套接字描述符复制到子进程(父进程称为closesocket
但子进程仍然拥有引用 -> 连接仍然建立)。我怎样才能规避这个问题?
EDIT:我读到FD_CLOEXEC
已经,但我不能force所有要关闭的描述符exec
?
不,您不能强制在 exec 上关闭所有文件描述符。您需要在子级中循环所有不需要的文件描述符fork()
并关闭它们。不幸的是,没有一种简单、便携的方法可以做到这一点 - 通常的方法是使用getrlimit()
获取当前值RLIMIT_NOFILE
并从 3 循环到该数字,尝试close()
关于每个候选人。
如果您愿意只使用 Linux,您可以阅读/proc/self/fd/
目录来确定打开的文件描述符并关闭它们(0、1 和 2 除外 - 应将其保留或重新打开/dev/null
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)