[英]longjmp,setjmp 's infinite loop
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
static jmp_buf env_alrm;
static void sig_alarm(int signo)
{
longjmp(env_alrm, 1);
}
int sleep2(unsigned int seconds)
{
if(signal(SIGALRM, sig_alarm)==SIG_ERR)
return seconds;
if(setjmp(env_alrm)==0) //when it is first called, return value is 0
{
alarm(seconds);
pause();
}
return (alarm(0))
}
在此代码上,我认为这正在造成无限循环。 我的想法是:
我们在主体中像sleep2(3)
一样调用sleep2()
函数,然后在调用pause()
之后3秒钟后将传递SIGALRM
。 因此,将调用信号处理程序sig_alarm()
。
并且,在调用longjmp()
,它将进入sleep2中的setjmp()
函数。 最后,在测试setjmp()
的返回值(在调用longjmp()
之后应为1)之后,它将执行return alarm(0)
。 因此,它将立即再次调用sig_alarm()
(因为再次发送了SIGALRM
),并且此循环将继续。
我想念什么?
alarm(0)
不传递任何警报事件。 它取消先前计划的警报,并返回直到此取消的警报(如果有)之前剩余的秒数。
代码的最后一行不会引起无限循环,因为它不会执行sig_alarm
。 它返回正常sleep2
时间剩余的sleep2
。 在您的小示例中,该值为零。 您的代码可能是大型软件的一部分,在该大型软件中,可能会在计时器到期之前执行longjmp
(和sleep2
的最后一行)。 在这种情况下, sleep2
将剩余的秒数返回到正常到期时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.