如何在 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_sectim.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.

ma​​n 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`?的主要内容,如果未能解决你的问题,请参考以下文章

使用 nanosleep() 时出现分段错误

10.19 sleep,nanosleep以及clock_nanosleep函数

在C语言中啥是全局变量?用一个小程序段说明下,谢谢,

c语言中啥是动态分配内存?

C#:啥是虚拟事件以及如何使用它们?

Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()