Tâche périodique sous Linux

Je veux écrire un programme C qui exécute périodiquement une tâche (par exemple, imprimer quelque chose sur la console).

Je l’ai implémenté en utilisant nanosleep comme ci-dessous. Toutes les 500 ms, la fonction ‘func’ est appelée.

#include  #include  void func(void); int main() { struct timespec mytimespec; mytimespec.tv_sec = 0; mytimespec.tv_nsec = 500000000; /* 500 ms */ while(1) { func(); nanosleep(&mytimespec,NULL); } return 0; } void func(void) { printf("This would be printed periodically\n"); } 

Ci-dessus fonctionne correctement. Cependant, j’ai des doutes: –

  • Cela fonctionnerait-il correctement s’il y a plusieurs threads et qu’un thread s’appuie sur nanosleep pour effectuer la tâche périodique?

  • Existe-t-il un moyen de générer un thread périodique sous Linux? Ou, pour utiliser un rappel du minuteur?

Vous devriez lire time (7) (et peut-être signal (7) …). Vous voulez probablement une boucle d’événement (du moins si votre programme effectue des entrées). Cette boucle est basée sur un appel système multiplexé tel que poll (2) (voir aussi ceci et cela répond). De nombreuses bibliothèques proposent des boucles d’événements, notamment libevent , libev , Gtk / Glib, Qt, …

Timerfd_create (2) pourrait également vous intéresser (en plus d’autres solutions plus traditionnelles).

Et lisez la programmation Linux avancée

timer_create sera l’appel système que vous recherchez.

il a une structure de sigaction qui spécifie comment le rappel doit être appelé.

vous devez initialiser le membre it_interval dans l’argument newvalue de la fonction timer_settime afin que la fonction enregistrée dans la structure sigaction soit appelée chaque it_interval.

la fonction peut être un gestionnaire de signal, un thread qui sera exécuté à l’expiration du temporisateur.

voir la page de manuel timer_create pour plus d’informations à ce sujet.

Il y a plusieurs façons selon la tâche:

1) Vous pouvez utiliser une horloge temps réel (man rtc)

2) Vous pouvez utiliser cron (processus de génération tous les processus par timer)

3) Vous pouvez utiliser select / pselect (c’est bon pour de petits intervalles de temps pour la génération périodique de threads)

 /* Wait up to five seconds. */ tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, 0, 0, 0, &tv); 

Et si vous surveillez des fichiers / répertoires, vous pouvez utiliser inotify.

Cela fonctionnerait-il correctement s’il y a plusieurs threads et qu’un thread s’appuie sur nanosleep pour effectuer la tâche périodique?

La fonction nanosleep() ne renverra pas plus tôt que ce que vous avez spécifié dans ses arguments (sauf si elle est interrompue par le gestionnaire de signaux ou rencontre une erreur). Mais cela peut revenir plus tard (généralement un peu plus tard).

S’il vous plaît, jetez un oeil à l’article suivant: http://www.drdobbs.com/soft-real-time-programming-with-linux/184402031 – il semble expliquer les temporisateurs de manière satisfaisante.

Existe-t-il un moyen de générer un thread périodique sous Linux? Ou, pour utiliser un rappel du minuteur?

Jetez un coup d’œil sur les timers: http://man7.org/linux/man-pages/man2/timer_create.2.html