AUPE 程序10-11 信号设置和sigprocmask实例

AUPE 程序10-11 信号设置和sigprocmask实例
这个实验其实还是不太懂。
不过我想应该是这样: 执行./a.out,第一次sleep(5),产生多次SIG_QUIT信号,由于设置为SIG_QUIT阻塞,所以不执行信号处理函数。但是解除了对该信号的阻塞后,之前产生的SIG_QUIT信号仍然会被进程收到,所以会输出caught SIGQUIT。但是,不会对信号进行排队,所以只会调用一次信号处理函数。

然后在信号处理函数中,把SIGQUIT信号的处理函数设为默认,这样,再第二次sleep(5)中,就不输出caught SIGQUIT, 而是执行退出操作。
#include < signal.h >
#include
< stdio.h >
static   void  sig_quit( int );

int  main()
{
        sigset_t newmask,oldmask,pendmask;

        
if (signal(SIGQUIT, sig_quit)  ==  SIG_ERR)
                perror(
" cannot catch SIGQUIT\n " );

        sigemptyset(
& newmask);
        sigaddset(
& newmask,SIGQUIT);
        
if (sigprocmask(SIG_BLOCK, & newmask, & oldmask)  <   0 )
                perror(
" SIG_BLOCK error\n " );

        sleep(
5 );

        
if (sigpending( & pendmask)  <   0 )
                perror(
" sigpending error\n " );
        
if (sigismember( & pendmask, SIGQUIT))
                printf(
" SIGQUIT pending\n " );

        
if (sigprocmask(SIG_SETMASK, & oldmask,NULL)  <   0 )
                perror(
" SIG_SETMASK error\n " );
        printf(
" SIGQUIT unblocked\n " );

        sleep(
5 );

}

static   void  sig_quit( int  signo)
{
        printf(
" caught SIGQUIT\n " );
        
if (signal(SIGQUIT,SIG_DFL)  ==   SIG_ERR)
                perror(
" cannot reset SIGQUIT\n " );
}

你可能感兴趣的:(AUPE 程序10-11 信号设置和sigprocmask实例)