Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90511
  • 博文数量: 50
  • 博客积分: 1086
  • 博客等级: 少尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-25 16:16
文章分类
文章存档

2011年(50)

我的朋友

分类: LINUX

2011-12-01 22:32:19

 
sigaction()是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)

给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
------------------------------------------------
int sigaction(     int                      signum,
                   const struct 
sigaction --*act,
                   struct sigaction         *oldact)


  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>

  4. void show_handler(int sig)
  5. {
  6.     printf("I got signal %d\n", sig);
  7.     int i;
  8.     for(i = 0; i < 5; i++) {
  9.         printf("i = %d\n", i);
  10.         sleep(1);
  11.     }
  12. }

  13. int main(void)
  14. {
  15.     int i = 0;
  16.     struct sigaction act, oldact;
  17.     act.sa_handler = show_handler;
  18.     sigaddset(&act.sa_mask, SIGQUIT); //(1)
  19.     act.sa_flags = SA_RESETHAND | SA_NODEFER; //(2)
  20.     //act.sa_flags = 0; //(3)

  21.     sigaction(SIGINT, &act, &oldact);
  22.     while(1) {
  23.         sleep(1);
  24.         printf("sleeping %d\n", i);
  25.         i++;
  26.     }
  27. }

注:
(1)    如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。
(2)    SA_NODEFER       一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT<。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)    
       SA_RESETHAND    当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)    
(3)    如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成
阅读(1174) | 评论(0) | 转发(0) |
0

上一篇:Linux GDB

下一篇:linux常用c函数信号处理篇

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