如何在C语言中使用nanosleep()?什么是“ tim.tv_sec”和“ tim.tv_nsec”?


77

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;
}

Answers:


74

半秒是500,000,000纳秒,因此您的代码应为:

tim.tv_sec  = 0;
tim.tv_nsec = 500000000L;

事实证明,您的代码正在休眠1.0000005s(1s + 500ns)。


2
凉。再问一个问题。我使用gettimeofday()进行了两次测试,并得到了不同。因此,我相差了半秒。但是由于要考虑cpu的处理时间,因此也只有非常短的几分之一秒。我该如何计算并从我的睡眠时间中减去。我的时间为:0.501033秒
pnizzle 2011年

2
@pnizzle:通过该减法,您究竟希望实现什么?
NPE

2
我希望精确达到0.500000secs。谢谢
pnizzle 2011年

4
大多数计时器都不够细。特别是在多任务机器上,很难精确地入睡。
戴夫

1
我用谷歌搜索了一下,并找到了一个函数clock()。是否会占用CPU时间?
2011年

53

tv_nsec是睡眠时间(以纳秒为单位)。500000us = 500000000ns,因此您需要:

nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);

2
的结尾处的“ L”是什么500000000L
萨汉德

3
这涉及长双。作为nanosleep()的第二个参数,它具有long double类型。看到stackoverflow.com/questions/1380653/...
EsmaeelE

1
纳米睡眠结构的第二个变量的类型为long。L用于将数字转换为long,原因int可能太小而无法处理该值。一些安全标准(NASA,MISRA)强行指定数字类型(如果数字大于2 ^ 16),以避免出现错误代码。
KamilCuk

12

500000毫秒是500000000纳秒。您只需等待500 ns = 0.5 µs。


9

这对我有用。

#include <stdio.h>
#include <time.h>   /* Needed for struct timespec */


int nsleep(long miliseconds)
{
   struct timespec req, rem;

   if(miliseconds > 999)
   {   
        req.tv_sec = (int)(miliseconds / 1000);                            /* Must be Non-Negative */
        req.tv_nsec = (miliseconds - ((long)req.tv_sec * 1000)) * 1000000; /* Must be in range of 0 to 999999999 */
   }   
   else
   {   
        req.tv_sec = 0;                         /* Must be Non-Negative */
        req.tv_nsec = miliseconds * 1000000;    /* Must be in range of 0 to 999999999 */
   }   

   return nanosleep(&req , &rem);
}

int main()
{
   int ret = nsleep(2500);
   printf("sleep result %d\n",ret);
   return 0;
}

所以不是nsleep(...)而是msleep(...)?
morbak

1
正确拼写毫秒只是一个字符。
vwvan

8

我通常使用一些#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);

3

POSIX 7

首先找到函数: http //pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html

包含指向的链接time.h,该链接应作为定义结构的标头:

标头应声明timespec结构,该结构应至少包括以下成员:

time_t  tv_sec    Seconds. 
long    tv_nsec   Nanoseconds.

男人2 nanosleep

伪官方glibc文档,您应始终检查syscall:

struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.