linux – 防止fork()复制套接字
发布时间:2020-12-14 00:59:23 所属栏目:Linux 来源:网络整理
导读:我有以下情况(伪代码): 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调用该函数时,父进程在函数返回“som
我有以下情况(伪代码):
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上关闭? 解决方法
不,你不能强制所有文件描述符在exec上关闭.您需要在fork()之后循环遍历子节点中的所有不需要的文件描述符并关闭它们.不幸的是,没有一种简单,可移植的方法 – 通常的方法是使用getrlimit()来获取RLIMIT_NOFILE的当前值并从3循环到该数字,对每个候选者尝试close().
如果您很高兴只使用Linux,则可以阅读/ proc / self / fd /目录以确定打开的文件描述符并关闭它们(0,1和2除外 – 它们应该单独保留或重新打开到/ dev /空值). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |