2010-09-05 11 views
2

J'utilise une minuterie dans mon code C++ via la fonction setitimer de sys/time.h. Cela mappe le signal SIGALRM à ma méthode de gestionnaire de minuterie. Après cela, je ne suis pas capable d'utiliser la fonction de sommeil. Je suppose que c'est parce que le sommeil utilise aussi le signal SIGALRM. Pouvez-vous suggérer une solution de contournement pour ce problème?Utilisation de Sleep() lors de l'utilisation de timers via setitimer

Merci de répondre.

+0

+1 Je suis sûr que je vais rencontrer ce problème moi-même tôt ou tard. – FireAphis

Répondre

3

Vous pouvez essayer d'utiliser select() uniquement en tant que temporisateur. Je ne sais pas s'il utilise SIGALRM ou non mais il devrait être simple à tester. Quelque chose comme:

timeval t = {1, 0}; 

    select(0, NULL, NULL, NULL, &t); 
+0

ACE utilise select pour implémenter le timer, donc je suppose que votre suggestion devrait fonctionner. – FireAphis

6

De l'alarm(2)man page:

sleep() peut être mis en œuvre à l'aide SIGALRM; mélanger les appels à alarm() et sleep() est une mauvaise idée.

Certaines implémentations n'utilisent pas SIGALRM, trouvez une machine comme celle-là et vous êtes prêt. Sinon, vous pouvez essayer nanosleep(); il est mis en œuvre en toute sécurité. De l'nanosleep(2)man page:

Par rapport à sleep(3) et usleep(3), nanosleep() a l'avantage de ne pas affecter les signaux, il est normalisé par POSIX, il fournit une meilleure résolution, et il permet de poursuivre un sommeil qui a été interrompu par un signal plus facilement.

+0

nanosleep est le chemin à parcourir. – SkypeMeSM

0

Je voudrais utiliser une bibliothèque qui donne une abstraction à ces services du système d'exploitation. J'utilise ACE bibliothèque pour les timers et les dortoirs (ACE_OS::sleep, ACE_Reactor::schedule_timeout) et ils travaillent ensemble sans aucun problème. Autant que je sache ACE utilise select pour ses minuteries. Je suppose que boost::thread::sleep et boost::asio::deadline_timer accompliront également la tâche avec succès.

+0

Malheureusement, il est nécessaire que je n'utilise pas de bibliothèques tierces. Je ne peux pas utiliser Boost ou ACE :(. – SkypeMeSM

+0

Eh bien, alors je suppose que Carl vient de donner la réponse définitive :) (en cours d'exécution à son poste pour voter vers le haut). – FireAphis