这个实验其实还是不太懂。
不过我想应该是这样: 执行./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");
}