最近在工作中遇到了一个设计,软件即做服务器,又做客户端,做客户端时跟另外一个服务器建立连接,做服务器时,是与自己启动的几个子进程程序建立连接。而system启动起来的子程序会继承父进程的所有文件描述符,包括套接字,故出现了意想不到的bug。
在网上查阅大量帖子之后,发现其中有一个帖子,与我遇到的问题相似,有兴趣的可以去看看。
fork的坑:文件描述符继承_fork设置是否继承fd_CoderAndClimber的博客-优快云博客
我的应用场景如上图,客户端A的命令通过服务端A的处理之后转发给客户端B,客户端B响应命令开启子进程。子进程会继承客户端B的所有文件描述符;
通过lsof -i:port 命令查看,可以发现子进程监听端口,子进程与子进程、客户端B、服务器A之间建立网络连接。在客户端A操作重启客户端B之后,你会发现,再也无法正确和子进程建立正确的网络连接,而各个子进程的例如心跳包、连接是正常的,不会触发连接状态变化或者网络重连。
尝试了上述博客的解决方法之后发现,还是会出同样的问题,子进程之间建立起来了连接。最终与同事讨论后得出方法,在启动子程序时,关闭父进程的所有不必要文件描述符ÿ