为什么SIGKILL不是由我的信号处理程序处理的,有时会导致帐户注销
问题描述:
我按照以下意图编写了以下代码: 子级向父级发送SIGKILL信号,然后父级会使用处理程序处理它。处理程序只是增加计数器。为什么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位机器上。如果我执行此代码,我将自动从帐户中注销。为什么会发生?
答
您是否阅读signal()
的手册?
第一:
信号的行为()跨越UNIX版本而变化,并且还跨越不同版本的Linux历史变化。避免使用它:改为使用sigaction(2)。见下面的可移植性。
二:
的信号SIGKILL和SIGSTOP不能被捕获或忽略。