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
- On Windows, the
Sleep
system call will work on milliseconds only. - On Linux,
sleep
will work on seconds;usleep
will perform on microseconds and it's available on Solaris also. - In Vxworks, I hope I can implement using
taskDelay
andsysClkRateSet
.
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:Update
Referring to Jonathan's comment below, please find a more modern, more portable (and as well corrected :}) version here:
I note that usleep is obsolescent but its a lot simpler than nanosleep. So I used it when I needed an enhanced sleep that would allow easy adjustment from seconds while debugging my scripts to milliseconds or zero for production.
This snooze function combines the advantages of sleep & usleep so that you can enter an int or float for your desired delay and 0.1 will sleep a 10th of a second while 3 will sleep for 3 seconds. 3.5 seconds is treated as 3 seconds.
Tested on Linux Mint 18.3 (Ubuntu 16.04.9) as C and C++ with gcc 5.4.0.
For completeness, this is a nanosleep version. It's potentially more accurate than the usleep version and isn't threatened by obsolescence.
As suggested by @alk, the following versions return the called sleep function's error should one occur or 0 if successful. Defining the structure rem(aining) also permits resumption after a signal interrupt.
Consider
select
with empty FD sets and the timeout you want. Fromman select
:Actually it might be the best solution for any non-Windows system.