#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include #include #include #include /*--------------------------------------------------------. | Programme utilisant siglongjmp/sigsetjmp pour éviter un | | blocage. Comparer à pause.c. | `--------------------------------------------------------*/ sigjmp_buf jmp; void f_alarm (int s) { siglongjmp(jmp, 1234); } 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); alarm(n); if (sigsetjmp(jmp, 1) == 0) // Si on revient du handler, sigsetjmp // retourne 1234... et on évite de // rester bloqué. { alarm(n); // Demande que SIGALRM me soit délivré dans n secondes. pause(); } sigaction(SIGALRM, &old, NULL); // Rétablissement de l'ancien handler. return EXIT_SUCCESS; }