在fork()子项中inheritance父套接字

我正在开发一个运行在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()另一个模块。