不要将CTRL + C上的SIGINT发送到子进程,但不要忽略信号本身

时间:2018-01-15 14:59:28

标签: c signals child-process

我正在尝试编写一个Task控制程序,非常像Supervisor。

我从配置文件中运行一些程序并让它们在后台运行,而在主进程中我读取并执行其他命令。

fork()之前,在主要流程中我打电话:

sigaction(SIGINT, &the_handler, NULL);

the_handler存储简单打印函数的引用。

当按下CTRL + C时,子进程也会被中断(我不想要)。 我可以在子进程fork之后运行signal(SIGINT, SIG_IGN);来忽略它,但我仍然希望能够在bash中运行这个命令:$ kill -n 2 <child_pid>,这意味着,我不想忽略它,对吗?

那么,如何忽略从CTRL + C到子进程的SIGINT,但仍然能够以其他方式接收信号?或者我错过了什么?

1 个答案:

答案 0 :(得分:3)

这样做的传统方法是分叉两次。盛大的父母要求孩子,然后等待他们。每个孩子然后立即分叉并离开。因为他们的父母已经离开,所以大孩子们成了pid 1的父母。因此发送给父母的信号不会传播给前孙子女。

有关详细信息,请参阅此答案

https://stackoverflow.com/a/26418006/169346

ETA:您需要在两个分支之间调用setsid(),否则孙子仍然与祖父母在同一个process group,并且仍然会收到祖父母收到的信号。