Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1743691
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-30 19:33:18

回想10.8节一个进程的信号掩码是当前阻塞而不能分发给进程的信号集。一个进程可以检查它的信号掩码,改变它的信号掩码,或通过调用下面的函数在一个步骤里执行两个操作。



  1. #include <signal.h>

  2. int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);

  3. 成功返回0,错误返回-1


首先,如果oset是一个非空指针,进程的当前信号掩码通过oset返回。


其次,如果set是一个非空指针,那么how参数指出当前信号掩码如何被修改。下表描述了how的可能值。SIG_BLOCK是非互斥的或操作,而SIG_SETMASK是一个赋值。注意SIGKILL和SIGSTOP不能被阻塞。


使用sigprocmask改变当前信号掩码的方法
how描述
SIG_BLOCK进程的新信号掩码是它当前掩码和set指向的信号集的并集,也就是说,set包含了我们想阻塞的额外的信号。
SIG_UNBLOCK进程的信号掩码是当前信号掩码和set指向的信号集的反码的交集。也就是说,集合包含了我们想反阻塞的信号。
SIG_SETMASK进程的新信号掩码被set指向的信号集的指代替。


如果set是一个空指针,进程的信号掩码不变,而how被忽略。


在调用sigprocmask后,如果任何反阻塞的信号在待定,那么这些信号里至少有一个在sigprocmask返回前被分发给进程。


sigprocmask函数只为单线程进程定义。另一个函数被提供以在多线程进程里执行一个线程信号掩码。我们将在12.8节讨论这个。


下面的代码展示了一个打印调用进程的信号掩码里的信号名:



  1. #include <errno.h>
  2. #include <signal.h>

  3. void
  4. pr_mask(const char *str)
  5. {
  6.     sigset_t sigset;
  7.     int errno_save;

  8.     errno_save = errno; /* we can be called by signal handlers */
  9.     if (sigprocmask(0, NULL, &sigset) < 0) {
  10.         printf("sigprocmask error\n");
  11.         exit(0);
  12.     }

  13.     printf("%s", str);
  14.     if (sigismember(&sigset, SIGINT)) printf("SIGINT ");
  15.     if (sigismember(&sigset, SIGQUIT)) printf("SIGQUT ");
  16.     if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 ");
  17.     if (sigismember(&sigset, SIGALRM)) printf("SIGALRM ");

  18.     /* remaining signals can go here */

  19.     printf("\n");
  20.     errno = errno_save;
  21. }

我们将在本章后面使用这个函数。为了节省空间,我们没有测试10.2节列出的所有信号。
阅读(912) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~