防止fork()复制套接字

时间:2010-07-05 12:59:24

标签: linux sockets 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”。但只要子进程仍在运行,XML-RPC客户端就会挂起。当我终止子进程时,XML-RPC客户端正确完成RPC调用。

在我看来,我遇到问题fork()将套接字描述符复制到子进程(父进程名为closesocket,但是子进程仍然拥有引用 - >连接仍然建立)。我怎么能绕过这个?

编辑:我已经阅读了FD_CLOEXEC,但我不能强制所有描述符都在exec关闭?

1 个答案:

答案 0 :(得分:5)

不,你不能强制在exec上关闭所有文件描述符。您需要在fork()之后循环遍历子项中的所有不需要的文件描述符并关闭它们。不幸的是,没有一种简单,可移植的方法 - 通常的方法是使用getrlimit()来获取RLIMIT_NOFILE的当前值并从3循环到该数字,尝试{{1每个候选人。

如果您乐意只使用Linux,则可以阅读close()目录以确定打开的文件描述符并关闭它们(0,1和2除外 - 它们应单独保留或重新打开到{ {1}})。