代码之家  ›  专栏  ›  技术社区  ›  AndiDog

防止fork()复制套接字

  •  5
  • AndiDog  · 技术社区  · 14 年前

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

    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 但child仍拥有一个引用->连接仍然建立)。我怎么能绕开这个?

    编辑: 我读到有关 FD_CLOEXEC 已经有了,但我不能 所有要关闭的描述符 exec ?

    1 回复  |  直到 14 年前
        1
  •  5
  •   caf    14 年前

    不,不能在执行时强制关闭所有文件描述符。您需要循环子级中所有不需要的文件描述符, fork() 关闭它们。不幸的是,要做到这一点,没有一种简单、可移植的方法——通常的方法是使用 getrlimit() 获取的当前值 RLIMIT_NOFILE 然后从3循环到那个数字,尝试 close() 每个候选人。

    如果您愿意只使用Linux,可以阅读 /proc/self/fd/ 用于确定打开的文件描述符并将其关闭的目录(0、1和2除外-应单独保存或重新打开 /dev/null )