c - 为什么父进程死亡会杀死子进程

标签 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 运行时,子进程继续运行。

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

最佳答案

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

运行服务器时,通常建议调用 setsiddaemon 将进程与控制终端分离,这样意外的 Ctrl-C 就不会发生不要杀死整个服务器。

关于c - 为什么父进程死亡会杀死子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25260757/

相关文章:

csv行解析,在末尾打印额外的行

python - 如何获取分隔符出现的合并计数

c# - 如何使用蓝牙套接字从游戏 Controller 接收按钮事件?

c - 我一次可以在 TCP 套接字上写入多少字节?

node.js - Nodejs 通过套接字作为请求/响应服务器的客户端

c - 寻找一种更好的方法来移动 C 中的字符数组

c - 循环遍历并将数据分配给结构成员的宏错误地将结构成员识别为指针

c - C 中的正则表达式匹配和打印

linux - CGI 环境,读取最大大小是固定的?

linux - 监控/etc/passwd文件