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

#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`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值