每一个进程都有一个pcb进程控制块,用来控制进程的信息,同时信号在pcb中有两个队列去维护他,一个是未决信号集,每一位对应一个信号的状态,0,1,1表示未决态,另一个是信号屏蔽字(阻塞信号集),也就0,1(1代表阻塞),

用户可以改变阻塞信号集的状态,但是改变不了未决信号集的状态

进程在接触对某个信号的阻塞之前,如果再次接受一个甚至多个信号,常规信号在递达态之前只会留下一个信号,使其处于未决态,而对于实时信号,会产生一个队列与存储,每一个信号只有一个bit,非0就是1,只表示有么有,不表示多少个。

阻塞信号集的设计过程:

一般的操作流程是先构造sigset_t信号集,通过以下函数操作信号集

 sigset_t为信号集,可sizeof(sigset_t)察看其大小为128个字节

 以下是对信号集的操作:
int sigemptyset(sigset_t *set) 清空某个信号集(全置0)
int sigfillset(sigset_t *set) 阻塞所有信号(全置1 )
int sigaddset(sigset_t *set, int signo) 将信号集的signo位值1,即阻塞该信号
int sigdelset(sigset_t *set, int signo) 将信号集的signo位值0,即不阻塞该信号
int sigismember(const sigset_t *set, int signo) 测试signo的信号位为1还是0

然后使用以sigprocmask函数注册到系统的阻塞信号集中使其生效:

1、sigprocmask

  调用函数sigprocmask可以读取更改进程的信号屏蔽字。

 #include <signal.h>

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

 返回值:若成功则为0,若出错则为-

(1)如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。

(2)如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改。(

3)如果oset和set都是非空指针,则先将原来的信号屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。假设当前的信号屏蔽字为mask,下表说明了how参数的可选值

 SIG_BLOCK   set包含了我们希望添加到当前信号屏蔽字的信号,相当于mask=mask|set
SIG_UNBLOCK  set包含了我们希望从当前信号屏蔽字中解除阻塞的信号,相当于mask=mask&~set
SIG_SETMASK  设置当前信号屏蔽字为set所指向的值,相当于mask=set
 /*
*程序运行时,每秒钟把各信号的未决状态打印一遍,由于我们阻塞了SIGINT信号,
*按Ctrl-C将会使SIGINT信号处于未决状态,
*按Ctrl-\仍然可以终止程序,因为SIGQUIT信号没有阻塞。
*
*book@ubuntu:~$ ./app
*0000000000000000000000000000000
*0000000000000000000000000000000(这时按Ctrl-C)
*0100000000000000000000000000000
*0100000000000000000000000000000(这时按Ctrl-\)
*Quit (core dumped)
*
*或者按下Ctrl-C十秒之后也会推出,这就是main函数中的while中的代码的作用
*/
#include <signal.h>
#include <stdio.h>
void printsigset(const sigset_t *set)
{
int i;
for (i = ; i < ; i++)//从1号信号开始检测
if (sigismember(set, i) == )//测试i号位知否置1
putchar('');
else
putchar('');
puts("");//打印换行
}
int main(void)
{
int i = ;
sigset_t s, p; //定义两个信号集 每一个信号集的大小是128Byte
sigemptyset(&s);//将信号集s全部信号位置0
sigaddset(&s, SIGINT);//将s信号集中的SIGINT信号位(即2号位)置1 sigprocmask(SIG_BLOCK, &s, NULL);//将s信号集合原有信号集做或操作(由第一个参数决定更改方式)
while ()
{
sigpending(&p);//获取当前进程未决信号集
printsigset(&p);//打印未决信号集 if(i == )//10秒后释放对SIGINT信号的阻塞
{
sigprocmask(SIG_UNBLOCK, &s, NULL);
}
sleep();
i++;
}
return ;
}

2、sigpending

sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。

PCB信号集的更多相关文章

  1. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  2. 《UNIX环境高级编程》笔记--信号集

    1.信号集基本操作 我们需要有一个能表示多个信号--信号集(signal set)的数据类型.POSIX.1定义了数据类型sigset_t以包含一个信号 集,并且定义了一下五个处理信号处理信号集函数. ...

  3. 【linux信号】10.11信号集

    POSIX定义数据类型sigset_t以包含一个信号集,并且定义了下面五个函数处理信号集:

  4. 从实战出发,谈谈 nginx 信号集

    前言 之前工作时候,一台引流测试机器的一个 ngx_lua 服务突然出现了一些 HTTP/500 响应,从错误日志打印的堆栈来看,是不久前新发布的版本里添加的一个 Lua table 不存在,而有代码 ...

  5. [Linux]返回被阻塞的信号集

    一.概述 在另一篇实例说到,进程可以屏蔽它不想接收的信号集. 事实上这些被屏蔽的信号只是阻塞在内核的进程表中,因为他们不能递送给进程,所以状态是未决的(pending). 利用sigpending函数 ...

  6. Linux信号-信号集&信号屏蔽字&捕捉信号【转】

    转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念    实际执行信号的处理 ...

  7. linux 信号处理 三 (信号集的使用)

    sigprocmask系统调用 使用条件: 1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2. ...

  8. linux系统编程之信号(五):信号集操作函数,信号阻塞与未决

    一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...

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

    如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...

随机推荐

  1. S3C2440外部中断系统详解

    个中断源的请求.提供这些中断源的是内部外设,如DMA控制器.UART.IIC等等.在这些中断源中,UARTn.AC97和EINTn中断对于中断控制器而言是“或”关系.任意一个中断发生都会触发总中断 当 ...

  2. nodejs抓取数据一(列表抓取)

    纯属初学...有很多需要改进的地方,请多多指点... 目标是抓取58同城 这个大分类下的列表数据: http://cd.58.com/caishui/?PGTID=14397169455980.924 ...

  3. 交换Ctrl和Caps Lock键

    由于使用vim的缘故,就把Ctrl和Caps Lock键交换了,在ubuntu系统下使用系统设置可以很简单地进行全局替换. 在ubuntu下习惯了之后在window下就经常按错...后来决定也把win ...

  4. mongodb 导入数据库文件

    吐槽一下:  这个导入现有数据文件弱爆了... 直接将要导入的数据文件放到mongodb下的db目录下就完事了...O(∩_∩)O哈哈~ 例如: 将shop_suning (shopdb_suning ...

  5. SQL数据库置疑修复

    SQL数据库置疑修复 首先分析数据库置疑的原因,查明原因分析数据库置疑修复的方法,解决置疑后,考虑数据库置疑的预防方案.   数据库置疑产生的原因: 1.sql所在分区空间是否够?数据库文件大小是否达 ...

  6. Javascript 查找元素

    DOM定义了多种查找元素的方法,除了我们常用的getElementById(),还有getElementsByTagName()和getElementsByName().使用这几种方法方法我们可以查找 ...

  7. 使用UTF8-CPP转换unicode编码 附录:UTF8和UTF16和UTF32和Unicode编码

    本文用于解决如何用C++处理字符串的编码格式.本文采用的是成熟便捷的UTF8库来处理这个问题.首先是下载UTF8库,网址为:http://utfcpp.sourceforge.net/ 为了方便后续使 ...

  8. Javascript 浮点运算问题分析与解决

    分析 JavaScript 只有一种数字类型 Number ,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的. 浮点数的精度问题不是JavaScript特有的,因为有些小数 ...

  9. PHP header( ) 禁止页面后退

    header("Cache-control:no-cache,no-store,must-revalidate"); header("Pragma:no-cache&qu ...

  10. Spark中的键值对操作

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...