Ich habe einen Quellcode, der unter Windows kompiliert wurde. Ich konvertiere es, um unter Red Hat Linux zu laufen.
Der Quellcode enthält die <windows.h>
Header-Datei und der Programmierer hat die Sleep()
Funktion verwendet, um eine Zeitspanne von Millisekunden zu warten. Dies funktioniert unter Linux nicht.
Ich kann die sleep(seconds)
Funktion jedoch verwenden, aber das verwendet eine Ganzzahl in Sekunden. Ich möchte keine Millisekunden in Sekunden konvertieren. Gibt es eine alternative Schlaffunktion, die ich beim Kompilieren von gcc unter Linux verwenden kann?
sleep(/*seconds*/)
in<unistd.h>
funktioniert, aber wenn ich mitprintf("some things")
ohne benutze\n
, funktioniert es nicht.fflush(stdout);
nach jedemprintf()
Antworten:
Ja - ältere POSIX- Standards sind definiert
usleep()
, daher ist dies unter Linux verfügbar:usleep()
dauert Mikrosekunden , daher müssen Sie die Eingabe mit 1000 multiplizieren, um in Millisekunden zu schlafen.usleep()
wurde inzwischen veraltet und anschließend aus POSIX entfernt; für neuen Codenanosleep()
wird bevorzugt:Eine Beispielfunktion
msleep()
, die implementiert wurde, indemnanosleep()
der Schlaf fortgesetzt wird, wenn er durch ein Signal unterbrochen wird:quelle
Sie können diese plattformübergreifende Funktion verwenden:
quelle
_POSIX_C_SOURCE >= 199309L
, wie im Fall von-ansi
oder-std=c89
, würde ich empfehlen,struct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);
anstelle von zu verwendenusleep(milliseconds * 1000);
. Kredit geht hier .nanosleep()
Dokumentation ist: man7.org/linux/man-pages/man2/nanosleep.2.html . Das Posten der Dokumentationslinks für jede hier verwendete plattformspezifische Funktion wäre hilfreich.gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
Linux Ubuntu mit gcc Version 4.8.4 die folgende Warnung angezeigt wird :warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
. Die Lösung besteht darin , die folgenden 2 Definitionen ganz oben in Ihren Code einzufügen: 1)#define __USE_POSIX199309
und 2)#define _POSIX_C_SOURCE 199309L
. Beide sind erforderlich, um den Code ohne Warnungen kompilieren zu können (und um dienanoseconds()
verfügbare Funktion zu verwenden).Alternativ zu dem
usleep()
, was in POSIX 2008 nicht definiert ist (obwohl es bis zu POSIX 2004 definiert wurde und offensichtlich auf Linux und anderen Plattformen mit einer Historie der POSIX-Konformität verfügbar ist), definiert der POSIX 2008-Standardnanosleep()
:quelle
Über den Schlaf hinaus können Sie mit der bescheidenen Auswahl mit NULL-Dateideskriptorsätzen mit einer Genauigkeit von Mikrosekunden und ohne das Risiko von
SIGALRM
Komplikationen pausieren .sigtimedwait und sigwaitinfo bieten ein ähnliches Verhalten.
quelle
quelle
quelle