2011-10-07 13 views
54

Jaki jest pożytek z następujących tim.tv_sec i tim.tv_nsec?Jak używać nanosleep() w C? Co to są `tim.tv_sec` i` tim.tv_nsec`?

Jak można uśpić wykonanie dla 500000 mikrosekund?

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

Odpowiedz

57

Pół sekundy jest 500.000.000 nanosekund, więc kod powinien brzmieć:

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

W obecnym stanie rzeczy, to kod jest spanie na 1.0000005s (1S + 500ns).

+2

fajne. Jeszcze jedno pytanie. Testuję to za pomocą gettimeofday() dwa razy i dostaję różnicę. Dlatego dostałem różnicę pół sekundy. Ale był też bardzo mały ułamek sekundy, ze względu na czas przetwarzania procesora. Jak mogę to obliczyć i odjąć od mojego czasu snu. mój czas pojawił się jako: 0,501033 s. – pnizzle

+2

@poznaj: Co dokładnie masz nadzieję osiągnąć dzięki temu odejmowaniu? – NPE

+1

Mam nadzieję, że uda mi się osiągnąć dokładnie 0,500000secy. Dzięki – pnizzle

9

500000 mikrosekund to 500000000 nanosekund. Czekasz tylko na 500 ns = 0,5 μs.

+1

dzięki, teraz działa! – pnizzle

43

tv_nsec to czas uśpienia w nanosekundach. 500000us = 500000000ns, więc chcesz:

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

po prostu wypróbowany, śpi przez pół sekundy. Dzięki – pnizzle

+0

Do czego służy "L" na końcu '500000000L'? – Sahand

+1

Dotyczy to długich podwójnych. ponieważ drugi argument funkcji nanosleep() ma długi podwójny typ. zobacz https://stackoverflow.com/questions/1380653/why-do-you-need-to-append-an-or-f-aftera-a-value-assigned-to-a-c-constant – EsmaeelE

6

Zwykle używam trochę #define i stałe do obliczenia proste:

#define NANO_SECOND_MULTIPLIER 1000000 // 1 millisecond = 1,000,000 Nanoseconds 
const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER; 

Stąd mój kod będzie wyglądać następująco:

timespec sleepValue = {0}; 

sleepValue.tv_nsec = INTERVAL_MS; 
nanosleep(&sleepValue, NULL); 
3

To zadziałało dla mnie ...

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

POSIX 7

Najpierw znajdź funkcję: http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html

który zawiera link do time.h, który jako nagłówek powinien być tam, gdzie struktury są zdefiniowane:

Nagłówek ogłasza timespec struktura, która obejmuje co najmniej następujących członków:

time_t tv_sec Seconds. 
long tv_nsec Nanoseconds. 

man 2 nanosleep

Pseudo-oficjalna dokumentacja glibc, które należy zawsze sprawdzić syscalli:

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