如何在 C 中使用 nanosleep()?啥是`tim.tv_sec`和`tim.tv_nsec`?
Posted
技术标签:
【中文标题】如何在 C 中使用 nanosleep()?啥是`tim.tv_sec`和`tim.tv_nsec`?【英文标题】:How to use nanosleep() in C? What are `tim.tv_sec` and `tim.tv_nsec`?如何在 C 中使用 nanosleep()?什么是`tim.tv_sec`和`tim.tv_nsec`? 【发布时间】:2011-12-02 19:37:19 【问题描述】:下面tim.tv_sec
和tim.tv_nsec
有什么用?
我如何才能在 500000
微秒内休眠执行?
#include <stdio.h>
#include <time.h>
int main()
struct timespec tim, tim2;
tim.tv_sec = 1;
tim.tv_nsec = 500;
if(nanosleep(&tim , &tim2) < 0 )
printf("Nano sleep system call failed \n");
return -1;
printf("Nano sleep successfull \n");
return 0;
【问题讨论】:
【参考方案1】:这对我有用....
#include <stdio.h>
#include <time.h> /* Needed for struct timespec */
int mssleep(long miliseconds)
struct timespec rem;
struct timespec req=
(int)(miliseconds / 1000), /* secs (Must be Non-Negative) */
(miliseconds % 1000) * 1000000 /* nano (Must be in range of 0 to 999999999) */
;
return nanosleep(&req , &rem);
int main()
int ret = mssleep(2500);
printf("sleep result %d\n",ret);
return 0;
【讨论】:
所以不是 nsleep(...) 而是 msleep(...) ? 正确拼写毫秒只是多一个字符。【参考方案2】:POSIX 7
先找到函数:http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html
其中包含指向time.h
的链接,它作为标题应该是定义结构的地方:
标头应声明 timespec 结构,该结构应 > 至少包括以下成员:
time_t tv_sec Seconds. long tv_nsec Nanoseconds.
man 2 nanosleep
你应该经常检查系统调用的伪官方 glibc 文档:
struct timespec
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
;
【讨论】:
【参考方案3】:更正确的变体:
struct timespec delta = 5 /*secs*/, 135 /*nanosecs*/;
while (nanosleep(&delta, &delta));
【讨论】:
纳秒修正:--> struct timespec delta = 5 /*secs*/, 135*1000000/*nanosecs*/; 135*1000 000 -> 135 微秒? 135 微秒 == 135 000 纳秒,因为第二个字段具有纳秒值“tv_nsec”【参考方案4】:tv_nsec
是以纳秒为单位的睡眠时间。 500000us = 500000000ns,所以你想要:
nanosleep((const struct timespec[])0, 500000000L, NULL);
【讨论】:
500000000L
末尾的“L”是什么意思?
这与长双精度有关。由于 nanosleep() 的第二个参数具有 long double 类型。见***.com/questions/1380653/…
nanosleep结构的第二个变量的类型是long
。 L 用于将数字转换为long
,因为int
可能太小而无法处理该值。如果数字大于 2^16,一些安全标准(NASA、MISRA)会强制指定数字类型以避免错误代码。【参考方案5】:
我通常使用一些#define 和常量来简化计算:
#define NANO_SECOND_MULTIPLIER 1000000 // 1 millisecond = 1,000,000 Nanoseconds
const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER;
因此我的代码如下所示:
timespec sleepValue = 0;
sleepValue.tv_nsec = INTERVAL_MS;
nanosleep(&sleepValue, NULL);
【讨论】:
【参考方案6】:半秒是 500,000,000 纳秒,因此您的代码应为:
tim.tv_sec = 0;
tim.tv_nsec = 500000000L;
就目前情况而言,您的代码正在休眠 1.0000005 秒(1 秒 + 500 纳秒)。
【讨论】:
酷。还有一个问题。我正在使用 gettimeofday() 两次对此进行测试并获得差异。因此,我得到了半秒的差异。但是由于 cpu 处理时间假设,也有一小部分一秒。我如何计算这个并从我的睡眠时间中减去它。我的时间是:0.501033 秒 @pnizzle:你希望通过减法实现什么? 我希望达到 0.500000 秒。谢谢 大多数计时器的粒度并不那么精细。尤其是在多任务机器上,很难准确入睡。 我用谷歌搜索了一下,找到了一个函数clock()..这到底是做什么的。是否计时 CPU 使用率?【参考方案7】:500000 微秒是 500000000 纳秒。您只需等待 500 ns = 0.5 µs。
【讨论】:
以上是关于如何在 C 中使用 nanosleep()?啥是`tim.tv_sec`和`tim.tv_nsec`?的主要内容,如果未能解决你的问题,请参考以下文章