长调转语句——超时退出

#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\n",buf);

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


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

posted @ 2018-04-25 11:17  edan  阅读(262)  评论(0编辑  收藏  举报