#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include #include #include /*--------------------------------------------------------------------. | * Programme illustrant les problèmes liés au caractère asynchrone | | de la communication par signaux. Le processus risque d'être | | bloqué si le signal arrive au mauvais moment... | | | | * Ce problème peut être corrigé en utilisant siglongjmp/sigsetjmp. | `--------------------------------------------------------------------*/ int h = 0; // Variable en zone statique pour essayer de tester le // passage dans le handler. void f_alarm (int s) { h = 1; 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); alarm(n); // Demande que SIGALRM me soit généré dans n secondes. if (h == 0) // Problème: le signal peut être délivré après le test, // mais avant pause(); Dans ce cas, le processus // restera bloqué sur pause(). pause(); sigaction(SIGALRM, &old, NULL); // Rétablissement de l'ancien handler. return EXIT_SUCCESS; }