快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰平台app:Linux信号和阻塞



1. 旌旗灯号掩码——被壅闭的旌旗灯号集

每个进程都有一个用来描述哪些旌旗灯号传送来将被壅闭的旌旗灯号集,假如某种旌旗灯号在某个进程的壅闭旌旗灯号集中,则传送到该进程的此种旌旗灯号将会被壅闭。当前被进程壅闭的旌旗灯号集也叫旌旗灯号掩码,类型为sigset_t。每个进程都有自己的旌旗灯号掩码,且创建子进程时,子进程会承袭父进程的旌旗灯号掩码。

2. 旌旗灯号壅闭和轻忽的差别

壅闭的观点与轻忽旌旗灯号是不合的:操作系统在旌旗灯号被进程解除壅闭之前不会将旌旗灯号通报出去,被壅闭的旌旗灯号也不会影响进程的行径,旌旗灯号只是暂时被阻拦通报;当进程轻忽一个旌旗灯号时,旌旗灯号会被通报出去,但进程将旌旗灯号丢弃。

3. 旌旗灯号集的操作

旌旗灯号集可以由以下几个函数操作:

int sigemptyset(sigset_t *set);//清空旌旗灯号集

int sigfillset(sigset_t *set);//将所有旌旗灯号添补进set中

int sigaddset(sigset_t *set, int signum);//往set中添加旌旗灯号signum

int sigdelset(sigset_t *set, int signum);//从set中移除旌旗灯号signum

int sigismember(const sigset_t *set, int signum); //判断signnum是不是包孕在set中,在返回1,不在澳门新葡亰平台app返回0

初始化每每可以用sigemptyset()将旌旗灯号集清空,再用sigaddset()向旌旗灯号集中澳门新葡亰平台app添加旌旗灯号;或者可以应用sigfillset()将所有旌旗灯号添加到旌旗灯号集,再用sigdelset()将某旌旗灯号从中删除掉落。

4. sigprocmask()先容

可以应用函数sigprocmask()来反省或者改动进程的旌旗灯号掩码。函数信息如下:

#include

intsigprocmask ( int how,constsigset_t*restrict set,

sigset_t*restrict old );

参数how 是一个整数,阐明旌旗灯号掩码的改动要领:

SIG_BLOCK---将set指向的旌旗灯号集中的旌旗灯号添加到当前壅闭旌旗灯号集中;

SIG_UNBLOCK---从当前壅闭旌旗灯号集中移除set指向的旌旗灯号集中的旌旗灯号;

SIG_SETMAS澳门新葡亰平台appK---指定set所指向的旌旗灯号集为当前壅闭旌旗灯号集。

此外,假如参数set 为NULL, 阐明不必要改动,假如old 为NULL,sigprocmask会将改动之前的旌旗灯号集放在*old 之中返回。

5.sigaction()回首

在前面有用过sigaction()函数:

include

int sigaction(int signum,const struct sigaction *act,

const struct sigaction *oldact);

该函数是用于注册一个旌旗灯号处置惩罚函数。参数布局体sigaction与函数同名,详细信息如下:

st澳门新葡亰平台appruct sigaction {

void (*sa_handler)(int);//老类型的旌旗灯号处置惩罚函数指针

void (*sa_sigaction)(int, siginfo_t *, void *);//新类型的旌旗灯号处置惩罚函数指针

sigset_t sa_mask;//将要被壅闭的旌旗灯号聚拢

int sa_flags;//旌旗灯号处置惩罚要领掩码

void (*sa_restorer)(void);//保留

}

5.1 sa_handler:一个函数指针,用于指向原型为void handler(int)的旌旗灯号处置惩罚函数地址(老类型的旌旗灯号处置惩罚函数);

5.2 sa_sigaction:也是一个函数指针,用于指向原型为:

void handler(int (新类型的旌旗灯号处置惩罚函数);

三个参数的含义为:

iSignNum:传入的旌旗灯号

pSignInfo:与该旌旗灯号相关的一些信息,它是个布局体

pReserved:保留,现没用

5.3 sa_handler和sa_sigaction只应该有一个生效,假如想采纳老的旌旗灯号处置惩罚机制,就应该让sa_handler指向精确的旌旗灯号处置惩罚函数;否则应该让sa_sigaction指向精确的旌旗灯号处置惩罚函数,并且让字段sa_flags包孕SA_SIGINFO选项。

5.4 sa_mask是一个包孕旌旗灯号聚拢的布局体,该布局体内的旌旗灯号表示在进行旌旗灯号处置惩罚时,将要被壅闭的旌旗灯号。该旌旗灯号集可以用前面标题3提到的5个函数来进行操作。

5.5字段sa_flags是一组掩码的合成值,唆使旌旗灯号处置惩罚时所应该采取的一些行径,各掩码的含义为:

(1)SA_RESETHAND ---处置惩罚完毕要捕捉的旌旗灯号后,将自动取缔旌旗灯号处置惩罚函数的注册,即必须再从新注册旌旗灯号处置惩罚函数,才能继承处置惩罚接下来孕育发生的旌旗灯号。

(2)SA_NODEFER ---在处置惩罚旌旗灯号时,假如又发生了其它的旌旗灯号,则急速进入其它旌旗灯号的处置惩罚,等其它旌旗灯号处置惩罚完毕后,再继承处置惩罚当前的旌旗灯号,即递规地处置惩罚。假如sa_flags包孕了该掩码,则布局体sigaction的sa_mask将无效;

(3)SA_RESTART--- 假如在发生旌旗灯号时,法度榜样正壅闭在某个系统调用,例如调用read()函数,则在处置惩罚完毕旌旗灯号后,接着从壅闭的系统返回。该掩码相符通俗的法度榜样处置惩罚流程,以是一样平常来说,应该设置该掩码,否则旌旗灯号处置惩罚完后,壅闭的系统调用将会返回掉败;

(4)SA_SIGINFO ---唆使布局体的旌旗灯号处置惩罚函数指针是哪个有效,假如sa_flags包孕该掩码,则sa_sigactiion指针有效,否则是sa_han澳门新葡亰平台appdler指针有效。

必要留意的是:

函数sigprocmask是全程壅闭,在sigprocmask中设置了壅闭聚拢后,被壅闭的旌旗灯号将不能再被旌旗灯号处置惩罚函数捕捉,直到从新设置壅闭旌旗灯号聚拢。而在sigaction()注册旌旗灯号处置惩罚函数时,选择壅闭的旌旗灯号集只是在处置惩罚捕捉的旌旗灯号时,才对指定的其他旌旗灯号进行壅闭。

您可能还会对下面的文章感兴趣: