11

Windows、Linux、Solaris、HP-UX、IBM AIX、Vxworks、Windriver Linux などのさまざまなプラットフォームで実行する必要がある、数ミリ秒間スリープする必要がある C プログラムを作成する必要があります。

  • WindowsではSleepシステム コールはミリ秒単位でのみ機能します。
  • Linuxではsleep数秒で動作します。usleepマイクロ秒単位で実行され、Solaris でも利用できます。
  • Vxworksでは、 と を使用taskDelayして実装できればと思いますsysClkRateSet

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

4

3 に答える 3

16

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

アップデート

以下のジョナサンのコメントを参照して、より現代的で移植性の高い(そして修正された:})バージョンをここで見つけてください:

#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
}
于 2013-02-11T18:49:34.260 に答える
1

select空の FD セットと必要なタイムアウトを検討してください。からman select:

一部のコードは、3 つすべてのセットを空にし、nfds をゼロにし、NULL 以外のタイムアウトを指定して select() を呼び出します。これは、1 秒未満の精度でスリープするかなり移植性の高い方法です。

実際には、Windows 以外のシステムには最適なソリューションかもしれません。

于 2013-02-11T12:54:08.130 に答える