我写了以下代码,意图如下: 孩子将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位机器上的事件。如果我执行此代码,我将自动从帐户注销。为什么会这样?
答案 0 :(得分:0)
您是否阅读了signal()
的手册?
首先:
signal()的行为在UNIX版本中各不相同,并且在不同版本的Linux上也有不同的历史变化。避免使用:改为使用sigaction(2)。请参阅下面的便携性。
第二
无法捕获或忽略信号SIGKILL和SIGSTOP。