gpt4 book ai didi

c - 为什么 SIGALRM 第二次不工作?

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:07 25 4
gpt4 key购买 nike

#include<stdio.h>
#include<setjmp.h>
#include<signal.h>

jmp_buf env;

void alarmHandler()
{
printf("\n in alarm Handle");

longjmp(env,1);
}



int main()
{
signal(SIGALRM,alarmHandler);

alarm(2);

for(;;)
{
printf("\nhello");
sleep(1);

if(setjmp(env))
{

printf("\n inside if");
signal(SIGALRM,alarmHandler);
alarm(2);
}

}


return 0;

}

开始时,主动监测信号,然后主动报警 2 秒(倒计时)。在 for 循环中,每次都会保存 setjmp(env) 直到时间结束 setjmp(env) 将使用 longjmp()。由于 setjmp() 如果从 longjmp() 调用默认返回 0,则第二个 arg 值是该值返回值。

最佳答案

longjmp 函数不被认为是调用信号处理程序的安全函数。

通过这样的跳转,您实际上永远不会离开信号处理程序,进程的上下文仍将是信号处理程序的上下文。那么当我们还没有离开第一个信号处理程序时,如何调用另一个信号处理程序呢?这就是为什么你不应该做你所做的事情。

而是在信号处理程序中设置一个标志,然后在循环中轮询该标志。然后从信号处理程序正常返回,让进程正常进行。

关于c - 为什么 SIGALRM 第二次不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38842951/

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