1.信号集操作函数介绍
自定义信号集: sigset_t set; // typedef unsigned long sigset_t;
(1) int sigemptyset(sigset_t *set); 将某个信号集清 0 成功:0;失败:-1
(2) int sigfillset(sigset_t *set); 将某个信号集置 1 成功:0;失败:-1
(3) int sigaddset(sigset_t *set, int signum); 将某个信号加入信号集 ,将对应编号置1 成功:0;失败:-1
(4) int sigdelset(sigset_t *set, int signum); 将某个信号清出信号集 ,将对应编号置0 成功:0;失败:-1
(5) int sigismember(const sigset_t *set, int signum);判断某个信号是否在信号集中出错:-1 返回值:在集合:1;不在:0;
sigset_t 类型的本质是位图。但不应该直接使用位操作,而应该使用上述函数,保证跨系统操作有效。
2.sigprocmask 函数
a.原型:int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
b.参数:
set:传入参数,是一个位图,set 中哪位置 1,就表示当前进程屏蔽哪个信号。
oldset:传出参数,保存旧的信号屏蔽集。
how 参数取值: 假设当前的信号屏蔽字为 mask
1. SIG_BLOCK: 当 how 设置为此值,set 表示需要屏蔽的信号。相当于 mask = mask|set
2. SIG_UNBLOCK: 当 how 设置为此,set 表示需要解除屏蔽的信号。相当于 mask = mask & ~set
3. SIG_SETMASK: 当 how 设置为此,set 表示用于替代原始屏蔽及的新屏蔽集。相当于 mask = set 若,调用 sigprocmask 解除了对当前若干个信号的阻塞,则在 sigprocmask 返回前,至少将其中一个信号递达。
c.作用:用来屏蔽信号、解除屏蔽也使用该函数。其本质,读取或修改进程的信号屏蔽字(PCB 中)
d.返回值:成功:0;失败:-1,设置 errno
3.sigpending 函数
a.原型:int sigpending(sigset_t *set);
b.set 传出参数
c.作用:读取当前进程的未决信号集
d.返回值:成功:0;失败:-1,设置 errno
4.代码:printpending.c 读取当前进程的未决信号集,并打印到屏幕上
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
//本程序作用:读取当前进程的未决信号集,并打印到屏幕上
void printped(sigset_t * ped)
{
int i;
for(i=0;i<32;i++){
if(sigismember(ped,i) == 1){ //判断某个信号是否在信号集中
putchar('1'); //将给定的字符输出到控制台
}
else{
putchar('0');
}
}
printf("\n");
}
//测试:执行程序后,过几秒,ctrl + c, ctrl + z, ctrl + \
//产生了未决信号集
int main()
{
sigset_t myset,oldset,ped;
sigemptyset(&myset); //将信号集清空
sigaddset(&myset,SIGQUIT); //添加一个信号集 3
sigaddset(&myset,SIGINT); //添加一个信号集 2
sigaddset(&myset,SIGTSTP); //添加一个信号集 20
sigaddset(&myset,SIGSEGV); //添加一个信号集 11
sigaddset(&myset,SIGKILL); //添加一个信号集 9
//myset是传入参数,myset中哪个位置为1,就表示当前进程屏蔽哪个信号
sigprocmask(SIG_BLOCK,&myset,&oldset); //屏蔽信号
while(1){
//ped是传出参数
sigpending(&ped); //读取当前进程的未决信号集
printped(&ped); //打印到屏幕
sleep(1);
}
return 0;
}
结果: