【发布时间】: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 位机器上发生的。如果我执行此代码,我将自动从帐户中注销。为什么会这样?
【问题讨论】: