10.11 信号集

我们需要使用一种数据类型来存储多个信号,这种类型称为信号集,我们将在函数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:0 if OK, -1 on error.
  7. int sigismember(const sigset_t *set, int signo);
  8. Returns:1 if true, 0 if false, -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-24 09:59:06

10.11 信号集的相关文章

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

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

10.12 信号集

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

《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 硬

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     停止

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

[摘自<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,

SQL Server安全(10/11):行级别安全(Row-Level Security)

在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Server里的安全功能充分利用,不用在面对特定威胁,不能保护你数据的功能上浪费时间. 不像其它一些工业强度的数据库服务器.SQL Server对于单个数据记录,缺少内建机制,称作行级别安全(Row-Level Security).这篇文章会探寻为什么你可能想使用这样的行级别颗粒的数据访问安全和你如何能

来了,老弟!__二进制部署kubernetes1.11.7集群

Kubernetes容器集群管理 Kubernetes介绍 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S.K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久.K8S主要用于自动化部署.扩展和管理容器应用,提供了资源调度.部署管理.服务发现.扩容缩容.监控等一整套功能.2015年7月,Kubernetes v1.0正式发布.Kubernetes目标是让