信号阻塞的代码片段
static volatile sig_atomic_t gotSigquit = 0;
#define errExit(msg)
do{
preeor(msg);
errExit(EXIT_FAILURE);
}while(0)
static void handler(int sig)
{
printf("Caught signal %d (%s)\n", sig, strsignal(sig));
if(sig == SIGQUIT)
gotSigquit = 1;
}
int main(int argc, char *argv[])
{
int loopNum;
time_t startTime;
sigset_t srigMask, blockMask;
struct sigaction sa;
printSigMask(stdout, "Initial signal mask is:\n");
sigemptyset(&blockMask);
sigaddset(&blockMask, SIGINT);
sigaddset(&blockMask, SIGQUIT);
if(sigprocmask(SIG_BLOCK, &blockMask, &origMask) == -1)
errExit("sigprocmask - SIG_BLOCk");
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = handler;
if(sigaction(SIGINT, &sa, NULL) == -1)
errExit("sigaction");
if(sigaction(SIGQUIT, &sa, NULL) == -1)
errExit("sigaction");
for(loopNum =1; !gotSigquit; loopNum++){
printf("=== LOOP %d\n", loopNum);
printSigMask(stdout, "Starting critical section, signal mask is:\n");
for(startTime = time(NULL); time(NULL) < startTime + 4; )
continue;
printPendingSigs(stdout, "Before sigsuspend() - pending signals:\n");
if(sigsuspend(&origMask) == -1 && errno != EINTR)
errExit("sigsuspend");
}
if(sigprocmask(SIG_SETMASK, &origmask, NULL) == -1)
errExit("sigprocmask - SIG_SETMASK");
}
}