2012-08-29 29 views
0

usleep man看到:它是安全的在Ubuntu使用usleep與值超過100萬

EINVAL 
usec is not smaller than 1000000. (On systems where that is considered an error.) 

所以我想如果其確定在Ubuntu的用價值超過100萬,如果沒有更大的使用usleep (或者如果我想支持其他平臺),當我需要睡眠2.2秒時(例如),有什麼選擇。

謝謝。

+1

用你係統上的大數值調用'usleep()'並檢查'errno'? –

+0

@ Christian.K這意味着應用程序需要至少一秒鐘才能啓動。 – Potatoswatter

+0

對於它的價值,POSIX不需要[usleep](http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html)和[nanosleep](http://pubs.opengroup.org /onlinepubs/009695399/functions/nanosleep.html)工作超過一秒鐘。 – Potatoswatter

回答

1

一種替代方法是信任的文檔,並使用循環只是爲了安全起見實現:

#define USLEEP_MAX (1000000 - 1) 

void long_sleep(unsigned long micros) 
{ 
    while(micros > 0) 
    { 
    const unsigned long chunk = micros > USLEEP_MAX ? USLEEP_MAX : micros; 
    usleep(chunk); 
    micros -= chunk; 
    } 
} 

您也應該檢查的usleep()的返回值,我省略了爲簡潔。

在製作過程中,您可以在編譯時通過Autoconf和朋友檢測合適的USLEEP_MAX,甚至在本地系統沒有參數限制的情況下切換到普通包裝。可以有幾小時的樂趣。

+0

這會漂移,達到時間片每秒的時間片數。休息一會兒休息一會兒,然後休息一會兒可能會更好,但對於任何特定的呼叫,精確度並不能保證。 – Potatoswatter

+0

我可以確認,在窗口下的mingw下,立即調用usleep並傳遞1e6結果。 –

1

你不得不看Linux內核源代碼是100%肯定,但考慮到Ubuntu的僅分佈於x86和x86-64,有人很快就會發現那種行爲不可接受的,無論它是允許的由潛在的POSIX spec,幾乎沒有可能會打破。

Linux被移植到各種各樣的系統端口可以採用其他醜陋的先前存在的內核代碼,所以我認爲當他改編POSIX(或任何)規範來反映非常寬鬆的需求時,以適應slapdash內核的奇數微控制器。

+0

所以,如果我的測試工作,我不需要擔心Ubuntu。 –