186 votes

Existe-t-il une fonction de sommeil alternative en C à des millisecondes?

J'ai du code source qui a été compilé sous Windows. Je suis la conversion à exécuter sur le système Red Hat Linux.

Le code source est inclus l' <windows.h> fichier d'en-tête et le programmeur a utilisé l' Sleep() fonction d'attendre une période de quelques millisecondes. Cela ne fonctionne pas sur Linux.

Cependant, je peux utiliser l' sleep(seconds) de la fonction, mais qui utilise entier en quelques secondes. Je ne veux pas convertir quelques millisecondes à quelques secondes. Est-il une alternative fonction de sommeil que je peux utiliser avec gcc compiler sur Linux?

248voto

caf Points 114951

Oui plus POSIX normes définies usleep(), donc c'est disponible sur Linux:

   int usleep(useconds_t usec);

DESCRIPTION

Le usleep() suspend l'exécution du processus appelant pour (au moins) usec microsecondes. Le sommeil peut être allongé légèrement par toute l'activité du système ou par le temps passé à traiter l'appel ou par le la granularité du système de compteurs.

usleep() prend microsecondes, de sorte que vous devrez multiplier l'entrée par 1000 pour dormir en millisecondes.


usleep() a depuis été déprécié, et par la suite retirés de POSIX; pour le nouveau code, nanosleep() est préféré:

   #include <time.h>

   int nanosleep(const struct timespec *req, struct timespec *rem);

DESCRIPTION

nanosleep() suspend l'exécution du thread appelant jusqu'à ce que au moins le temps spécifié en *req s'est écoulé, ou la la livraison d'un signal qui déclenche l'appel d'un gestionnaire dans la thread appelant ou qui termine le processus.

La structure timespec est utilisé pour spécifier des intervalles de temps avec une précision à la nanoseconde. Elle est définie comme suit:

       struct timespec {
           time_t tv_sec;        /* seconds */
           long   tv_nsec;       /* nanoseconds */
       };

33voto

Jonathan Leffler Points 299946

Sinon pour usleep(), ce qui n'est pas définie dans la norme POSIX s'il est évidemment disponible sur Linux, la norme POSIX définit:

nanosleep - haute résolution de sommeil

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

Le nanosleep() la fonction fait en sorte que le thread en cours à être suspendu à compter de l'exécution jusqu'à ce que l'intervalle de temps spécifié par le rqtp argument est dépassé, ou un signal est délivré pour le thread appelant, et son action est d'invoquer un signal-fonction de capture ou de mettre fin au processus. La période de suspension peut être plus longue que ce qui est demandé, car la valeur de l'argument est arrondi à un multiple entier de la veille de la résolution ou à cause de la tenue d'une autre activité par le système. Mais, sauf pour le cas d'être interrompu par un signal, le temps de suspension ne doit pas être moins que le temps indiqué par rqtp, tel que mesuré par l'horloge du système CLOCK_REALTIME.

L'utilisation de la nanosleep() la fonction n'a aucun effet sur l'action ou de blocage de signal.

27voto

pilcrow Points 20628

Au-delà de la durée normale , les jeux de descripteurs de fichiers select with NULL vous permettront de faire une pause avec une précision de quelques secondes, sans risque de SIGALRM complications.

sigtimedwait et sigwaitinfo offrent un comportement similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X