信号未决与阻塞(二)

/**************************************************************************************************************/

一、几个基本的概念

信号递达(Delivery) :实际执行信号的处理动作;

信号未决(Pending) :信号从产生到递达之间的状态;

进程可以选择阻塞(Block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。

注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后
可选的一种处理动作。

/**************************************************************************************************************/

二、信号在内核中的表示示意图

         

每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针表示处理动作。

信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。

POSIX.1允许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只计一次,

未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,

未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。

阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞。

阻塞信号集也叫做当前进程的信号屏蔽字(Signal Mask),这里的屏蔽应该理解为阻塞而不是忽略。

/*************************************************************************************************************/

三、信号操作集函数

#include <signal.h>

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signo);

int sigdelset(sigset_t *set, int signo);

int sigismember(const sigset_t *set, int signo);

前四个函数都是成功返回0,出错返回-1;

sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1。

注意,在使用sigset_t类型的变量之前,一定要调
用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。

/*************************************************************************************************************/

四、sigprocmask函数

调用函数sigprocmask可以读取或更改进程的信号屏蔽字(阻塞信号集)

#include <signal.h>

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

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

如果set是非空指针,则
更改进程的信号屏蔽字 ,

参数how指示如何更改,如果oset和set都是非空指针,则先将原来的信号
屏蔽字备份到 oset里,然后根据set和how参数更改信号屏蔽字。

假设当前的信号屏蔽字为mask,下表说明了how参数的可选值。

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

如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在sigprocmask返回前,至少将其中
一个信号递达。

/*************************************************************************************************************/

五、sigpending函数

#include <signal.h>

int sigpending(sigset_t *set);

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

/*************************************************************************************************************/

六、上述函数的运用

    该代码的功能:

1)先添加2号信号到阻塞信号集中;

(2)用sigprocmask函数检测阻塞信号集;

(3)接下来一直读取未决信号集,并打印未决信号集(打印信号集是没有任何意义的,这里只是演示)

(4)10s之前,2号信号被设置为了阻塞状态,所以当产生2号信号时,它将会一直处于未决状态,不能被递达,10s后,恢复原来的阻塞信号集,2号信号的阻塞状态被解除,所以再按Ctrl+C,将会终止进程;

   

打印未决信号集:

/*************************************************************************************************************/

时间: 2024-10-14 11:21:58

信号未决与阻塞(二)的相关文章

信号“未决”与“阻塞”

http://blog.csdn.net/sunyubo458/article/details/4484957 信号状态:    信号的”未决“是一种状态,指的是从信号的产生到信号被处理前的这一段时间:信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生.     APUE例题在sleep前用sigprocmask阻塞了退出信号,然后sleep,然后在sleep的过程中产生一个退出信号,但是此时退出信号被阻塞过,(中文的”阻塞”在这里容易被误解为一种状态,实际上是一种类似于开关

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

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

MATLAB信号与系统分析(二)&mdash;&mdash;离散时间信号与系统的时域分析

一.离散信号的表示 1.一个离散信号需要用两个向量来表示: (1)离散信号的幅值 (2)离散信号的位置信息 2.用MATLAB实现离散信号的可视化 (1)不能利用符号运算来表示 (2)绘制离散信号一般采用stem命令. (3)x(n)--stem(n,x) 3.一个demo: clear all; x=[-1,2,3,3,5,-4]; n=[-2,-1,0,1,2,3]; figure(1) stem(n,x),axis([-2.5,3.5,-4.5,5.5]) 二.一些常用的离散信号 1.单位

阻塞信号

原文链接:http://www.orlion.ga/1126/ 一.阻塞信号 1.信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保存在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作,信号在内核中的表示可以看作是:     每个信号都有两个标志位分别表示阻塞和

Linux信号阻塞与未达

信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作.信号在内核中的表示可以看作是这样的: @font-face { font-family: "Times New Roman"; }@font-fa

[学习笔记]信号的阻塞和未达

信号在内核中的表示 q  执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. q  注意,阻塞和忽略是不同,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作.信号在内核中的表示可以看作是这样的: 说明1)PCB进程控制块中结构体中有信号屏蔽状态字(block),信号未决状态字(pending)还有是否

进程-IPC 信号和信号量 (二)

详细见:  https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%BA%8C).md 三 信号 3.1. 信号简介 信号是进程之间互相传递消息的一种方法,信号全称为软中断信号,也可称为软中断,它是实现IPC的方法之一. 信号是UNIX和Linux系统响应某些条件而产生的一个事件.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件. 注:信号只是简单用来通知某进程发生了什么

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

(原) 信号(上)------信号的基本概念

一.信号的介绍 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.但是信号和中断还是有所区别的,主要的区别体现在: (1):中断有优先级,信号没有,所有的信号都是平等的: (2):中断处理程序是在内核态运行,而信号处理程序是在用户态运行: (3):中断响应是及时的,而信号响应则有较大的延时. 二.信号的产生 (1):用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如ctr+c产生SIGINT,  ctr + \产生SIGQUIT信号: (2):硬件异常产生信号,这些条件由硬