linux子进程或者popen、exec启动的程序都会继承fd

比如主进程调用了另一个程序,结果主程序结束后,这个被调用程序竟然继承了所有的fd包括监听端口,有时候阻塞运行时间比较长,会导致监听端口收不到报文。后来实验建立子进程去启动程序,写个脚本去启动程序,情况是一样的。写个小程序再去启动脚本,也一样。

查了下文档,使用fcloseall来关闭fd,结果发现这个函数没用,别的系统没有试验,至少在centos6.3和redhat5.7都不行。

最后直接在子进程里面从3到1000的fd全部close,然后再调用其他程序 ,总算ok了。