#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include #include #include /*------------------------------------------. | Correction du programme pause.c utilisant | | sigsuspend() à la place de pause(). | `------------------------------------------*/ void f_alarm (int s) { return; } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } int n = atoi(argv[1]); // Installation du handler. struct sigaction a, old; a.sa_handler = f_alarm; sigemptyset(&a.sa_mask); a.sa_flags = 0; sigaction(SIGALRM, &a, &old); sigset_t e; sigemptyset(&e); sigaddset(&e, SIGALRM); // e contient maintenant un seul signal: SIGALRM. On le masque. sigprocmask(SIG_BLOCK, &e, NULL); // On récupère dans e le masque actuel. sigprocmask(SIG_SETMASK, NULL, &e); // On supprime de la variable e SIGALRM (ce qui a un effet sur la // variable e, mais pas sur le masque. On utilisera e plus tard). sigdelset(&e, SIGALRM); // Demande que SIGALRM me soit généré dans n secondes. // On peut utiliser d'autres appels pour une granulatité plus fine // que la seconde (setitimer, ualarm,...). alarm(n); // Installation du masque et passage en sommeil, de façon atomique. sigsuspend(&e); sigaction(SIGALRM, &old, NULL); // Rétablissement de l'ancien handler. return EXIT_SUCCESS; }