zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    Linux内核TSS的使用
    DPL, CPL及RPL之间的关系
    Linux内存管理(深入理解Linux内核)
    Windows下安装PIL进行图像处理
    内存Zone中的pageset成员分析
    导出符号的意义
    GDI及Windows的消息机制
    kmalloc vs vmalloc
    Linux Kernel Development有关内存管理
    STL sort
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284647.html
Copyright © 2011-2022 走看看