Пример #1
0
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);
}