进程从系统命令开始,C继承父fd

我有一个SIP服务器的示例应用程序监听tcp和udp端口5060.
代码的某个时候,我做一个系统(“pppd文件/ etc / ppp / myoptions&”);

之后,如果我做一个netstat -apn,它显示我的端口5060也为pppd打开!
有什么办法可以避免吗?这是Linux中系统功能的标准行为吗?

谢谢,
Elison

解决方法

是的,认情况下,当您分配进程(哪个系统)时,子进程继承所有父进程的文件描述符.如果孩子不需要这些描述符,它应该关闭它们.使用系统(或任何其他执行fork exec的方法)执行此操作的方法是将FD_CLOEXEC标志设置为不能由您的子进程使用的所有文件描述符.每当任何一个小孩执行其他程序时,这将导致它们自动关闭.

一般来说,任何时候,你的程序都会打开任何一段文件描述符,这个文件描述符会持续一段时间(例如你的例子中的一个监听套接字),不应该与孩子共享,你应该

fcntl(fd,F_SETFD,fcntl(fd,F_GETFD) | FD_CLOEXEC);

文件描述符上.

截至2016年修改POSIX.1,您可以在创建套接字时使用SOCK_CLOEXEC标志或“套接字”类型自动获取此行为:

listenfd = socket(AF_INET,SOCK_STREAM|SOCK_CLOEXEC,0);
bind(listenfd,...
listen(listemfd,...

即使某些其他同时运行的线程执行系统或fork exec调用,它将被正确关闭.幸运的是,这个标志已经在Linux和BSD unixes上支持了一段时间(但不幸的是OSX).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...