2009-07-21 125 views
82

我有一些在Windows上編譯的源代碼。我將它轉換爲在Red Hat Linux上運行。在C到毫秒中是否有另一種睡眠功能?

源代碼包含<windows.h>頭文件,程序員使用Sleep()函數等待幾毫秒。這在Linux上不起作用。

但是,我可以使用sleep(seconds)函數,但它在幾秒鐘內使用整數。我不想將毫秒轉換爲秒。有沒有一種替代睡眠函數可以在Linux上使用gcc編譯?

+0

`睡眠(/ *秒* /)``的作品,但如果我用`printf的使用( 「有所爲有所不爲」) `沒有`\ n`,它不起作用。 – EsmaeelE 2017-11-26 13:33:40

+0

爲了在這種情況下使用,我們必須在每個`printf()`之後用`fflush(stdout);`清空輸出` – EsmaeelE 2017-11-26 13:47:29

回答

124

有 - 年長POSIX標準中定義usleep(),所以這是可用於Linux:

int usleep(useconds_t usec); 

說明

的usleep()函式函數暫停爲 調用進程的執行(至少) usec微秒。睡眠可能會稍微延長任何系統活動或花在處理呼叫上的時間或系統定時器粒度的 。

usleep()需要微秒,所以你將有1000以毫秒睡覺乘以輸入。


usleep()已被棄用,隨後從POSIX中刪除;爲新的代碼,nanosleep()優選:

#include <time.h> 

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

說明

nanosleep()暫停調用線程的執行,直到至少在*req指定的時間已經過去時,或 遞送的信號的那觸發 調用線程中的處理程序的調用,或者終止該進程。

結構timespec用於指定納秒級精度的時間間隔。它的定義如下:

 struct timespec { 
      time_t tv_sec;  /* seconds */ 
      long tv_nsec;  /* nanoseconds */ 
     }; 
13
#include <unistd.h> 

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

或者到usleep(),(雖然它確定了到2004年POSIX,這顯然是可用於Linux和其他平臺符合POSIX標準的歷​​史)未在2008年POSIX定義的,POSIX 2008標準定義nanosleep()

nanosleep - 高分辨率睡眠

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

nanosleep()功能將引起CURREN t線程暫停執行,直到rqtp參數指定的時間間隔已經過去或信號傳遞給調用線程,其動作是調用捕獲信號函數或終止進程。由於參數值四捨五入到睡眠分辨率的整數倍或由於系統調度其他活動,因此暫停時間可能比請求的時間長。但是,除了被信號中斷的情況外,中斷時間不得少於由系統時鐘CLOCK_REALTIME測量的rqtp指定的時間。使用nanosleep()函數不會影響任何信號的動作或阻塞。

28

你可以使用這個跨平臺的功能:在`

#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 
}