• APUE学习笔记——10.15 sigsetjmp和siglongjmp


    转载自:sigsetjmp使用方法

    侵犯您的权益,请联系:windeal12@qq.com

     

    sigsetjmp使用方法

    分类: c/c++ linux 1252人阅读 评论(0) 收藏 举报
    相关函数:longjmp, siglongjmp, setjmp 
    表头文件:#include <setjmp.h> 
    函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 
    函数说明:sigsetjmp()会保存眼下堆栈环境,然后将眼下的地址作一个记号,
    而在程序其它地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序的运行。 
    參数env为用来保存眼下堆栈环境。一般声明为全局变量 
    參数savesigs若为非0则代表搁置的信号集合也会一块保存 
    当sigsetjmp()返回0时代表已经做好记号上,若返回非0则代表由siglongjmp()跳转回来。

     
    返回:若直接调用则为0,若从siglongjmp调用返回则为非0

    实例:

    1. #include <stdio.h>  
    2. #include <signal.h>  
    3. #include <setjmp.h>  
    4. #include <unistd.h>  
    5. #include <sys/time.h>  
    6.   
    7. sigjmp_buf jmp_env;  
    8.   
    9. static void connect_alarm(int)  
    10. {  
    11.     siglongjmp(jmp_env, 1);  
    12. }  
    13.   
    14. int main()  
    15. {  
    16.     // 当超时时间sec_timeout大于等于执行时间run_time时会跳过printf("running... ");  
    17.     int sec_timeout = 3;  
    18.     int run_time = 2;  
    19.   
    20.     printf("timeout = %d, run time = %d ", sec_timeout, run_time);  
    21.     if (sec_timeout)  
    22.     {  
    23.         // 超过用alarm函数设置的时间时产生此信号。调用connect_alarm函数  
    24.         signal(SIGALRM, connect_alarm);  
    25.         alarm(sec_timeout);  
    26.         printf("set timeout ");  
    27.         if (sigsetjmp(jmp_env, 1))  
    28.         {  
    29.             printf("timeout ");  
    30.             goto out;  
    31.         }  
    32.     }  
    33.   
    34.     sleep(run_time);  
    35.     printf("running... ");  
    36.   
    37. out:  
    38.     if (sec_timeout)  
    39.     {  
    40.         // 取消先前设置的闹钟  
    41.         alarm(0);  
    42.         printf("cancel timeout ");  
    43.     }  
    44.   
    45.     return 0;  
    46. }  

    程序执行:
    当ec_timeout = 3, run_time = 2时:
    timeout = 3, run_time = 2
    set timeout
    running...
    cancel timeout


    当ec_timeout = 3, run_time = 4时:
    timeout = 3, run_time = 4
    set timeout
    timeout
    cancel timeout



  • 相关阅读:
    使用命令安装laravel 项目
    laravel如何输出最后一条执行的SQL
    Laravel5.4 队列简单配置与使用
    PHP使用RabbitMQ实例
    初识RabbitMQ,附RabbitMQ+PHP演示实例
    Laravel 5.3 单用户登录的简单实现
    redis+thinkphp5的注册、登陆、关注基础例子
    Laravel 5.3 单用户登录的简单实现
    php面试题汇总
    (转)php读取文件使用redis的pipeline导入大批量数据
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5177235.html
Copyright © 2020-2023  润新知