【发布时间】:2014-09-26 16:05:08
【问题描述】:
我有一个使用nanosleep 的程序(混合C 和Fortran,虽然这似乎不相关)。但是,如果我的 timespec 的 tv_sec 值为 0,它根本不会休眠。 tv_nsec 值可能比整秒差几微秒,但它不会休眠。 (如果tv_sec是1,睡一秒也没问题。)为什么会这样?
为了让事情更加混乱,具有适当值(即995000usec)的usleep 会按预期休眠大约一秒钟。
我在 RHEL 5.8 和 RHEL 6.4 机器上看到了这个问题。两者都使用gcc。
这是调用 nanosleep 的函数:
void msleep(int *milliseconds)
{
long usec;
struct timespec sleep;
usec = (*milliseconds) % 1000;
sleep.tv_sec = (*milliseconds) / 1000;
sleep.tv_nsec = 1000*usec;
nanosleep(&sleep, NULL);
}
显然,我实际上并不需要纳秒级精度!
我还测试了一个我确实检查了返回值的版本;它始终是0(成功),因此rem 输出参数(如果被中断,则剩余时间)从未设置。
【问题讨论】:
-
你
strace你的程序了吗?您是否检查了nanosleep(2) 的返回并在失败时使用了errno(例如通过perror)。你运行什么内核?我有点怀疑:在我所有的应用程序中,nanosleep都按照文档说明工作。请显示一些实际代码! -
您可能想向我们展示您如何调用
nanosleep()以及如何初始化您传入的结构? -
查看新编辑。抱歉,我应该在原帖中解释返回值。
-
对我来说,这看起来好像你缺少 1000 一些地方:[ms]%1000=[ms] 和 [ms]*1000=[us] 但你想要 [ns],所以这应该是
...tv_nsec = ((long)(milliseconds%1000)) * 1000 * 1000,不是吗? -
usec声明在哪里?