gpt4 book ai didi

linux - 防止 fork() 复制套接字

转载 作者:IT王子 更新时间:2023-10-29 00:31:19 25 4
gpt4 key购买 nike

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

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

关于linux - 防止 fork() 复制套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3179619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com