长调转语句——超时退出

#include <setjmp.h >

//注:长跳转语句只能从栈上往下跳,不能从下往上跳。

用途:可以用于超时退出机制

1.setjmp(jmp_buf   env)  //记录调转点env(最好设置成全局变量)

 sigsetjmp(sigjmp_buf  env,  int savesigs) //将savesigs设置成为非0的数,则保存当前进程信号屏蔽字,跳转回来时恢复;

  setjmp(env)=======sigsetjmp(env,0)//等价

2   longjmp(jmp_buf   env,  int val) //长调转语句,调转返回时不会解信号屏蔽字

   env:跳转到该跳转点,类似于goto语句的标签,val:为跳转带回的数值,可以是任意的数值,标识是有哪个函数跳转回来的。

  siglongjmp(jmp_buf   env,int val)//长跳转语句,跳转返回时解除信号屏蔽字,参数同上。

代码示例:

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

static jmp_buf  env;

void sigfunc(int signo)
{
    if(signo==SIGALRM)
    {
        siglongjmp(env,100);
    }
}

int main(void)
{
     char buf[128]={0};


     if(sigsetjmp(env,1)==0)//设置跳转点成功则返回0
     {
        signal(SIGALRM,sigfunc);   //设置信号函数行为
        alarm(5);     //启动闹钟5s
        printf("input you pas in 5s:");
        fgets(buf,128,stdin);
        printf("pas:%s ",buf);

        alarm(0);
        signal(SIGALRM,SIG_DFL);
     }
     else
     {
         printf("sorry,time out! ");
         signal(SIGALRM,SIG_DFL);
     }


     getchar();
     printf("do over ");
     return 0;
}

原文地址:https://www.cnblogs.com/edan/p/8941370.html