2009-10-15 6 views
7

Selon cette documentation http://www.cplusplus.com/reference/clibrary/ctime/time/pourrait un appel à temps (NULL) échouer sur Linux

pour le temps (NULL) « Si la fonction n'a pas pu récupérer le temps de calendrier, il retourne une valeur -1. »

Est-ce quelque chose que je devrais vérifier dans mon code? Assurément, quelque chose doit mal se passer si le temps (NULL) ne récupère pas l'heure.

+0

En cas de coupure de courant sévère ou de panne de votre ordinateur ...;) ... vous l'avez mis dans un bloc final, n'est-ce pas? – aviraldg

+0

Il n'échouera jamais. –

Répondre

17

Vous exécutez peut-être sur un périphérique intégré qui n'a pas une horloge en temps réel.

Le code source glibc prétend que le syscall de temps ne peut pas échouer sur Linux:

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

et en effet c'est le cas si vous regardez la source du noyau:

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 page dit time(2) peut échouer en raison de EFAULT ("t points en dehors de votre espace d'adressage accessible").

page man OSX dit qu'il peut échouer pour les mêmes raisons que gettimeofday, qui sont EFAULT et EPERM (ne sais pas comment cela s'applique à time).

Par conséquent, il ne peut pas échouer pour l'argument de NULL, selon la documentation des systèmes susmentionnés.

En outre, POSIX ne spécifie aucune condition d'erreur pour cette fonction.

+0

La question concerne quand t est NULL. –

+1

Eh bien, alors cela n'échouera pas? –

0

Vous avez quelque chose appelé une horloge système. Si c'est cassé, alors cela échouera, bien qu'il puisse y avoir beaucoup d'autres raisons.

+0

Comment l'horloge du système peut-elle "casser"? Je l'ai vu perdre du temps, gagner du temps et se comporter anormalement. Mais je n'ai jamais vu ça ne marche pas du tout. –

+0

Référence à l'article d'atomice: Si vous utilisez ceci pour dire --- le nds (www.devkitpro.com) alors il * CAN * (Downvoter expliquer vous-même) – aviraldg

0

L'évidence cas serait un système dont l'horloge interne nécessite une initialisation externe (en utilisant par exemple NTP). Jusqu'à ce que cela se produise, l'horloge interne ne peut pas donner de valeurs relatives à l'époque, bien qu'elle puisse être utilisée pour mesurer des intervalles. time_t est relatif à l'époque et par conséquent time(NULL) doit échouer dans ce cas.

+0

ne serait pas temps (NULL) juste donner la mauvaise réponse ici? Plutôt que d'échouer et de retourner -1? – Managu

+0

Non, pas si elle est correctement implémentée. C'est tout à fait raisonnable. Considérons un système d'exploitation qui implémente un deivce '/ dev/time /', qui en lecture donne l'heure actuelle. Jusqu'à l'initialisation, vous obtenez une erreur de lecture sur l'appareil. Un C lib standard passerait sur cet échec en appelant 'time()' – MSalters

Questions connexes