2013-02-11 3 views
7

私はWindowsでは、Windows、Linux、Solaris版、HP-UX、IBM AIX、VxWorksの、およびWinDriverのLinuxのWindows、Linux、Solaris、HP-UX、IBM AIX、Vxworks、Wind River Linuxのスリープ時間は何ミリ秒ですか?

  • のような様々なプラットフォーム上で実行するために持っている、ミリ秒間スリープ状態に持っているCプログラムを記述する必要がありますSleepシステムコールはミリ秒単位でのみ動作します。
  • Linuxの場合、sleepは秒単位で動作します。 usleepはマイクロ秒単位で実行され、Solarisでも利用可能です。
  • には、taskDelaysysClkRateSetを使用して実装することができます。

HP-UX、IBM AIX、およびWind River Linuxでこのミリ秒のスリープを達成するにはどうすればよいですか?

+1

['usl​​eep'](http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html)はPOSIXなので、POSIXに準拠するすべてのシステム(HP/UX、AIXなど)にあるべきです。一方で、オプションであるとマークされている['nanosleep'](http://pubs.opengroup.org/onlinepubs/009695399/functions/nanosleep.html)では古くなったとマークされています。 –

+1

nミリ秒の遅延を*表現する方法があるかもしれないからといって、ホストオペレーティングシステムがあなたに求めているものを正確にあなたに*与えることは絶対にありません。あなたがリストしているOSは、通常はリア​​ルタイムではないので、そのようなことを保証するものではありません。遅延が終了すると、より高い優先度のタスクがCPUを占有する可能性があります。 – unwind

+0

以下のリンクはあなたの質問に答えますか? http://stackoverflow.com/questions/1157209/is-there-an-alternative-sleep-function-in-c-to-milliseconds – kunal18

答えて

1

selectと空のFDセットとタイムアウトを考慮してください。 man selectから:

いくつかのコードは、空のすべての3つのセットでselect()を呼び出して、ゼロをnfds個、そしてかなりポータブルな方法として 非NULLタイムアウトが秒未満 精度と一緒に寝て。

実際には、Windows以外のシステムに最適なソリューションです。

+0

ご返信ありがとうございます。現在はこれを使用していますが、一部のプラットフォームでは 'select'は利用できません。 windriver Linuxのように 'select'は利用できません。 – rashok

13

Propablyプラットフォーム固有の#define Sを使用してラッパーを行います:

#if defined(WIN32) 
    #include <windows.h> 
#elif defined(__UNIX__) 
    #include <unistd.h> 
#else 
#endif 

... 

int millisleep(unsigned ms) 
{ 
#if defined(WIN32) 
    SetLastError(0); 
    Sleep(ms); 
    return GetLastError() ?-1 :0; 
#elif defined(LINUX) 
    return usleep(1000 * ms); 
#else 
#error ("no milli sleep available for platform") 
    return -1; 
#endif 
} 

更新

Jonathan's comment belowを参照して、より近代的な、よりポータブル(そして同様に修正を見つけてください。 })バージョン:

#if defined(WIN32) 
    #include <windows.h> 
#elif defined(__unix__) 
    #include <time.h> 
    #include <unistd.h> 
#else 
#endif 

... 

int millisleep(unsigned ms) 
{ 
#if defined(WIN32) 

    SetLastError(0); 
    Sleep(ms); 
    return GetLastError() ?-1 :0; 

#elif _POSIX_C_SOURCE >= 199309L 

    /* prefer to use nanosleep() */ 

    const struct timespec ts = { 
    ms/1000, /* seconds */ 
    (ms % 1000) * 1000 * 1000 /* nano seconds */ 
    }; 

    return nanosleep(&ts, NULL); 

#elif _BSD_SOURCE || \ 
    (_XOPEN_SOURCE >= 500 || \ 
    _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ 
    !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) 

    /* else fallback to obsolte usleep() */ 

    return usleep(1000 * ms); 

#else 

# error ("No millisecond sleep available for this platform!") 
    return -1; 

#endif 
} 
+0

これは本当にとても良い答えです。 –

+0

POSIX 2004では、['usl​​eep()'](http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html)の呼び出しは '陳腐化'とマークされていました。それはPOSIX 2008から削除されました。好ましい選択肢は['nanosleep()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html)です。POSIXの一般的な傾向は、マイクロ秒の分解能しか持たない 'struct timeval'や構造体を使わずにマイクロセカンド分解能で動作する' usleep() 'のような代わりに、ナノ秒の分解能を持つ' struct timespec'を選ぶことですあまりにも。 –

+0

@JonathanLeffler:通知してくれてありがとう。修正されました。 – alk

関連する問題