2012-02-23 6 views
7

El getitimer página del manual (2) afirma que¿Por qué son tanto tv_sec como tv_usec significativos para determinar la duración de un temporizador?

tanto tv_sec y tv_usec significativo en la determinación de la duración de un temporizador

No va a decir por qué es así. En muchos ejemplos que me he encontrado, tv_sec simplemente se establece en 0, mientras que tv_usec tiene algún valor razonable, o viceversa. ¿Están estos temporizadores contando simultáneamente, o es el tiempo total de cuenta regresiva tv_sec + tv_usec? ¿Debo usar ambos? ¿Ninguno?

+2

No creo que la página de manual incluya "por qué son ..." –

+0

¡Eres un tipo inteligente! – Ziggy

Respuesta

17

El man page documenta la estructura timeval:

struct timeval { 
    long tv_sec;    /* seconds */ 
    long tv_usec;    /* microseconds */ 
}; 

Si desea esperar un número entero de segundos, acaba de configurar tv_sec. Si desea esperar una parte de un segundo, debe establecer tv_usec. Si desea esperar 4.5 segundos, establecería ambos de ellos a los valores apropiados (4 y 500000, respectivamente)

+2

Además, ¿no se permite que usec supere 1 segundo? – Ziggy

+2

POSIX no parece especificar ningún comportamiento para todos los casos de esquina (tv_usec <0, tv_nsec <0, tv_usec> 1000000, tv_nsec> 1000000000), por lo que es mejor no permitir que eso ocurra. –

1

Sí, el tiempo total es la suma de ambos. tv_sec es el segundo. Y tv_usec es microsegundos más allá de eso.

+0

entonces, por ejemplo, si les di valores de 1 y 250000 respectivamente, ¿eso sería 1.25 segundos? – Ziggy

+0

Sí. Será 1,25 –

3

La estructura se describe sin embargo:

struct timeval { 
    long tv_sec;    /* seconds */ 
    long tv_usec;    /* microseconds */ 
}; 

Como se ve, el tiempo total es tv_sec + (1.0/1000000) * tv_usec segundos. Es por eso que cuando necesite veces menos de un segundo se establece tv_usec, cuando se necesita veces durante 1 segundo se establece tanto (pero por lo general terminan montura únicamente tv_sec)

+0

Ya edité la respuesta para incluir 1/1million en lugar de –

-1

He tenido una pérdida de memoria debido a que no configuré tv_usec. Comuter toma una suma de esos dos valores y si no inicializa uno de ellos, el valor de suma podría ser aleatorio.

0

largo int tv_usec Este es el resto del tiempo transcurrido (una fracción de un segundo ), representada como el número de microsegundos. Siempre es menos que un millón.

tv_sec manejará los segundos completos, mientras que tv_usec maneja los microsegundos.

Los microsegundos volverán a cero cuando llegue a su máximo (1 millón) e incrementarán los segundos al igual que un cronómetro normal.

Cuestiones relacionadas