gpt4 book ai didi

c - 使用 kill 函数的递归信号调用

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:12 26 4
gpt4 key购买 nike

我现在正在学习计算机系统中的信号,但遇到了一个问题。下面给出了代码;

int i = 0;
void handler(int s) {
if(!i) kill(getpid(), SIGINT);
i++;
}

int main() {
signal(SIGINT, handler);
kill(getpid(), SIGINT);
printf("%d\n", i);
return 0;
}

解决方案说可能的输出应该是 0、1 或 2。我知道这些是可能的,但为什么不是 3、4 或其他?

比如我们在main函数中发送SIGINT。处理程序获取 SIGINT 信号,并在 SIGINT 为零时发送它。在继续执行递增代码之前,处理程序可能能够监听 SIGINT 信号并再次发送 SIGINT 信号,因为它在递增代码(i = 0)之前执行 - 再次循环 - 它可能会打印出 3, 4、5,甚至更大的数字。

最佳答案

从历史上看,许多关于信号如何工作的细节都发生了变化。例如,在最早的变体中,当处理程序被调用时,信号的处理恢复到默认状态,并且处理程序必须重新建立自己。在这种情况下,从处理程序发送信号会终止进程。

目前,通常情况是当为特定信号调用处理程序时,该信号被阻止。这意味着处理程序不会立即被调用,但会在信号解除阻塞时被调用。由于没有内存发送信号的频率,因此其中一些可能会“丢失”。

参见 POSIX <signal.h> , Signal Concepts , signal() sigaction() .

关于c - 使用 kill 函数的递归信号调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30848300/

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