0

我遇到了一个do_nanosleep()用 C 命名的方法,我不明白它是如何使用的?我知道一件事与暂停调用线程的执行有关,但该任务由nanosleep()C 处理。如果这是真的,那么do_nanosleep()这里的需要是什么以及它与 有何不同nanosleep()

作为参考,这就是它的作用。

    /* arguments are seconds and nanoseconds */
inline void
do_nanosleep(time_t  tv_sec, long tv_nsec)
{
    struct timespec req;
    req.tv_sec = tv_sec;
    req.tv_nsec = tv_nsec;

    nanosleep(&req, NULL);
}
4

2 回答 2

4

由于do_nanosleep()不是标准功能,您必须在源代码或系统手册中跟踪它,以查看它的作用。它可能是一个可移植性包装器,nanosleep()它在可用时使用,而在它不可用时使用其他东西(usleep()甚至sleep())。它也可能做一些与睡眠完全无关的事情——但它可能确实做了它的名字所暗示的事情。

谷歌还没有(在被问到 5 分钟后)将你的问题编入索引,而且它对do_nanosleep(). 这表明代码应该在您的源代码中,而不是系统手册中。


通过问题中的函数定义,我们可以看到struct timespec,他们可以do_nanosleep()使用两个参数调用,而不是要求用户创建 a ,第一个用于秒,第二个用于秒的小数部分(0..999,999,999 以纳秒为单位) )。然后它调用nanosleep(). 因此,在编写软件的人的心目中,为底层功能do_nanosleep()提供了一个稍微方便的界面。nanosleep()由于它是内联的,因此声明struct timespec必须仍在范围内,所以我不相信我同意作者的观点,但这并不是一个错误的决定。

于 2013-10-12T06:22:31.263 回答
2

看起来它只是 POSIX nanosleep 的简化(和残缺)包装器。

第一个参数是秒数,第二个是纳秒数。

就像,do_nanosleep(3, 500000000)会(希望)睡 3 秒半。

由于该函数完全忽略返回值...您的里程可能会有所不同。

于 2013-10-12T06:33:31.493 回答