2011-10-07 19 views
54

¿Cuál es el uso de tim.tv_sec y tim.tv_nsec en lo siguiente?Cómo usar nanosleep() en C? ¿Qué son `tim.tv_sec` y` tim.tv_nsec`?

¿Cómo puedo suspender la ejecución de 500000 microsegundos?

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

Respuesta

57

Medio segundo es 500.000.000 nanosegundos, por lo que su código debe decir:

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

Tal como están las cosas, que el código está durmiendo para 1.0000005s (1s + 500 ns).

+2

genial. Solo una pregunta mas. Estoy probando esto usando gettimeofday() dos veces y obteniendo la diferencia. Por lo tanto, obtuve una diferencia de medio segundo. Pero también hubo una fracción muy pequeña de un segundo, debido al tiempo de procesamiento de la CPU. ¿Cómo puedo calcular esto y restarlo del tiempo de mi sueño? mi tiempo fue como: 0.501033 seg – pnizzle

+2

@pnizzle: ¿Qué es exactamente lo que espera lograr con esa resta? – NPE

+1

espero alcanzar exactamente 0.500000secs. Gracias – pnizzle

9

500000 microsegundos son 500000000 nanosegundos. Solo esperas 500 ns = 0.5 μs.

+1

gracias, trabaja ahora! – pnizzle

43

tv_nsec es el tiempo de suspensión en nanosegundos. 500000us = 500000000ns, por lo que desea:

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

acaba de probarlo, duerme por medio segundo Gracias – pnizzle

+0

¿Para qué sirve 'L' al final de '500000000L'? – Sahand

+1

Esto se relaciona con el doble largo. como el segundo argumento de nanosleep() tiene doble tipo largo. ver https://stackoverflow.com/questions/1380653/why-do-you-need-to-append-an-l-or-f-after-a-value-assigned-to-ac-c-concontent – EsmaeelE

6

normalmente utilizo algunos #define y constantes para hacer el cálculo fácil:

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

De ahí que mi código se vería así:

timespec sleepValue = {0}; 

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

Esto funcionó para mí ....

#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

En primer lugar encontramos la función: http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html

que contiene un enlace a un time.h, que como cabecera debe ser el que se definen estructuras:

La cabecera declarará la timespec estructura, que incluirá al menos los siguientes miembros:

time_t tv_sec Seconds. 
long tv_nsec Nanoseconds. 

hombre 2 nanosleep

docs glibc pseudo-oficial en el que siempre se debe comprobar si hay llamadas al sistema:

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