PCB信号集
每一个进程都有一个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信号集的更多相关文章
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- 《UNIX环境高级编程》笔记--信号集
1.信号集基本操作 我们需要有一个能表示多个信号--信号集(signal set)的数据类型.POSIX.1定义了数据类型sigset_t以包含一个信号 集,并且定义了一下五个处理信号处理信号集函数. ...
- 【linux信号】10.11信号集
POSIX定义数据类型sigset_t以包含一个信号集,并且定义了下面五个函数处理信号集:
- 从实战出发,谈谈 nginx 信号集
前言 之前工作时候,一台引流测试机器的一个 ngx_lua 服务突然出现了一些 HTTP/500 响应,从错误日志打印的堆栈来看,是不久前新发布的版本里添加的一个 Lua table 不存在,而有代码 ...
- [Linux]返回被阻塞的信号集
一.概述 在另一篇实例说到,进程可以屏蔽它不想接收的信号集. 事实上这些被屏蔽的信号只是阻塞在内核的进程表中,因为他们不能递送给进程,所以状态是未决的(pending). 利用sigpending函数 ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- linux 信号处理 三 (信号集的使用)
sigprocmask系统调用 使用条件: 1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2. ...
- linux系统编程之信号(五):信号集操作函数,信号阻塞与未决
一,信号集及相关操作函数 信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来描述信号的集合 ...
- APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号
如有转载,请注明出处:Windeal专栏 首先简述下几个概念的关系: 我们通过信号集建立信号屏蔽字,使得信号发生阻塞,被阻塞的信号即未决信号. 信号集: 信号集:其实就是一系列的信号.用sigset_ ...
随机推荐
- mongodb 3.x connect with credential
package mongoDb; import java.net.UnknownHostException; import java.util.ArrayList; import java.util. ...
- INC函数
1.inc(integer) inc(a)等于a:=a+1; 例: i := 100; inc(i); 结果:i等于101 2.inc(integer,integer) inc(a,b)等于a:=a+ ...
- 【转】14个最佳的HTML/CSS设计和开发框架
专业的网页设计是既复杂又耗时的.它需要HTML和CSS框架的完美结合.这些框架不仅可以为设计方案增加特定的功能,还可以大大地节省时间和精力. 高效的框架不仅是网站设计的基础,它提供的各种丰富多彩的功能 ...
- leetcode--009 Linked List Cycle I
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZgAAACACAIAAAC5q+hAAAAJ+UlEQVR4nO2dwbXrKBJAOyelRShEQw
- java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig
问题描述: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with n ...
- Linux之文件权限属性设置
文件权限属性设置 1.chown命令 chrep命令 chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组. 用户可以是用户或 ...
- 十二生肖&天干地支
看相:http://baike.baidu.com/view/833122.htm?fr=aladdin 八字:http://baike.baidu.com/view/17127.htm?fr=ala ...
- jQuery插件placeholder的使用方法
借助该插件可以轻松实现HTML5中placeholder特效: 实例代码如下: <script type="text/javascript" src="<%= ...
- 给 Memo 排序的函数
本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...
- HDU-1862-EXCEL排序
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1862 这个题考的就是你对sort函数的掌握:会用sort函数对字符串,数字排序,只要懂得话题目很简单 ...