【问题标题】:Why SIGKILL is not handled by my signal handler and sometime leads to account logout为什么我的信号处理程序不处理 SIGKILL 并且有时会导致帐户注销
【发布时间】:2023-03-26 13:59:01
【问题描述】:

我出于以下目的编写了以下代码: 孩子向父母发送 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 位机器上发生的。如果我执行此代码,我将自动从帐户中注销。为什么会这样?

【问题讨论】:

    标签: c ubuntu process kill


    【解决方案1】:

    你看过signal()的说明书吗?

    第一:

    signal() 的行为因 UNIX 版本而异,并且在历史上因 Linux 的不同版本而异。避免使用它:使用 sigaction(2) 代替。请参阅下面的可移植性。

    第二:

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

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多