main.c
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
void sighandler_new(int signo, siginfo_t *psiginfo, void *pReversed)
{
sleep(1);
printf("receive signal %d\n", signo);
}
int main(void)
{
sigset_t sigset, oldsigset, pending_mask;
sigemptyset(&sigset);
sigaddset(&sigset, SIGINT);
if(-1 == sigprocmask(SIG_BLOCK, &sigset, &oldsigset))
{
perror("block SIGINT error");
exit(-1);
}
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = sighandler_new;
sigemptyset(&act.sa_mask);
if(sigaction(SIGINT, &act, NULL))
{
printf("install SIGINT error\n");
}
sleep(10);
if(-1 == sigpending(&pending_mask))
{
perror("get pending mask error");
exit(-1);
}
if(sigismember(&pending_mask, SIGINT))
{
printf("SIGINT is pending!\n");
}
if(-1 == sigprocmask(SIG_SETMASK, &oldsigset, NULL))
{
perror("unblock signal error");
exit(-1);
}
printf("signal unblocked !\n");
sleep(10);
return 0;
}
編譯與結果
附
int sigpending(sigset_t *set);
//將因阻塞掛起而暫未處理的信號集合由參數set指針返回