我注意到 usleep 已经过时了,但它比 nanosleep 简单得多。因此,当我需要增强睡眠时,我会使用它,以便在调试脚本时轻松调整到毫秒或零以进行生产。
这个贪睡功能结合了 sleep 和 usleep 的优点,因此您可以输入 int 或 float 以获得所需的延迟,并且 0.1 将休眠 10 秒,而 3 将休眠 3 秒。3.5 秒被视为 3 秒。
在 Linux Mint 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所建议的,以下版本在发生 1 时返回被调用的 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);
}