睡在Windows,Linux和Solaris,HP-UX,IBM AIX,VxWorks的风河Li

2019-07-19 17:04发布

我必须写它有睡毫秒的C程序,它具有在各种平台如Windows,Linux和Solaris,HP-UX,IBM AIX,VxWorks和Linux的Windriver的运行

  • 在视窗中, Sleep系统调用将只在毫秒工作。
  • 在Linux的 , sleep将工作于秒; usleep将在微秒执行,它在Solaris上的可用也。
  • 在Vxworks下 ,我希望能够实现使用taskDelaysysClkRateSet

如何能够做到在HP-UX,IBM AIX和Wind River Linux这个毫秒睡眠?

Answer 1:

Propably使用平台特定的包装#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
}

更新

参考下面乔纳森的评论此版本:请找一个更现代,更便携(}和以及修正):

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


Answer 2:

考虑select空FD集和需要的溢出。 从man select

某些代码调用select()与所有三套空,NFDS零,一个非空超时一个相当简便的方式与亚秒级精确睡觉。

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



Answer 3:

我注意到,usleep已经过时了,但比简单了nanosleep它的很多。 所以,我用它当我需要的增强睡眠,将允许从秒调整方便调试时,我的脚本以毫秒为生产零。

这贪睡功能结合了睡眠和usleep的优势,使您可以输入一个整数或浮点数为您所需的延迟和0.1会睡一秒钟的第10,而3会睡3秒。 3.5秒被视为3秒。

测试在Linux薄荷18.3(Ubuntu的16.04.9)为C和C ++用gcc 5.4.0。

#include <unistd.h>

void snooze(double t) {(t > 1.0) ? sleep(t) : usleep(t*1000000);}

snooze(0.01);  // call function to sleep for 10ms



为了完整,这是一个了nanosleep版本。 这可能比usleep版本更准确,更不会被淘汰的威胁。

#include <time.h>
#include <math.h>

void snooze(double t) {
    struct timespec req = {t, fmod(t, 1.0) * 1E9};
    nanosleep(&req, NULL);
}

// struct timespec req = {t, fmod(t, 1.0) * 1E9};
//  is equivalent to:
// struct timespec req = {0};
// req.tv_sec = t;
// req.tv_nsec = fmod(t, 1.0) * 1000000000L;

// NULL as value for *rem so no resumption after signal interrupts

snooze(1.99);  // call for delay of 1.99 seconds

正如建议@alk ,以下版本返回一个应该出现所谓的休眠功能的错误或0,如果成功。 限定结构REM(癌宁)的信号中断之后也允许恢复。

int snooze(double t) {
    return (t > 1.0) ? sleep(t) : usleep(t*1000000);
}

int snooze(double t) {
    struct timespec req = {t, fmod(t, 1.0) * 1E9};
    struct timespec rem = {0, 0.0};
    return nanosleep(&req, &rem);
}


文章来源: Sleeping for milliseconds on Windows, Linux, Solaris, HP-UX, IBM AIX, Vxworks, Wind River Linux?