10.12 信号集

我们需要使用一种数据类型来存储多个信号,这种类型称为信号集,我们将在函数sigprocmask等函数中使用这些数据结构(下一节中),用于告知内核不要允许集合中的信号出现,正如我们早些时候提到的,不同信号的数量可能会超过一个整形变量的Bit数量,所以通常来说,我们不能使用整形变量中的每一个Bit来存储每一个信号。POSIX.1定义了数据结构sigset_t用存储信号集,并且允许如下五个函数对其进行操作:

  1. #include<signal.h>
  2. int sigemptyset(sigset_t*set);
  3. int sigfillset(sigset_t*set);
  4. int sigaddset(sigset_t*set,int signo);
  5. int sigdelset(sigset_t*set,int signo);
  6. All four return:0if OK,-1 on error.
  7. int sigismember(constsigset_t*set,int signo);
  8. Returns:1iftrue,0iffalse,-1 on error.

函数sigemptyset用于初始化set信号集,以至于其中的所有信号都将被排除。函数sigfillset用于初始化set信号集,以至于所有信号都被包含。所有应用程都应该调用在使用信号集之前调用sigemptyset或者是sigfillset一次,因为我们不能对C程序初始化外部或者静态的变量做任何假设。
一旦我们已经初始化了一个信号集,那么我们就可以增加或者删除信号集中指定的信号了,函数sigaddset用于将一个信号增加到一个信号集上,而函数sigdelset用于将一个信号从一个集合中移除,在所有将信号集作为参数的函数中,我们总是传递信号集的指针作为参数。

Implementation

如果实现所拥有的信号种类比整形变量的bit数更少,那么信号集就可能是使用整形的每一个bit来实现的,处于本节描述方便的考虑,假设某一个实现有31中不同的信号,同时整形变量有32个bit.函数sigemptyset清零整形变量,而函数sigfillset置位所有的bits,这两个函数可以在头文件中实现如下:

  1. #define sigemptyset(ptr)(*(ptr)=0)
  2. #define sigfillset(ptr)(*(ptr)=~(sigset_t)0,0)

注意sigfillset函数必须返回0,因此我们使用C语言中的都好操作符来实现表达式的返回值为0.
使用这一实现,函数sigaddset将会置位一个bit,而函数sigdelset将会关闭一个bit,函数sigismember将会测试某个指定的bit.因为没有信号的数值为0,因此一个32bit变量只能存储31个信号。

来自为知笔记(Wiz)

时间: 2024-10-13 00:50:08

10.12 信号集的相关文章

APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号

如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_t set表示. 数据类型:sigset_t 类似于整型(位数可能超过整型,因而不能用整型表示). 我们一般在sigprocmask()等函数中使用信号集,用于创建一系列进程要阻塞的信号,告诉内核不允许这些信号发生. 几个关于信号集的函数: #include <signal.h> int sige

10.11 信号集

我们需要使用一种数据类型来存储多个信号,这种类型称为信号集,我们将在函数sigprocmask等函数中使用这些数据结构(下一节中),用于告知内核不要允许集合中的信号出现,正如我们早些时候提到的,不同信号的数量可能会超过一个整形变量的Bit数量,所以通常来说,我们不能使用整形变量中的每一个Bit来存储每一个信号.POSIX.1定义了数据结构sigset_t用存储信号集,并且允许如下五个函数对其进行操作: #include <signal.h> int sigemptyset(sigset_t *

10.12 sigprocmask函数

在10.8节中我们提到进程的掩码是一个当前阻塞信号发送到进程的信号集合.一个进程可以查看其信号掩码,改变其信号掩码,或者同时执行这两个操作,通过调用函数sigprocmask来实现上述要求. #include <signal.h> int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset); return:0 if OK, -1 on error. 首先,如果oset是一个非空指针,那么当前进程

《Unix环境高级编程》读书笔记 第10章-信号

1.引言 信号是软件中断. 信号提供了一种处理异步事件的方法. 2. 信号概念 信号的名字都是以3个字符SIG开头. Linux3.2.0支持31种信号.FreeBSD.Linux和Solaris作为实时扩展都支持另外的应用程序定义的信号. 在头文件signal.h(其中include的bits/signum.h)中,信号名都被定义为正整数常量,不存在编号为0的信号.kill函数对信号编号0有特殊的应用. 很多条件可以产生信号: 用户按下某些终端键时:Ctrl+C.Ctrl+\.Ctrl+Z 硬

信号集 / 信号掩码(阻塞信号传递)

[摘自<Linux/Unix系统编程手册>] 信号集 sigemptyset() 函数初始化一个未包含任何成员的信号集.sigfillset() 函数则初始化一个信号集,使其包含所有信号(包括所有实时信号). #include <signal.h> int sigemptyset(sigset_t* set); int sigfillset(sigset_t* set); Both return 0 on success, or -1 on error 必须使用 sigemptys

信号理论: 信号集及其映射

引言 信号理论研究的是在信号空间中信号的分析与综合以及系统的分析与综合问题.在这里,信号不再被看作函数,而是被看作信号空间中的一个点.在研究信号空间之前,我们先把信号看作信号集中的一个元素,以作为把信号看作信号空间中点的概念过渡. 1.集合 定义1.1:具有某种性质的具体或抽象事物的全体称为集合.一般地,集合用大写字母如A.B.C.X.Y表示.集合中的事物称为集合的元素,用小写字母如a.b.c.x表示. 集合可以用两种方式来表示,分别称为列举法和描述法.列举法是指直接将集合的所有元素列出来的方式

信号的屏蔽,信号集

1.信号集 POSIX标准定义了数据类型sigset_t #include <signal.h> int sigemptyset(sigset_t *set); 初始化一个信号集,使其不包括任何信号 int sigfillset(sigset_t *set); 用来初始化一个信号集,使其包括所有信号 int sigaddset(sigset_t *set, int signum); 用来向set指定的信号集中添加由signum指定的信号 int sigdelset(sigset_t *set,

Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统 + Parallels Desktop 12 Pro Edition)

Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统) 前言 由于学校课程实验的要求,特意需要搭建hadoop的完全分布式系统,所以自己就蛋疼的配了,可惜关于MAC系统的Hadoop搭建材料太少,而且真正的基于校园网的配置基本上没有(基本是在一台电脑上进行,因此当在多台电脑上运行会有许多bug),因此这里想要能够将自己搭的过程想要分享给大家,可能有些配置的解释没有那么全面,所以希望大家见谅?? 环境 基于Mac OSX 10.12.4(Sierra).Ubuntu

2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

 1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默认Term动作 a signal handling function 进程处理信号 A默认处理动作 term   中断 core    core(调试的时候产生) gcc –g file.c ulimit –c 1024 gdb a.out core ign      忽略 stop     停止