【问题标题】:Inherit parent socket in fork() child在 fork() 子中继承父套接字
【发布时间】: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);

最好的解决方案是什么?为什么?

欢迎任何其他更好的解决方案。

【问题讨论】:

标签: c linux multithreading sockets fork


【解决方案1】:

如果你控制了所有的代码,这些都没有区别。

如果别人给你socket你不知道它是如何创建的,请使用第一个解决方案。

如果您编写一个模块,其他人向您发送一个套接字,并且您想将它传递给您无法控制但您怀疑fork()/exec() 的另一个模块,请使用第二个。

如果您是套接字的创建者并且需要将其传递给您怀疑为fork()/exec() 的另一个模块,请使用第三个。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2023-02-16
    • 2012-03-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多