加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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 /空值).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读