這個實驗其實還是不太懂。
不過我想應該是這樣: 執行./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");
}