信号集
数据类型s i g s e t _ t ,一个信号集,表示多个信号的集合
#include <signal.h>
信号集初始化
int sigemptyset(sigset_t * s e t) ;
初始化由s e t指向的信号集,使排除其中所有信号
int sigfillset(sigset_t * s e t) ;
函数 s i g f i l l s e t初始化由s e t指向的信号集,使其包括所有信号
所有应用程序在使用信号集前,要对该信号集调用
s i g e m p t y s e t或s i g f i l l s e t一次。这是因为C编译程序将不赋初值的外部和静态度量都初始化为 0
信号集的变更
int sigaddset(sigset_t * s e t, int s i g n o) ;
int sigdelset(sigset_t * s e t, int s i g n o) ;所有应用程序在使用信号集前,要对该信号集调用
s i g e m p t y s e t或s i g f i l l s e t一次。这是因为C编译程序将不赋初值的外部和静态度量都初始化为 0
以上 四个函数返回:若成功则为0,若出错则为- 1
信号集测试
int sigismember(const sigset_t * s e t, int s i g n o)
s i g i s m e m b e r测试一指定位。因
为没有信号编号值为0
返回:若真则为1,若假则为0
sigprocmask函数
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集.
函数s i g p r o c m a s k可以检测或更改(或两者)进程的信号屏蔽字
int sigprocmask(int h o w, const sigset_t * s e t, sigset_t * o s e t) ;
返回:若成功则为0,若出错则为- 1
o s e t是非空指针,进程的当前信号屏蔽字通过 o s e t返回。
其次,若s e t是一个非空指针,则参数h o w指示如何修改当前信号屏蔽字。
如果s e t是个空指针,则不改变该进程的信号屏蔽字,h o w的值也无意义。
如果在调用s i g p r o c m a s k后有任何未决的、不再阻塞的信号,则在 s i g p r o c m a s k返回前,至
少将其中之一递送给该进程
下表说明了h o w可选用的值。S I G _ B L O C K是或操
作,而S I G _ S E T M A S K则是赋值操作。
how | 说明 |
---|---|
S I G _ B L O C K | 该进程新的信号屏蔽字是其当前信号屏蔽字和 s e t指向信号集的并集。s e t包含了我们希望阻塞的附加信号 |
S I G _ U N B L O C K | 该进程新的信号屏蔽字是其当前信号屏蔽字和 s e t所指向信号集的交集。 s e t包含了我们希望解除阻塞的信号 |
S I G _ S E T M A S K | 该进程新的信号屏蔽是s e t指向的值 |
sigpending函数
s i g p e n d i n g返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过 s e t参数
返回。
#include <signal.h>
int sigpending(sigset_t * s e t) ;
返回:若成功则为0,若出错则为- 1
sigsuspend函数
在一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠.
进程的信号屏蔽字设置为由 s i g m a s k指向的值。在捕捉到一个信号或发生了一个会终止该进程
的信号之前,该进程也被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则
s i g s u s p e n d返回,并且该进程的信号屏蔽字设置为调用s i g s u s p e n d之前的值。
注意,此函数没有成功返回值。如果它返回到调用者,则总是返回- 1,并且e r r n o设置为
E I N T R (表示一个被中断的系统调用)。
int sigsuspend(const sigset_t * s i g m a s k) ;
返回:- 1, errno设置为E I NT R