为什么父母死亡会杀死孩子的过程

时间:2014-08-12 09:28:19

标签: c linux sockets

我在C中编写了一个tcp服务器应用程序。代码看起来像这样:

socket(...);
bind(...);
listen(...);

register_sigint_signal_handler(); // just calls exit(0) when ctrl-c is pressed

for (;;)
{
    accept(...);
    if (fork() == 0)
    {
        start_application();
        exit(0);
    }
    waitpid(child);
}

sigint处理程序只调用exit(0)。无论何时建立新的客户端连接,都会创建子进程来处理来自该连接的数据。我希望,当服务器(父进程)被杀死时,子进程应该仍然运行,但事实并非如此。有趣的是,当使用gdb运行时,孩子继续运行。

导致子进程被杀的原因是什么?我该怎么做才能确保子进程继续运行?

1 个答案:

答案 0 :(得分:2)

当您在终端中按Ctrl-C时,连接到终端的所有进程都会收到信号。由于父处理SIGINT并退出,并且子继承父处理程序,因此当您在终端中按Ctrl-C时都退出。

运行服务器时,通常建议调用setsiddaemon将进程从控制终端分离,以免意外的Ctrl-C杀死整个服务器服务器