在Windows,Linux,Solaris,HP-UX,IBM AIX,Vxworks,Wind River Linux上睡眠毫秒?

ras*_*hok 11 c sleep system-calls milliseconds

我必须编写一个必须休眠几毫秒的C程序,它必须在各种平台上运行,如Windows,Linux,Solaris,HP-UX,IBM AIX,Vxworks和Windriver Linux

  • Windows上,Sleep系统调用仅在毫秒内有效.
  • Linux上,sleep将在几秒钟内工作; usleep将在微秒上执行,它也可以在Solaris上使用.
  • Vxworks中,我希望我可以使用taskDelay和实现sysClkRateSet.

如何在HP-UX,IBM AIX和Wind River Linux上实现这种毫秒级睡眠?

alk*_*alk 16

使用特定平台的包装器#define可以做到:

#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
}
Run Code Online (Sandbox Code Playgroud)

更新

请参阅下面的Jonathan的评论,请在这里找到更现代,更便携(以及更正:})的版本:

#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
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*nko 1

考虑select使用空 FD 集和您想要的超时。从man select

一些代码在所有三个集合为空、nfds 为零和非 NULL 超时的情况下调用 select(),作为一种相当可移植的以亚秒精度睡眠的方式。

实际上,它可能是任何非 Windows 系统的最佳解决方案。