Exécuter une méthode toutes les x secondes dans C

Existe-t-il un exemple de timer de travail qui exécute une fonction toutes les secondes x en utilisant C.

J’apprécierais un exemple de code de travail.

Vous pourriez engendrer un nouveau sujet:

 void *threadproc(void *arg) { while(!done) { sleep(delay_in_seconds); call_function(); } return 0; } ... pthread_t tid; pthread_create(&tid, NULL, &threadproc, NULL); 

Ou, vous pouvez définir une alarme avec alarm(2) ou setitimer(2) :

 void on_alarm(int signum) { call_function(); if(!done) alarm(delay_in_seconds); // Reschedule alarm } ... // Setup on_alarm as a signal handler for the SIGALRM signal struct sigaction act; act.sa_handler = &on_alarm; act.sa_mask = 0; act.sa_flags = SA_RESTART; // Restart interrupted system calls sigaction(SIGALRM, &act, NULL); alarm(delay_in_seconds); // Setup initial alarm 

Bien entendu, ces deux méthodes ont le problème que la fonction que vous appelez périodiquement doit être sûre pour les threads.

La méthode du signal est particulièrement dangereuse car elle doit également être asynchrone, ce qui est très difficile à faire – même quelque chose d’aussi simple que printf est dangereux car printf pourrait allouer de la mémoire et si le SIGALRM interrompait un appel à malloc , vous êtes en difficulté parce que malloc n’est pas rentrant. Je ne recommanderais donc pas la méthode de signal, à moins que vous ne définissiez un indicateur dans le gestionnaire de signal qui sera ensuite vérifié par une autre fonction, ce qui vous ramènera au même endroit que la version threadée.

Il existe différentes méthodes pour y parvenir en utilisant des timers et des signaux, mais je vais présenter deux approches modernes:

Utilisation des temporisateurs POSIX

La fonction POSIX timer_create crée un temporisateur qui peut être configuré pour délivrer une notification unique ou périodique à l’expiration du temporisateur. Lors de la création de la timer, vous pouvez demander soit la livraison via un signal ou un nouveau thread. Étant donné que l’utilisation correcte des signaux est compliquée (il existe des règles ssortingctes sur ce que vous pouvez et ne pouvez pas faire avec un gestionnaire de signaux, et les règles semblent souvent fonctionner jusqu’à ce que vous soyez malchanceux).

Rouler votre propre timer avec un fil

C’est vraiment aussi simple que cela en a l’air. Créez un nouveau fil de discussion qui passe en boucle en dormant et en faisant tout ce dont vous avez besoin à chaque fois que le temps souhaité s’est écoulé.