【问题标题】:Stop child from reciving SIGINT from parent proccess阻止子进程从父进程接收 SIGINT
【发布时间】:2016-03-22 13:28:12
【问题描述】:

如果父进程收到 ctrl-C 信号,我一直试图阻止我的父线程杀死子进程。我已经没有想法了。

父进程已经捕获 SIGINT,所以我想要和现在孩子死的一样。

  int main() {
       pid_t pid;

       pid = fork();

       if(pid > 0) {
          /*Parent proccess*/
          [...other code...]
       } else {
          /*Child proccess*/

           signal(SIGINT, SIG_IGN);     //does not work
           sigaction(SIGINT, &action, 0);  //does not work either
           [...other code...]
       }

  }

想法?

【问题讨论】:

  • 子进程杀死它的信号是什么?
  • Linux daemonize的可能重复
  • 通常不会,但是 ctrl+c 将 sigint 发送到整个前台进程组,而不仅仅是父进程。 OP 可以尝试使用 setsid() 而不是尝试捕获信号。
  • 你会在 fork() 之后偶然执行 exec*() 吗?这会将所有信号处理程序重置为默认值
  • 文件句柄、环境变量和进程组是内核属性。信号处理程序是用户空间属性。没有任何用户空间能够在 exec 中幸存。

标签: c multithreading


【解决方案1】:

SIGINT 被发送到整个进程组。尝试在子进程中使用setpgrp(); 将其放入不同的进程组。

【讨论】: