linux 子程序文件描述符继承问题

在Linux环境中,一个软件既要作为服务器又要作为客户端,处理与子进程及另一服务器的连接。遇到的问题是,子进程继承了不必要的文件描述符,导致网络连接异常。通过研究和实践,发现在fork子进程前关闭不必要的文件描述符是解决关键。文中提供了具体代码示例,演示如何避免子进程继承过多文件描述符,从而保证网络连接的正常建立。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在工作中遇到了一个设计,软件即做服务器,又做客户端,做客户端时跟另外一个服务器建立连接,做服务器时,是与自己启动的几个子进程程序建立连接。而system启动起来的子程序会继承父进程的所有文件描述符,包括套接字,故出现了意想不到的bug。

在网上查阅大量帖子之后,发现其中有一个帖子,与我遇到的问题相似,有兴趣的可以去看看。

fork的坑:文件描述符继承_fork设置是否继承fd_CoderAndClimber的博客-优快云博客

我的应用场景如上图,客户端A的命令通过服务端A的处理之后转发给客户端B,客户端B响应命令开启子进程。子进程会继承客户端B的所有文件描述符;

通过lsof -i:port 命令查看,可以发现子进程监听端口,子进程与子进程、客户端B、服务器A之间建立网络连接。在客户端A操作重启客户端B之后,你会发现,再也无法正确和子进程建立正确的网络连接,而各个子进程的例如心跳包、连接是正常的,不会触发连接状态变化或者网络重连。

尝试了上述博客的解决方法之后发现,还是会出同样的问题,子进程之间建立起来了连接。最终与同事讨论后得出方法,在启动子程序时,关闭父进程的所有不必要文件描述符ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值