Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1757502
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-02-07 20:09:19

  1. #include <signal.h>
  2. int sigprocmask(int how,const sigset_t * restrict set,sigset_t * restrict oset);
  3. int sigpending(sigset_t * set) 
  4. 信号集被阻塞而不能递送,直至解除阻塞
  5. int sigemptyset(sigset_t *set)
  6. 初始化有set指向的信号集,清楚其中所有的信号
  how 对信号集的处理方式,
  newmask 新的信号集
  oldmask 旧的信号集
如果oldmask不空,则将原有的信号集放到oldmask中
  1. #include "apue.h"

  2. static void sig_quit(int);

  3. int main(void)
  4. {
  5.     sigset_t newmask,oldmask,pendmask;
  6.     if (signal(SIGQUIT,sig_quit) == SIG_ERR)
  7.         err_sys("can't catch sigquit");
  8.     /*
  9.      * Block sigquit and save current signal mask
  10.      */
  11.     sigemptyset(&newmask);
  12.     sigaddset(&newmask,SIGQUIT);
  13.     if (sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
  14.         err_sys("sig_block error");
  15.     sleep(5);
  16.     /* sigquit here will remain pending */
  17.     if (sigpending(&pendmask) < 0)
  18.         err_sys("sigpending error");
  19.     if (sigismember(&pendmask,SIGQUIT))
  20.         printf("\n SIGQUIT pending \n");

  21.     /*
  22.      * reset the signal mask which unblock sigquit
  23.      */
  24.     if (sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
  25.         err_sys("sig_setmask error");
  26.     printf("sig_quit unblock\n");
  27.     sleep(5);
  28.     exit(0);
  29. }
  30. static void
  31. sig_quit(int signo)
  32. {
  33.     printf( "caught sigquit \n");
  34.     if (signal(SIGQUIT,SIG_DFL) == SIG_ERR)
  35.         err_sys("can't reset sigquit\n");
  36. }#include "apue.h"

  37. static void sig_quit(int);

  38. int main(void)
  39. {
  40.     sigset_t newmask,oldmask,pendmask;
  41.     if (signal(SIGQUIT,sig_quit) == SIG_ERR)
  42.         err_sys("can't catch sigquit");
  43.     /*
  44.      * Block sigquit and save current signal mask
  45.      */
  46.     sigemptyset(&newmask);
  47.     sigaddset(&newmask,SIGQUIT);
  48.     if (sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
  49.         err_sys("sig_block error");
  50.     sleep(5);
  51.     /* sigquit here will remain pending */
  52.     if (sigpending(&pendmask) < 0)
  53.         err_sys("sigpending error");
  54.     if (sigismember(&pendmask,SIGQUIT))
  55.         printf("\n SIGQUIT pending \n");

  56.     /*
  57.      * reset the signal mask which unblock sigquit
  58.      */
  59.     if (sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
  60.         err_sys("sig_setmask error");
  61.     printf("sig_quit unblock\n");
  62.     sleep(5);
  63.     exit(0);
  64. }
  65. static void
  66. sig_quit(int signo)
  67. {
  68.     printf( "caught sigquit \n");
  69.     if (signal(SIGQUIT,SIG_DFL) == SIG_ERR)
  70.         err_sys("can't reset sigquit\n");
  71. }

  1. gcc -Wall c10-11 c10-11.c error.c
  2. ./c10-11

  3. ^\

  4.  SIGQUIT pending

  5. caught sigquit

  6. sig_quit unblock

  7. $ ./c10-11
    ^\^\^\^\^\^\^\^\^\^\^\^\
     SIGQUIT pending 
    caught sigquit 
    sig_quit unblock
本文对信号集的处理方式是:
为了阻塞某信号,保留了 旧的信号屏蔽字,为了接触对该信号的阻塞,用旧的信号屏蔽字重新设置
进程信号屏蔽字
另外一种方法是 使用sig_unblock解阻塞信号,但是这并不能保证信号就解阻塞,原因是信号在进程设置阻塞以前就有可能是阻塞的,这样你只能解阻塞你自己阻塞的信号,实际上信号仍旧处于阻塞状态。








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