#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static void sig_quit (int signo) //信号处理函数
{
printf ("caught SIGQUIT\n");
if (signal (SIGQUIT,SIG_DFL) == SIG_ERR) //signal 用法
perror ("cant reset SIGQUIT");
}
static void sig_int (int signo) //信号处理函数
{
printf ("caught SIGINT\n") ;
if (signal (SIGINT,SIG_DFL) == SIG_ERR) //捕捉信号 默认是终止进程
perror ("cant reset SIgINT") ;
}
int main (void)
{
sigset_t newmask ,oldmask, pendmask;
if (signal (SIGQUIT,sig_quit) == SIG_ERR)/*设置信号处理函数*/
perror ("cant catch SIGQUIT") ;
if (signal(SIGINT,sig_int) == SIG_ERR)
perror ("cant catch SIGINT");
sigemptyset (&newmask) ; //初始化信号集 ---清空进程信号集
sigaddset (&newmask,SIGQUIT) ;// 添加信号到当前进程信号集
sigaddset (&newmask,SIGINT) ; /*添加信号到当前信号集*/
if (sigprocmask(SIG_BLOCK,&newmask,&oldmask) <0) /*设置屏蔽字,当前进程的阻塞信号保存在oldmask里面*/
perror ("SIG_BLOCK error") ; /*set与oldmask都为非空指针,则先将原来的信号屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字*/
sleep (5) ;
if (sigpending (&pendmask) < 0 )/* 检测未决信号*/
perror ("sigpending error") ;
/*处理信号阻塞队列*/
if (sigismember (&pendmask,SIGQUIT) ) //检测是否有出现SIGQUIT信号的出现
printf ("SIGQUIT pending\n") ;
if (sigismember(&pendmask, SIGINT) ) //检测未决信号是否有SIGINT出现
printf("SIGINT pending\n") ; //有则打印信息
if (sigprocmask(SIG_SETMASK,&oldmask,NULL) <0 )/* SIG_SETMASK用oldmask的信号掩码代替当前的掩码*/ ----oldset是之前备份的原先进程的掩码
perror ("SIG_SETMASK error") ;
/*fprintf (stderr,"SIGNOAL unblock\n") ;*/
sleep (5) ;
exit (0);
}`
输出结果应该是这样的:进程执行的前5秒,进程屏蔽SIGINT和SIGQUIT信号,5秒后进程检测未决信号,并对未决信号进行打印输出,5秒后回复进程默认处理方式,如果前5秒的被阻塞的将调用相应信号处理函数处理。
输出结果是这样子的:
`thinkpad@thinkpad:~/C_Pro/mul-tcommun$ ./sig_Complex
^C^\
SIGQUIT pending
SIGINT pending
caught SIGQUIT
caught SIGINT`
【UNIX高级环境编程】3.信号
最新推荐文章于 2024-07-31 17:30:56 发布