我在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运行时,孩子继续运行。
导致子进程被杀的原因是什么?我该怎么做才能确保子进程继续运行?
答案 0 :(得分:2)
当您在终端中按Ctrl-C时,连接到终端的所有进程都会收到信号。由于父处理SIGINT并退出,并且子继承父处理程序,因此当您在终端中按Ctrl-C时都退出。
运行服务器时,通常建议调用setsid
或daemon
将进程从控制终端分离,以免意外的Ctrl-C杀死整个服务器服务器