每一个进程都有一个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. mongodb 3.x connect with credential

    package mongoDb; import java.net.UnknownHostException; import java.util.ArrayList; import java.util. ...

  2. INC函数

    1.inc(integer) inc(a)等于a:=a+1; 例: i := 100; inc(i); 结果:i等于101 2.inc(integer,integer) inc(a,b)等于a:=a+ ...

  3. 【转】14个最佳的HTML/CSS设计和开发框架

    专业的网页设计是既复杂又耗时的.它需要HTML和CSS框架的完美结合.这些框架不仅可以为设计方案增加特定的功能,还可以大大地节省时间和精力. 高效的框架不仅是网站设计的基础,它提供的各种丰富多彩的功能 ...

  4. leetcode--009 Linked List Cycle I

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZgAAACACAIAAAC5q+hAAAAJ+UlEQVR4nO2dwbXrKBJAOyelRShEQw

  5. java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig

    问题描述: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...

  6. Linux之文件权限属性设置

    文件权限属性设置 1.chown命令 chrep命令 chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组. 用户可以是用户或 ...

  7. 十二生肖&天干地支

    看相:http://baike.baidu.com/view/833122.htm?fr=aladdin 八字:http://baike.baidu.com/view/17127.htm?fr=ala ...

  8. jQuery插件placeholder的使用方法

    借助该插件可以轻松实现HTML5中placeholder特效: 实例代码如下: <script type="text/javascript" src="<%= ...

  9. 给 Memo 排序的函数

    本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  10. HDU-1862-EXCEL排序

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1862 这个题考的就是你对sort函数的掌握:会用sort函数对字符串,数字排序,只要懂得话题目很简单 ...