繁体   English   中英

longjmp,setjmp的无限循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM