长调转语句——超时退出
#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;
}