#include "apue.h"
static void
sig_quit(int signo)
{
printf("caught SIGQUIT\n");
if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
err_sys("can't reset SIGQUIT");
}
int
main(void)
{
sigset_t newmask, oldmask, pendmask; //设置三个信号集备用
if (signal(SIGQUIT, sig_quit) == SIG_ERR)//捕捉SIGQUIT信号
err_sys("can't catch SIGQUIT");
sigemptyset(&newmask); //清空信号集
sigaddset(&newmask, SIGQUIT);//添加一个信号集
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)//阻塞SIGQUIT信号
err_sys("SIG_BLOCK error");
sleep(5); /* SIGQUIT 继续等待 */
if (sigpending(&pendmask) < 0) //查看未决的信号集,pendmaks为传出参数
err_sys("sigpending error");
if (sigismember(&pendmask, SIGQUIT))//判断未决信号是否存在
printf("\nSIGQUIT pending\n");
/*
* 以上代码运行完毕之后,解除对SIGQUIT屏蔽
*/
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
err_sys("SIG_SETMASK error");
printf("SIGQUIT unblocked\n");
sleep(5);
exit(0);
}
sigset_t:自定义信号集
sigemptyset:清空信号集
sigaddset:添加信号集
sigdelset:删除信号集
sigprocmake:设置信号屏蔽字
sigfillset:全部置为1
sigismember:判断一个信号是否存在,1为是,0为否。
sigpending:查看未决信号集
首先设置自定义信号集,然后清空信号集,在将自定义信号集添加进去,最后用sigprocmake选择阻塞或者接触阻塞信号集。
sigpending和sigismember一般组合使用,用来判断一个未决信号是否存在,注意未决信号,首先需要产生信号,测试时需要留一定时间键入在之前屏蔽的信号集!