• 长调转语句——超时退出


    #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;
    }

  • 相关阅读:
    miniport hook ethFilterDprIndicateReceivePacket 接收拦截时包处理问题
    XRename(文件文件夹超级重命名工具)简介
    正则表达式测试工具
    很好看的表格样式
    FillForms 1.2.9 preliminarily reviewed
    CSDN分页ID提取工具(vb编写)
    html表格样式等整理
    备忘录
    巧用正则巅峰采集黄金白银大盘价信息
    2011年个人奋斗目标
  • 原文地址:https://www.cnblogs.com/edan/p/8941370.html
Copyright © 2020-2023  润新知