Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1056498
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 15:55:50

sigsetjmp.c文件

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <setjmp.h>
  3. #include <stdlib.h>
  4. #include <stdlib.h>
  5. #include <signal.h>

  6. static jmp_buf env_alrm;

  7. void alarm_fun()
  8. {
  9.     printf("time out/n");
  10.     siglongjmp(env_alrm,1);
  11. }

  12. int test_alrm()
  13. {
  14.     int test_value = 0;
  15.     signal(SIGALRM,alarm_fun);
  16.     if ( sigsetjmp(env_alrm, 1) != 0 )
  17.      {
  18.      alarm( 0 );
  19.      signal( SIGALRM, SIG_IGN );
  20.      return -1; /* timeout */
  21.      }
  22.     alarm(5);//5 sec;
  23.     sleep(10);//改变这里看效果
  24.     alarm(0);
  25.     signal( SIGALRM, SIG_IGN );//忽略信号
  26.     return 1;
  27. }

  28. int main()
  29. {
  30.     printf("%d",test_alrm());
  31.     return 0;
  32. }
sigsetjmp2.c文件

点击(此处)折叠或打开

  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 alarm_fun(int signo);
  10.   
  11. int main(int argc, char * * argv)
  12. {
  13.     /*当超时时间sec_timeout大于等于运行时间run_time时会跳过printf("running...\n"); */
  14.     int sec_timeout = 3;
  15.     int run_time = 5;
  16.     int ret = -1;
  17.  
  18.     printf("timeout = %d, run time = %d\n", sec_timeout, run_time);
  19.     
  20.     /*超过用alarm函数设置的时间时产生此信号,调用connect_alarm函数 */
  21.     signal(SIGALRM, alarm_fun);
  22.     
  23.     printf("设置超时\n");
  24.     
  25.     ret = sigsetjmp(jmp_env, 1);
  26.     if(ret == 0)
  27.     {
  28.         printf("*******ret = [%d]**********\n", ret);
  29.         printf("直接调用sigsetjmp()函数,已经做好标记!\n");
  30.     }
  31.     if(ret == 1)
  32.     {
  33.         printf("*******ret = [%d]**********\n", ret);
  34.         printf("由siglongjmp()函数跳转回来!\n");
  35.         goto out;
  36.     }
  37.     alarm(sec_timeout);
  38.         
  39.       printf("running1...\n");
  40.     sleep(run_time);
  41.     printf("running2...\n");
  42.     return 0;

  43. out:
  44.     /*取消先前设置的闹钟*/
  45.     alarm(0);
  46.     printf("取消超时!\n");
  47.     return 0;
  48.     
  49. }

  50. static void alarm_fun(int signo)
  51. {
  52.     printf("收到超时信号!\n");
  53.     siglongjmp(jmp_env, 1);
  54.     return;
  55. }


阅读(702) | 评论(0) | 转发(0) |
0

上一篇:信号

下一篇:计算耗时时间

给主人留下些什么吧!~~