// Arlotto 2009: Exemple d'utilisation de alarm // Utiliser de préférence sigaction() plutôt que signal() // int sigaction(int sig , const struct sigaction *newaction , struct sigaction * oldaction); // sigaction installe un gestionnaire pour le signal sig. // Si oldaction n'est pas NULL l'ancienne installation est sauvée dans oldaction // Si newaction n'est pas NULL la nouvelle installation est prise dans newaction // La structure struct sigaction contient au moins les champ suivant : // void (*) (int) sa_handler : fonction gestionnaire du signal // sigset_t sa_mask : signaux à bloquer dans sa_handler // int sa_flags : modificateur de l'action du signal // Par défaut avec sigaction le gestionnaire n'est pas réinstallé après réception du signal. // Il faut mettre SA_RESTART dans sa_flags pour réinstaller le gestionnaire automatiquement. // avec SA_RESETHANDLER on remet le gestionnaire par défaut après réception du signal. #include #include #include volatile int g = 0 ; void tempo(int sig ) { printf("Recu signal %d\n",sig); // on ne devrait pas appeler printf dans un gestionaire de signal g=1 ; // car elle n'est pas réentrante. } int main(void) { int i=0; struct sigaction action ; action.sa_handler = tempo ; // fonction tempo exécutée sur réception signal ALRM sigemptyset(&action.sa_mask); // aucun signal bloqué (masque vide emptyset); action.sa_flags = SA_RESTART ; // reinstallation du handler après réception du signal sigaction(SIGALRM,&action,NULL); while(i<4) { alarm( 3 + i ); // génère un signal ALRM dans 3+i secondes g=0; printf("Attente tempo pendant %ds\n",3+i); while ( g==0 ) ; // bloque tant que tempo pas exécutée. printf("ok\n"); i++; } return 0 ; }