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

C 为什么SIGKILL不由我的信号处理程序处理,有时会导致帐户注销,c,ubuntu,process,kill,C,Ubuntu,Process,Kill,我编写以下代码的目的如下: 子进程将SIGKILL信号发送给父进程,然后父进程将使用处理程序处理该信号。处理程序只是增加计数器 int counter = 0; void handler(int sig) { counter++;

我编写以下代码的目的如下: 子进程将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);                                                                      
}      
显然,SIGKILL会杀死父进程。既然我的处理程序没有杀死父对象,为什么会发生这种情况


另一个不确定但概率极高的事件(~50%)发生在我的ubuntu 14.04 64位机器上。如果我执行此代码,我将自动从帐户注销。为什么会发生这种情况?

您是否阅读了本手册

第一:

signal()的行为在不同的UNIX版本中有所不同,在不同的Linux版本中历史上也有所不同。避免使用:改用sigaction(2)。请参阅下面的可移植性

第二:

不能捕获或忽略信号SIGKILL和SIGSTOP

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