Как использовать nanosleep() в C? Что такое `tim.tv sec 'and `tim.tv nsec'?



зачем 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;
}
812   6  

6 ответов:

полсекунды составляет 500,000,000 наносекунд, поэтому ваш код должен читать:

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

Как обстоят дела, Вы код спит для 1.0000005 s (1s + 500ns).

tv_nsec время сна в наносекундах. 500000us = 500000000ns, так что вы хотите:

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

500000 микросекунд - это 500000000 наносекунд. Вы только ждете 500 НС = 0,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);

это сработало для меня ....

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

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, которые вы всегда должны проверять на системные вызовы:

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

Comments

    Ничего не найдено.