Limiter le temps d’exécution d’une partie d’un programme

Problème

Vous voulez limiter le temps d’exécution d’une partie de programme pour reprendre la main si le processus est trop long.

Solution

Mettez en place un gestionnaire de signaux pour le signal ALRM, puis faites appel à alarm().

Discussion

La mise en place du gestionnaire de signaux s’effectue comme expliqué dans la première recette.


struct sigaction sa; 
memset (&sa, 0, sizeof *sa); 
sa.sa_sigaction = alarm_handler; 
sa.sa_flags = 0; 
sigemptyset (&(sa.sa_mask)); 
if (sigaction (SIGALRM, &sa, NULL) != 0) 
  { 
    fprintf (stderr, "Erreur sur sigaction"); 
  }
 

Lorsque vous souhaitez lancer une opération que vous voulez limiter dans le temps, appelez alarm() avant, pour indiquer le temps maximum autorisé en secondes, et alarm() avec un argument nul pour désactiver l’envoi du signal. Voici un exemple qui limite à 2 minutes le temps d’exécution d’une opération :


alarm (120); 
operation (); 
alarm (0);
 

Le plus délicat dans la limitation du temps d’exécution d’une partie d’un programme est lorsque l’interruption survient. En effet, en fonction de la nature de l’opération, la main ne sera pas rendue au programme de la même manière. Lorsqu’il s’agit d’un appel système, comme read(), l’appel rend la main avec un code d’erreur...

Pour consulter la suite, découvrez le livre suivant :
couv_EI3CACT.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Sauvegarder un gestionnaire de signaux et le restaurer par la suite
Suivant
Introduction