2009-07-21 5 views
82

Ich habe Quellcode, der unter Windows kompiliert wurde. Ich konvertiere es um auf Red Hat Linux zu laufen.Gibt es eine alternative Schlaffunktion in C bis Millisekunden?

Der Quellcode enthält die Header-Datei <windows.h>, und der Programmierer hat die Sleep()-Funktion verwendet, um eine Zeitspanne von Millisekunden zu warten. Dies wird auf Linux nicht funktionieren.

Allerdings kann ich die sleep(seconds) Funktion verwenden, aber das verwendet Integer in Sekunden. Ich möchte keine Millisekunden in Sekunden umwandeln. Gibt es eine alternative Schlaffunktion, die ich mit GCC-Kompilierung unter Linux verwenden kann?

+0

'sleep (/ * Sekunden * /)' in '' funktioniert, aber wenn ich mit 'printf ("einige Dinge") 'ohne' \ n', es funktioniert nicht. – EsmaeelE

+0

In diesem Fall müssen wir die Ausgabe mit 'fflush (stdout);' nach jedem 'printf()' 'spülen. – EsmaeelE

Antwort

124

Ja - ältere POSIX Standards definiert usleep(), so ist dies unter Linux zur Verfügung:

int usleep(useconds_t usec); 

BESCHREIBUNG

Die usleep() Funktion für (zumindest) die Ausführung des aufrufenden Prozesses aussetzt Usec Mikrosekunden. Der Ruhezustand kann geringfügig verlängert werden durch Systemaktivität oder durch die Zeit, die für die Verarbeitung des Anrufs aufgewendet wird, oder durch die Granularität der Systemzeitgeber .

usleep() nimmt Mikrosekunden, so dass Sie die Eingabe von 1000, um in Millisekunden zu schlafen multiplizieren müssen.


usleep() seit veraltet und wird anschließend von POSIX entfernt; für neuen Code wird nanosleep() bevorzugt:

#include <time.h> 

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

BESCHREIBUNG

nanosleep(), bis die Ausführung des aufrufenden Threads suspendiert entweder zumindest die angegebene Zeit in *req verstrichen ist, oder die Lieferung eines Signals, das löst den Aufruf eines Handlers im aufrufenden Thread aus oder beendet den Prozess.

Die Struktur timespec wird verwendet, um Zeitintervalle mit einer Genauigkeit im Nanosekundenbereich anzugeben. Es ist wie folgt definiert:

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

Jenseits usleep, die bescheidenen select mit NULL-Datei Deskriptormengen Sie mikrosekundengenau anhalten lassen, und ohne das Risiko von Komplikationen SIGALRM.

sigtimedwait and sigwaitinfo bieten ähnliches Verhalten.

+0

Ein potenziell nützlicher cleverer Trick ... – mickeyf

13
#include <unistd.h> 

int usleep(useconds_t useconds); //pass in microseconds 
26

Alternativ zu usleep(), die nicht in POSIX 2008 definiert ist (obwohl es zu POSIX 2004 definiert wurde, und es ist offensichtlich auf Linux und anderen Plattformen mit einer Geschichte von POSIX Compliance), die POSIX-2008-Standard nanosleep() definiert:

nanosleep - hochauflösende Schlaf

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

Die nanosleep() Funktion soll die curren verursachen Der Thread wird von der Ausführung suspendiert, bis entweder das durch das Argument rqtp angegebene Zeitintervall verstrichen ist oder ein Signal an den aufrufenden Thread geliefert wird, und seine Aktion besteht darin, eine Signalfangfunktion aufzurufen oder den Prozeß zu beenden. Die Aussetzungszeit kann länger als angefordert sein, da der Argumentwert auf ein ganzzahliges Vielfaches der Schlafauflösung aufgerundet wird oder weil andere Aktivitäten vom System geplant werden. Außer dem Fall der Unterbrechung durch ein Signal darf die Aussetzzeit nicht geringer sein als die Zeit, die durch rqtp, gemessen durch die Systemuhr CLOCK_REALTIME, angegeben wird.

Die Verwendung der Funktion nanosleep() hat keinen Einfluss auf die Aktion oder Blockierung eines Signals.

28

Sie diese Cross-Plattform-Funktion verwenden können:

#ifdef WIN32 
#include <windows.h> 
#elif _POSIX_C_SOURCE >= 199309L 
#include <time.h> // for nanosleep 
#else 
#include <unistd.h> // for usleep 
#endif 

void sleep_ms(int milliseconds) // cross-platform sleep function 
{ 
#ifdef WIN32 
    Sleep(milliseconds); 
#elif _POSIX_C_SOURCE >= 199309L 
    struct timespec ts; 
    ts.tv_sec = milliseconds/1000; 
    ts.tv_nsec = (milliseconds % 1000) * 1000000; 
    nanosleep(&ts, NULL); 
#else 
    usleep(milliseconds * 1000); 
#endif 
} 
+1

Wenn wir' _POSIX_C_SOURCE> = 199309L' nicht haben, wie im Fall von "-ansi" oder "-std = c89" würde ich "struct timeval tv" empfehlen; tv.tv_sec = Millisekunden/1000; tv.tv_usec = Millisekunden% 1000 * 1000; Wählen Sie (0, NULL, NULL, NULL, 'anstelle von' usleep (Millisekunden * 1000); '. Kredit geht [hier] (http://Stackoverflow.com/a/264378/5472899). –

Verwandte Themen