gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:44:51 25 4
gpt4 key购买 nike

我写了下面的代码,目的如下:子进程向父进程发送 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()的手册?

第一:

The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. See Portability below.

第二:

The signals SIGKILL and SIGSTOP cannot be caught or ignored.

关于c - 为什么我的信号处理程序不处理 SIGKILL,有时会导致帐户注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com