我正在开发一个运行在linux系统上的C应用程序( 内核3.4.11 )
在我的应用程序中,我打开一个线程上的服务器套接字。 我打开一个fork()
,我在主线程中用execvp()
执行shell命令。
打开fork()
将inheritance子项中的套接字文件描述符。 这可能会导致网上很多主题的问题。 在我的情况如果我closures我的应用程序,我可以看到与netstat
套接字分配给另一个守护进程(另一个随机守护进程)。
事实上,对于这样的问题有很多解决scheme:
1)closuresfork()
子开头的套接字:
if ((pid = fork()) == -1) return -1; if (pid == 0) { /* child */ close(socket_desc);
2)打开父级套接字时使用fcntl()
和FD_CLOEXEC
socket_desc = socket(AF_INET , SOCK_STREAM , 0); fcntl(socket_desc, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
3)在socket()
函数中使用O_CLOEXEC
:
socket_desc = socket(AF_INET , SOCK_STREAM|O_CLOEXEC , 0);
什么是最好的解决scheme? 为什么?
欢迎任何其他更好的解决scheme。
如果你控制所有的代码,这些都没有区别。
使用第一种解决方案,如果别人给你一个socket
你不知道它是如何创建的。
使用第二种方法,如果你写了一个模块,而其他人向你传送一个套接字,并且你想把它传递给另一个你不能控制的模块,但是你怀疑fork()/exec()
。
使用第三个,如果你是套接字的创建者,并且需要将它传递给你怀疑fork()/exec()
另一个模块。