Attendre un certain temps
Il existe différentes solutions pour faire attendre un certain temps un processus.
Tout dépendant de ce que l'on attendra...
Il y a la mise en attente d'un signal: pause() ou de la mort d'un processus fils wait()
Mais ici, nous voulons attendre un certain temps:
Il existe pour cela la fonction sleep() qui attend un paramètre qui est le nombre de seconde à attendre.
Le processus est alors mis en sommeil et le noyau ne resortira pas ce processus de la file des gestions des processus avant que le délai imparti ne soit écoulé ou qu'un signal non-ignoré soit réceptionné.
#include <unistd.h>
unsigned int sleep (unsigned int nb_sec);
En entrée: Le nombre de seconde
En sortie:zéro si le temps prévu s'est écoulé, ou le nombre de secondes restantes si un signal a réveillé le processus.
Ne pas utiliser
la fonction sleep() conjointement avec la fonction alarm()
La fonction sleep()
ne permet pas d'attendre moins d'une seconde...d'où une autre solution
qui suit !
Il existe une autre solution pour faire attendre un processus:
Il s'agit d'utiliser la fonction select() en principe utilisée pour connaître l'état d'un ou plusieurs fichiers à partir de leur descripteur durant une période précisée.
Il suffit de passer 0 au plus grand nombre de descripteur traité, NULL pour les trois tampons readfds, writefds et exceptfds et d'indiquer dans la structure timeout le nombre de seconde et/ou de milliseconde à attendre.
Enfin, il y a aussi la fonction setitimer et getitimer:
getitimer, setitimer - Lire / écrire la valeur d'une temporisation.
L'include suivant étant nécessaire:
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *ivalue, struct itimerval *ovalue);
Ces deux fonctions utilisent une structure itimerval
Par exemple pour programmer 50000 millisecondes qui sera à répéter à l'infini:
struct itimerval value;
value.it_interval.tv_sec = 0; /* 0 seconde */
value.it_interval.tv_usec = 50000; /* 50000 millisecondes sera à positionner
dans it_value lorsque le temps sera écoulé */
value.it_value.tv_sec = 0; /* Zero seconde */
value.it_value.tv_usec = 50000; /* 50000 milliseconde valeur courante du compteur
qui ira décroissant dans le temps pour atteindre 0 */
Avant de déclencher la fonction itimer, vous pourrez intercepter et déclencher une procédure sur le signal SIGALRM. En effet, setitimer indique que le temps est écoulé (it_value = 0) en déclenchent un signal SIGALRM
Setitimer positionne la temporisation avec les valeurs de ivalue. Si ovalue est non nulle, les valeurs précédentes de la temporisation y seront stockées.
La temporisation va décroissant sur it_value jusqu'à zéro. A 0, un signal SIGALARM est émis. et it_value est repositionnée à it_interval. Une temporisation s'arrête si elle est mise à zéro (it_value vaut zéro) ou bien elle expire et it_interval vaut zéro.
En sortie, ces deux fonctions retournent:
0 s'ils réussissent, ou -1 s'ils échouent, Dans ce cas errno
contient le code d'erreur.
EFAULT value ou ovalue pointent en dehors de l'espace d'adressage accessible.
EINVAL which n'est pas dans la liste ITIMER_REAL, ITIMER_VIRT, ou ITIMER_PROF.
// On indique la fonction a appeler lors de la réception d'un sigalrm
signal (SIGALRM, fsig);
// On lance le timer
setitimer( ITIMER_REAL, &value, 0 );