每一个进程都有一个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. jQuery修改css属性

    jQuery CSS 操作jQuery 拥有三种用于 CSS 操作的重要函数:$(selector).css(name,value)$(selector).css({properties})$(sel ...

  2. LPC1788的内部EEPROM使用

    Lpc1788内置有eeprom 使用代码 #ifndef __E2PRONINCHIP_H_ #define __E2PROMINCHIP_H #include "common.h&quo ...

  3. 安卓能用的modebus CRC16计算,附上对应的C语言的CRC16(转)

    源:安卓能用的modebus CRC16计算,附上对应的C语言的CRC16 “源”即是原文地址,想了解作都更多文章及思想请移步到“源”.转过只是为了本人感兴趣的文章查找方便. 正文: 最近写安卓串口通 ...

  4. MVC 5学习总结笔记1

    01.使用MVC自带的DataAnnotations实现数据验证 public class ExternalLoginConfirmationViewModel { [Required] [Displ ...

  5. make执行过程

    转载自 陈皓<跟我一起写 Makefile> 一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的.但也有时你也许只想让m ...

  6. UVa 374 - Big Mod

    题目大意:计算R = BP mod M,根据模运算的性质计算. 正常计算会超时,可以用分治的思想降低时间复杂度.不过如果遇到00,结果...话说00的结果是1吗?忘了都... #include < ...

  7. [repost]Xcode因为证书问题经常报的那些错

    [reference]http://www.jianshu.com/p/b10680a32d3 1.   确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2.   证书失效了,去开发者中 ...

  8. 【推荐】PHP中格式化时间函数date与gmdate的区别 | 修改PHP的默认时区

    PHP中的时间有2个格式化函数:date()和gmdate(),在官方的文档中的描述为: date -- 格式化一个本地时间/日期 gmdate -- 格式化一个 GMT/UTC 日期/时间,返回的是 ...

  9. 【转】Android ListView加载不同的item布局

    原创教程,转载请保留出处:http://www.eoeandroid.com/thread-72369-1-1.html     最近有需求需要在listView中载入不同的listItem布局,开始 ...

  10. 字符集 ISO-8859-1(1)

    HTML 4.01 支持 ISO 8859-1 (Latin-1) 字符集. ISO-8859-1 的较低部分(从 1 到 127 之间的代码)是最初的 7 比特 ASCII. ISO-8859-1 ...