2009-10-15 13 views
7

Według tej dokumentacji http://www.cplusplus.com/reference/clibrary/ctime/time/Kiedy wezwanie do czasu (NULL) może nie na Linux

do czasu (null) „Jeśli funkcja nie mógł odzyskać czas kalendarzowy, zwraca wartość -1.”

Czy jest to coś, co powinienem sprawdzić w moim kodzie? Z pewnością coś może się nie udać, jeśli czas (NULL) nie powoduje odzyskania czasu.

+0

Gdy wystąpi poważna awaria zasilania lub komputer zawiesza się ...;) ... umieszczasz go w bloku końcowym w prawo? – aviraldg

+0

Nigdy się nie zawiedzie. –

Odpowiedz

17

Być może korzystasz z wbudowanego urządzenia, które nie ma zegara czasu rzeczywistego.

Kod źródłowy glibc twierdzi, że syscall czas nie może zabraknąć w systemie Linux:

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

i rzeczywiście tak jest, jeśli spojrzeć na źródła jądra:

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

Strona podręcznika Ubuntu mówi, że time(2) może się nie powieść z powodu EFAULT ("t punktów poza dostępną przestrzenią adresową").

strona OSX człowiek twierdzi, że może się nie udać z tych samych powodów co gettimeofday, które są EFAULT i EPERM (nie wiem, jak to odnosi się do time).

Dlatego nie może zawieść dla argumentu NULL, zgodnie z dokumentacją wyżej wymienionych systemów.

Również, POSIX nie określa żadnych błędów dla tej funkcji.

+0

Pytanie dotyczy tego, kiedy t ma wartość NULL. –

+1

Cóż, to nie zawiedzie? –

0

Masz coś, co nazywa się zegarem systemowym. Jeśli to zepsute, to się nie powiedzie, choć może być wiele innych powodów.

+0

W jaki sposób zegar systemowy może się "zepsuć"? Widziałem, jak tracił czas, zyskiwał czas i zachowywał się nienormalnie. Ale nigdy nie widziałem, żeby to w ogóle nie działało. –

+0

Odsyłacz do posta atomice: Jeśli użyjesz tego dla powiedzenia --- nds (www.devkitpro.com) to to * MOŻE * (Downvoter wyjaśnisz siebie) – aviraldg

0

Oczywistym przypadek byłby systemem, którego wewnętrzny zegar wymaga zewnętrznej inicjalizacji (za pomocą np. NTP). Dopóki tak się nie stanie, wewnętrzny zegar nie może podać względnych wartości epoki, chociaż można go wykorzystać do mierzenia odstępów czasu. time_t jest względne w stosunku do epoki i dlatego time(NULL) musi zawieść w tym przypadku.

+0

nie będzie czasu (NULL) po prostu podaj tutaj złą odpowiedź? Zamiast niepowodzenia i powrotu -1? – Managu

+0

Nie, nie, jeśli jest poprawnie zaimplementowany. To całkiem rozsądne. Rozważmy system operacyjny, który implementuje deywność '/ dev/time /', która podczas odczytu podaje aktualny czas. Do czasu zainicjowania na urządzeniu pojawi się błąd odczytu. Standardowa lib C przekaże tę awarię, wywołując 'time()' – MSalters

Powiązane problemy