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


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

  • 相关阅读:
    Linux 第一个脚本程序
    Linux 8开启FTP功能服务
    PPT 倒计时时钟,用 GIF 动画实现,可直接使用 -- 附 Python 实现代码
    python flask 虚拟环境迁移
    GOLANG学习之路之二
    Golang学习之路之一
    vscode 调试flask项目 解决(socket.gaierror: [Errno 11001] getaddrinfo failed)
    windows下部署 flask (win10+flask+nginx)
    git入门
    配置maven的国内镜像
  • 原文地址:https://www.cnblogs.com/edan/p/8941370.html
Copyright © 2020-2023  润新知