【UNIX高级环境编程】3.信号

来源:互联网 发布:淘宝旺铺有什么用 编辑:程序博客网 时间:2024/05/17 02:40
#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 pendingSIGINT pendingcaught SIGQUITcaught SIGINT`

0 0
原创粉丝点击