Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2117418
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2015-07-20 10:24:11

1.1 代码
  1. cong@msi:/work/test/busytest/5sigset_1$ cat ./sigset.c
  2. #include "utils.h"
  3. #include <signal.h>

  4. static void catcher(int arg)
  5. {
  6.     dbmsg();                      //打印一下
  7.     //以后每次的SIGALRM就靠这个产生
  8.     alarm(1);                     //1s之后再发送一个SIGALRM
  9. }

  10. int main ( int argc, char *argv[] )
  11. {
  12.     struct sigaction sa;
  13.     memset(&sa, 0, sizeof(sa));
  14.     sa.sa_flags = SA_RESTART;
  15.     sa.sa_handler = catcher;
  16.     sigaction(SIGALRM, &sa,NULL);    //设置SIGALRM的处理函数是catcher
  17.    
  18.     //第1次的SIGALRM就靠这个产生
  19.     alarm(1);                       //经过1s钟之后发送一个SIGALAM
  20.     while(1)
  21.     {
  22.         sleep(1);
  23.     }
  24.     return EXIT_SUCCESS;
  25. }
main主函数中的alarm只运行一次,作为触发SIGALRM的开始
第一次触发SIGALRM后,被catcher捕获,打印并再次调用alarm,循环就产生了。
1.2 运行结果
  1. cong@msi:/work/test/busytest/5sigset_1$ ./sigset  
  2. sigset.c:catcher[6]:    //每秒钟打印1次
  3. sigset.c:catcher[6]:
  4. sigset.c:catcher[6]:
1.3 代码打包
5sigset_1.rar (下载后改名为5sigset_1.tar.gz)
2
想控制信号的处理时,需要用到sigprocmask了

2.1
  1. #include "utils.h"
  2. #include <signal.h>

  3. static void catcher(int arg)
  4. {
  5.     dbmsg();
  6.     alarm(1);
  7. }

  8. int main ( int argc, char *argv[] )
  9. {
  10.     //set sig
  11.     struct sigaction sa;
  12.     memset(&sa, 0, sizeof(sa));
  13.     sa.sa_flags = SA_RESTART;
  14.     sa.sa_handler = catcher;
  15.     sigaction(SIGALRM, &sa,NULL);
  16.     
  17.     alarm(1);
  18.     while(1)
  19.     {
  20.         sigset_t sset, osset;
  21.         sigemptyset(&sset);
  22.         sigaddset(&sset, SIGALRM);
  23.         sigprocmask(SIG_BLOCK, &sset, &osset);  //这儿把SIGALM阻塞住了
  24.         dbmsg();
  25.        // sigprocmask(SIG_SETMASK, &osset, NULL);
  26.         sleep(1);                     //sleep与SIGALRM最好不要同时用,要是有个recvfrom阻塞住就好了
  27.     }
  28.     return EXIT_SUCCESS;
  29. }
2.2 运行结果
  1. cong@msi:/work/test/busytest/5sigset$ ./sigset
  2. sigset.c:main[26]:
  3. sigset.c:main[26]:
  4. sigset.c:main[26]:
  5. sigset.c:main[26]:
  6. sigset.c:main[26]:
2.3 代码打包
5sigset.rar (下载后改名为5sigset.tar.gz)

2.4 打开开关
  1. cong@msi:/work/test/busytest/5sigset$ ./sigset
  2. sigset.c:main[26]:
  3. sigset.c:catcher[6]:
  4. sigset.c:main[26]:
  5. sigset.c:catcher[6]:
  6. sigset.c:main[26]:
  7. sigset.c:catcher[6]:
产生一个SIGALM,先阻塞住,等main中的打印完成再放开SIGALM,进入catcher进行处理

阅读(1276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~