J'ai du code source qui a été compilé sur Windows. Je le convertis pour qu'il fonctionne sur Red Hat Linux.
Le code source a inclus le <windows.h>
fichier d'en-tête et le programmeur a utilisé la Sleep()
fonction pour attendre une période de millisecondes. Cela ne fonctionnera pas sous Linux.
Cependant, je peux utiliser la sleep(seconds)
fonction, mais cela utilise un entier en secondes. Je ne veux pas convertir des millisecondes en secondes. Existe-t-il une fonction de veille alternative que je peux utiliser avec la compilation gcc sous Linux?
sleep(/*seconds*/)
dans les<unistd.h>
œuvres, mais si j'utiliseprintf("some things")
sans\n
, cela ne fonctionne pas.fflush(stdout);
après chaqueprintf()
Réponses:
Oui - les normes POSIX plus anciennes sont définies
usleep()
, elles sont donc disponibles sous Linux:usleep()
prend des microsecondes , vous devrez donc multiplier l'entrée par 1000 pour dormir en millisecondes.usleep()
a depuis été obsolète et par la suite supprimé de POSIX; pour le nouveau code, ilnanosleep()
est préférable:Un exemple de
msleep()
fonction implémentée en utilisantnanosleep()
, en continuant le sommeil s'il est interrompu par un signal:la source
Vous pouvez utiliser cette fonction multiplateforme:
la source
_POSIX_C_SOURCE >= 199309L
, comme dans le cas de-ansi
ou-std=c89
, je recommanderais d'utiliser à lastruct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);
place deusleep(milliseconds * 1000);
. Le crédit va ici .nanosleep()
documentation: man7.org/linux/man-pages/man2/nanosleep.2.html . Il serait utile de publier les liens de documentation pour chaque fonction spécifique à la plate-forme utilisée ici.gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
Linux Ubuntu, avec la version gcc 4.8.4, je reçois l'avertissement suivant:warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
. La solution consiste à ajouter les 2 définitions suivantes tout en haut de votre code: 1)#define __USE_POSIX199309
et 2)#define _POSIX_C_SOURCE 199309L
. Les deux sont nécessaires pour obtenir le code à compiler sans aucun avertissement (et pour utiliser également lananoseconds()
fonction, dont il dispose).Alternativement
usleep()
, qui n'est pas défini dans POSIX 2008 (bien qu'il ait été défini jusqu'à POSIX 2004, et il est évidemment disponible sur Linux et d'autres plates-formes avec un historique de conformité POSIX), le standard POSIX 2008 définitnanosleep()
:la source
Au-delà de l' usleep , l'humble select avec des ensembles de descripteurs de fichiers NULL vous permettra de faire une pause avec une précision de l'ordre de la microseconde, et sans risque de
SIGALRM
complications.sigtimedwait et sigwaitinfo offrent un comportement similaire.
la source
la source
la source