【发布时间】:2015-02-05 10:38:22
【问题描述】:
我正在开发一个在 linux 系统上运行的 C 应用程序(kernel 3.4.11)
在我的应用程序中,我在一个线程上打开一个服务器套接字。我正在打开一个fork(),在其中我在主线程中使用execvp() 执行一个shell 命令。
打开fork() 将继承子套接字文件描述符。根据网络上的许多主题,这可能会导致问题。在我的情况下,如果我关闭我的应用程序,我可以使用netstat 看到套接字已分配给另一个守护进程(另一个随机守护进程)。
其实这样的问题有很多解决方案:
1)关闭fork()子开头的socket:
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);
最好的解决方案是什么?为什么?
欢迎任何其他更好的解决方案。
【问题讨论】:
-
你从哪里得到 (3)?
-
#2 受制于竞争条件。另一个线程可以在 socket() 和 fcntl() 之间分叉/执行。
标签: c linux multithreading sockets fork