2009-10-15 7 views
7

De acuerdo con esta documentación http://www.cplusplus.com/reference/clibrary/ctime/time/podría una llamada a tiempo (NULL) fallan en Linux

de tiempo (NULL) "Si la función no ha podido recuperar el tiempo del calendario, se devuelve un valor -1."

¿Esto es algo que debería verificar en mi código? Seguramente algo tiene que ir bastante mal si el tiempo (NULO) no está recuperando el tiempo.

+0

Cuando hay un apagón severo o cuando su computadora falla ...;) ... lo pone en un bloque final ¿no? – aviraldg

+0

Nunca fallará. –

Respuesta

17

Es posible que se esté ejecutando en un dispositivo incrustado que no tiene un reloj en tiempo real.

El código fuente de glibc afirma que el tiempo de llamada al sistema no puede fallar en Linux:

time_t res = INTERNAL_SYSCALL (time, err, 1, NULL); 
    /* There cannot be any error. */ 

y de hecho este es el caso si nos fijamos en las fuentes del kernel:

SYSCALL_DEFINE1(time, time_t __user *, tloc) 
{ 
     time_t i = get_seconds(); 

     if (tloc) { 
       if (put_user(i,tloc)) 
         return -EFAULT; 
     } 
     force_successful_syscall_return(); 
     return i; 
} 
2

Ubuntu man página dice time(2) puede fallar debido a EFAULT ("t puntos fuera de su espacio de direcciones accesible").

página del manual OSX dice que puede fallar por las mismas razones que gettimeofday, que son EFAULT y EPERM (no sé cómo esto se aplica a time).

Por lo tanto, no puede fallar para el argumento de NULL, según la documentación de los sistemas antes mencionados.

Además, POSIX especifica que no hay condiciones de error para esta función.

+0

La pregunta es sobre cuándo t es NULO. –

+1

Bueno, ¿entonces no fallará? –

0

Tiene algo llamado reloj del sistema. Si eso está roto, entonces esto fracasará, aunque podría haber muchas otras razones.

+0

¿Cómo se puede "romper" el reloj del sistema? Lo he visto perder tiempo, ganar tiempo y comportarse de manera anormal. Pero nunca lo he visto funcionar en absoluto. –

+0

Referencia a la publicación de atomice: Si usa esto para decir --- el nds (www.devkitpro.com), entonces * CAN * (se explica Downvoter) – aviraldg

0

La obvia caso sería un sistema cuyo reloj interno requiere inicialización externa (utilizando, por ejemplo, NTP). Hasta que esto ocurra, el reloj interno no puede dar valores relativos a la época, aunque puede usarse para medir intervalos. time_t es relativo a la época y, por lo tanto, time(NULL) debe fallar en este caso.

+0

no time (NULL) ¿acaba de dar la respuesta incorrecta aquí? En lugar de fallar y devolver -1? – Managu

+0

No, no si está implementado correctamente. Eso es bastante razonable. Considere un sistema operativo que implementa un '/ dev/time /' deivce, que cuando se lee da la hora actual. Hasta que se inicialice, obtendría un error de lectura en el dispositivo. Una lib librada estándar pasaría esa falla al llamar 'time()' – MSalters

Cuestiones relacionadas