Comment implémenter une timer en c?

Nous voulons append une timer à notre programme C sous la plate-forme Linux.

Nous essayons d’envoyer les paquets et nous voulons savoir combien de paquets sont envoyés en une minute. Nous voulons que la timer s’exécute en même temps que la boucle while pour l’envoi du paquet est en cours d’exécution. Par exemple:

  while(1) { send packets; } 

Cette boucle continuera à envoyer les paquets jusqu’à ce que vous appuyiez sur ctrl-z. La timer doit être utilisée pour arrêter la boucle après 60 secondes.

Vous pouvez faire quelque chose comme ça:

 #include  #include  #include  volatile int stop=0; void sigalrm_handler( int sig ) { stop = 1; } int main(int argc, char **argv) { struct sigaction sact; int num_sent = 0; sigemptyset &sact.sa_mask); sact.sa_flags = 0; sact.sa_handler = sigalrm_handler; sigaction(SIGALRM, &sact, NULL); alarm(60); /* Request SIGALRM in 60 seconds */ while (!stop) { send_a_packet(); num_sent++; } printf("sent %d packets\n", num_sent); exit(0); } 

Si le temps système de la boucle s’avère excessif, vous pouvez l’amortir en envoyant N paquets par itération et en incrémentant le compte de N à chaque itération.

Il suffit de vérifier l’heure à chaque itération de la boucle et au bout d’une minute, de compter le nombre de paquets que vous avez envoyés.

Modifier modifié pour refléter ce que la question demande réellement!

 time_t startTime = time(); // return current time in seconds int numPackets = 0; while (time() - startTime < 60) { send packet numPackets++; } printf("Sent %d packets\n", numPackets); 

Vous pouvez également vérifier ceci http://www.gnu.org/software/libc/manual/html_node/Setting-an-Alarm.html pour définir des temporisateurs qui enverront des signaux à votre processus et vous pourrez arrêter la boucle while.

Regardez la fonction time() standard time() .

Voici l’extrait de code d’itimer qui peut être utilisé pour différents intervalles de temps sur C avec la plate-forme Linux:

  #include  #include  #include  #include  void timer_handler (int signum) { static int count = 0; printf ("timer expired %d times\n", ++count); } int main () { struct sigaction sa; struct itimerval timer; /* Install timer_handler as the signal handler for SIGVTALRM. */ memset (&sa, 0, sizeof (sa)); sa.sa_handler = &timer_handler; sigaction (SIGVTALRM, &sa, NULL); /* Configure the timer to expire after 1 sec... */ timer.it_value.tv_sec = 1; timer.it_value.tv_usec = 0; /* ... and every 1000 msec after that. */ timer.it_interval.tv_sec = 1; timer.it_interval.tv_usec = 0; /* Start a virtual timer. It counts down whenever this process is * executing. */ setitimer (ITIMER_VIRTUAL, &timer, NULL); /* Do busy work. */ while (1); sleep(1); } 

J’espère que ça va aider.

Utilisez les structures de données wheetimer (et sa variante) pour implémenter des timers.

homme 3 sumil:

NOM sleep – Veille pendant le nombre de secondes spécifié

SYNOPSIS #include

  unsigned int sleep(unsigned int seconds);