也许使用特定于平台的#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
}
更新
参考下面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
}
usleep()
被标记为“过时”,并在POSIX 2008中被删除。首选替代方法是 nanosleep()
。POSIX的一般趋势是更喜欢具有纳秒分辨率的 struct timespec
,而不是仅具有微秒分辨率的 struct timeval
或使用微秒分辨率但不使用结构的 usleep()
。 - Jonathan Leffler#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所建议的那样,以下版本将返回被调用的 sleep 函数的错误(如果发生错误)或 0(如果成功)。定义结构 rem(aining) 也允许在信号中断后恢复。
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);
}
select
操作。根据man select
:
有些代码在所有三个集合都为空,nfds为零,并且timeout非空的情况下调用select()函数,这种方法可以实现以亚秒精度的方式进行睡眠,而且相当可移植。
实际上,对于任何非Windows系统,这可能是最佳解决方案。
select
是不可用的。 - rashok
usleep
是 POSIX 规范的,因此应该在所有符合 POSIX 标准的系统(如 HP/UX、AIX 等)中都存在。不过,它已经被标记为过时,推荐使用nanosleep
,而后者则被标记为可选项。 - Some programmer dude