Как использовать 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;
}
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);
Я обычно использую некоторые #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