I have to write a C program which has to sleep for milliseconds, which has to run on various platforms like Windows, Linux, Solaris, HP-UX, IBM AIX, Vxworks, and Windriver Linux
Sleep
system call will work on milliseconds only. sleep
will work on seconds; usleep
will perform on microseconds and it's available on Solaris also.taskDelay
and sysClkRateSet
.How can I achieve this millisecond sleep on HP-UX, IBM AIX and Wind River Linux?
Propably a wrapper using platform specific #define
s will do:
#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
}
Update
Referring to Jonathan's comment below, please find a more modern, more portable (and as well corrected :}) version here:
#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
}
Consider select
with empty FD sets and the timeout you want. From man select
:
Some code calls select() with all three sets empty, nfds zero, and a non-NULL timeout as a fairly portable way to sleep with subsecond precision.
Actually it might be the best solution for any non-Windows system.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With