我用 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 时,两者都会退出。
运行服务器时,通常建议调用 setsid
或 daemon
将进程与控制终端分离,这样意外的 Ctrl-C 就不会发生不要杀死整个服务器。
关于c - 为什么父进程死亡会杀死子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25260757/