如何在C中使用nanosleep()?什么是`tim.tv_sec`和`tim.tv_nsec`?

pni*_*zle 74 c posix sleep

有什么用的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;
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 72

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

tim.tv_sec  = 0;
tim.tv_nsec = 500000000L;
Run Code Online (Sandbox Code Playgroud)

事实上,你的代码正在睡眠1.0000005s(1s + 500ns).

  • 大多数计时器都不是那么精细.特别是在多任务机器上,很难精确地睡觉. (3认同)
  • 凉.还有一个问题.我正在使用gettimeofday()两次测试它并获得差异.因此我得到了半秒的差异.但是由于cpu处理时间的原因,还有一小部分时间.我怎样才能计算出这个并从我的睡眠时间中减去它.我的时间是:0.501033秒 (2认同)
  • @pnizzle:你究竟希望通过减法实现什么目标? (2认同)
  • 我希望完全达到0.500000secs.谢谢 (2认同)

Dav*_*ave 52

tv_nsec是以纳秒为单位的睡眠时间.500000us = 500000000ns,所以你想要:

nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);
Run Code Online (Sandbox Code Playgroud)

  • 这与 long double 相关。作为 nanosleep() 的第二个参数具有 long double 类型。见 /sf/ask/96645741/ (3认同)
  • “500000000L”末尾的“L”是什么意思? (2认同)

glg*_*lgl 11

500000微秒是500000000纳秒.您只需等待500 ns =0.5μs.


E.T*_*E.T 8

我通常使用一些#define和常量来简化计算:

#define NANO_SECOND_MULTIPLIER  1000000  // 1 millisecond = 1,000,000 Nanoseconds
const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER;
Run Code Online (Sandbox Code Playgroud)

因此我的代码看起来像这样:

timespec sleepValue = {0};

sleepValue.tv_nsec = INTERVAL_MS;
nanosleep(&sleepValue, NULL);
Run Code Online (Sandbox Code Playgroud)


Sun*_*kla 7

这对我有用。

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 只需多一个字符即可正确拼写毫秒。 (2认同)