为什么我的信号处理程序不处理SIGKILL,有时会导致帐户注销

时间:2017-06-04 02:39:10

标签: c ubuntu process kill

我写了以下代码,意图如下: 孩子将SIGKILL信号发送给父母,然后父母将使用处理程序处理它。处理程序只是递增计数器。

int counter = 0;                                                                

void handler(int sig) {                                                         
  counter++;                                                                    
  sleep(1); /* Do some work in the handler */                                   
  return;                                                                       
}                                                                               

int main() {                                                                    
  int i;                                                                        

  //signal(SIGUSR2, handler);                                                   
  signal(SIGKILL, handler);                                                     

  if (fork() == 0) {  /* Child */                                               
    for (i = 0; i < 5; i++) {                                                   
      //kill(getppid(), SIGUSR2);                                               
      kill(getppid(), SIGKILL);                                                 
      printf("sent SIGKILL to parent %d\n", getppid());                         
    }                                                                           
    exit(0);                                                                    
  }                                                                             

  wait(NULL);                                                                   
  printf("counter=%d\n", counter);                                              
  exit(0);                                                                      
}      

然而,我得到的第一种输出是:

sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
sent SIGKILL to parent 8371
Killed

显然,SIGKILL会杀死父进程。为什么会发生这种情况,因为我的处理程序没有杀死父级?

另一个非确定性但非常高概率的事件(~50%)是我的ubuntu 14.04 64位机器上的事件。如果我执行此代码,我将自动从帐户注销。为什么会这样?

1 个答案:

答案 0 :(得分:0)

您是否阅读了signal()的手册?

首先:

  

signal()的行为在UNIX版本中各不相同,并且在不同版本的Linux上也有不同的历史变化。避免使用:改为使用sigaction(2)。请参阅下面的便携性。

第二

  

无法捕获或忽略信号SIGKILL和SIGSTOP。