gpt4 book ai didi

c - 为什么信号暂停会导致程序永远休眠?

转载 作者:太空狗 更新时间:2023-10-29 15:40:04 24 4
gpt4 key购买 nike

APUE 书上说:如果信号发生在 sig_int_flag 测试之后但在调用 pause 之前,进程可能会永远休眠。

我不知道为什么,有人能告诉我吗?非常感谢。

int sig_int();                 /* my signal handling function */
int sig_int_flag; /* set nonzero when signal occurs */

int main() {
signal(SIGINT, sig_int) /* establish handler */
.
.
.
while (sig_int_flag == 0)
pause(); /* go to sleep, waiting for signal */
}

int sig_int() {
signal(SIGINT, sig_int); /* reestablish handler for next time */
sig_int_flag = 1; /* set flag for main loop to examine */
}

最佳答案

如果在您描述的准确时间发出中断信号:

  • 标志被检查为false:进入循环
  • 信号自行重置,将标志设置为 1,但为时已晚(测试已完成)
  • 由于已经进入循环,调用pause()程序等待

也就是说,如果再次触发 CTRL+C/SIGINT,您可以退出循环,所以这并不重要,因为可以手动发出该信号。

如果你想检查那个行为,我建议你添加一个 sleep 语句:

while (sig_int_flag == 0)
{
printf("Hit CTRL+C in the next 10 seconds to trigger the bug\n");
sleep(10);
pause(); /* go to sleep, waiting for signal */
}

解决方法是删除 pause() 语句并将其替换为轮询循环:

while (sig_int_flag == 0)
{
sleep(1);
}

如果 SIGINT 出现在循环中的任何地方,包括 whilesleep 之间,那么可能发生的更糟糕的事情是程序在注意到之前等待 1 秒标志被设置,然后它退出循环,另一种更合理的情况是 sleep 调用被中断,循环立即退出,所以当信号被设置时,几乎没有如果我们只期望 SIGINT,那与 pause 调用之间的明显区别。

关于c - 为什么信号暂停会导致程序永远休眠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319902/

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