int main(int argc, char *argv[]) { struct sigaction sa; sigset_t blockingMask, prevMask, emptyMask; printf("%s: PID: %d\n", argv[0], getpid()); sigemptyset(&emptyMask); sigemptyset(&blockingMask); sigaddset(&blockingMask, SIGALRM); if (sigprocmask(SIG_SETMASK, &blockingMask, &prevMask) == -1) errExit("sigprocmask error"); sa.sa_handler = sigHandler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGALRM, &sa, NULL) == -1) errExit("sigaction error"); my_alarm(1); for (;;) { if (sigsuspend(&emptyMask) == -1 && errno != EINTR) errExit("sigsuspend issue"); } if (sigprocmask(SIG_SETMASK, &prevMask, NULL) == -1) errExit("sigprocmask error"); exit(EXIT_SUCCESS); }
int main(int argc, char *argv[]){ sigset_t mask; sigemptyset(&mask); sigaddset(&mask,SIGALRM); //block SIGALRM so it doesn't term proc if(sigprocmask(SIG_SETMASK,&mask,NULL)!=0) exit(EXIT_FAILURE); my_alarm(5); //wait 5 seconds siginfo_t info; //wait synchronously for SIGALRM sigwaitinfo(&mask,&info); if(info.si_signo == SIGALRM) //check signo printf("ALARMED!\n"); exit(EXIT_SUCCESS); }