Sono un po 'preoccupato per questo. Si chiama "problema dell'anno 2038". Il kernel di Linux o Ubuntu è pronto per gestire le date successive, a partire dal 12.04?
Sono un po 'preoccupato per questo. Si chiama "problema dell'anno 2038". Il kernel di Linux o Ubuntu è pronto per gestire le date successive, a partire dal 12.04?
Risposte:
No, non fallirà. Nel peggiore dei casi, dal punto di vista di un programmatore funzionerà come previsto: verrà reimpostato ad oggi 1901-12-13 20:45:52:
Questo nel caso in cui non aggiornerai le tue attuali distribuzioni fino a quando ciò non accadrà. "L' aggiornamento è facile. Uno di questi aggiornamenti conterrà sicuramente una soluzione ", come ha affermato Chocobai .
Ricordo che era lo stesso problema / domanda con le macchine a 16 bit prima del 2000 e alla fine non c'erano problemi.
Una soluzione da Wikipedia:
La maggior parte dei sistemi operativi progettati per essere eseguiti su hardware a 64 bit utilizzano già
time_t
numeri interi a 64 bit con segno. L'uso di un valore a 64 bit con segno introduce una nuova data avvolgente che è oltre venti volte maggiore dell'età stimata dell'universo: circa 292 miliardi di anni da oggi, alle 15:30:08 di domenica 4 dicembre 292.277.026.596. La capacità di effettuare calcoli in date è limitata dal fatto chetm_year
utilizza un valore int a 32 bit con segno a partire da 1900 per l'anno. Ciò limita l'anno a un massimo di 2.147.485.547 (2.147.483.647 + 1900). Sebbene ciò risolva il problema dell'esecuzione dei programmi, non risolve il problema della memorizzazione dei valori di data all'interno di file di dati binari, molti dei quali utilizzano formati di archiviazione rigidi. Inoltre, non risolve il problema per i programmi a 32 bit in esecuzione con livelli di compatibilità e potrebbe non risolvere il problema per i programmi che archiviano erroneamente i valori temporali in variabili di tipo diverso datime_t
.
Uso Ubuntu 13.04 a 64 bit e, per curiosità, ho cambiato manualmente l'ora in 2038-01-19 03:13:00. Dopo 03:14:08 non era successo nulla:
Quindi non c'è nulla di cui preoccuparsi per questo problema.
Di più:
Puoi verificare se l'ora del tuo computer si bloccherà usando il seguente script Perl:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Se il tuo computer andrà bene, otterrai questo:
Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038 <-- Last second in 32-bit Unix systems
Tue Jan 19 03:14:08 2038
Tue Jan 19 03:14:09 2038
Tue Jan 19 03:14:10 2038
Se il tuo computer è come il mio, si avvolgerà così:
Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Potrebbe anche fare questo:
Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
ctime
?
Ho scritto e pubblicato un breve articolo su questo nel 1996. Questo includeva un breve programma C per dimostrarlo. Ho anche ricevuto e-mail con David Mills su problemi simili con NTP, il Network Time Protocol. Sul mio laptop Ubuntu 14.04 a 64 bit il codice perl non presentava la limitazione, quindi le librerie a 64 bit sottostanti devono essere state modificate.
Tuttavia, l'esecuzione del mio codice di test di lunga data mostra che il tempo ritorna all'epoca UNIX. Quindi non tutto va bene con il codice a 32 bit del passato.
Il mio articolo del 1996, The UNIX time scadrà nel 2038! è sul mio sito web da circa 2000. Una variante di questo "UNIX Time" è stata pubblicata nel 1998 in "Anno 2000 Best Practices for Y2K Millennium Computing" ISBN 0136465064.
Linux a 64 bit è pronto, almeno se stai parlando delle interfacce del sistema operativo principale (le singole applicazioni possono ovviamente rovinarlo ancora). time_t è tradizionalmente definito come un alias per "long" e "long" su Linux a 64 bit è 64-bit.
La situazione per Linux a 32 bit (e il livello di compatibilità per i binari a 32 bit su Linux a 64 bit) è molto meno roseo. È rotto e ripararlo senza rompere tutti i file binari esistenti non è un compito facile. Un sacco di API usa time_t e in molti casi è incorporato come parte delle strutture di dati, quindi non solo le API devono essere duplicate, ma anche le strutture di dati con cui lavorano.
Anche se esiste un certo livello di compatibilità con le versioni precedenti, tutti i binari che desiderano ottenere l'ora corretta dovranno essere ricostruiti per utilizzare le nuove interfacce temporali a 64 bit.
C'è stato un po 'di lavoro svolto (vedi ad esempio https://lwn.net/Articles/643234/ e http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ) ma abbiamo già accettato sono ancora lontani da una soluzione completa. Non è chiaro se ci saranno mai distribuzioni a 32 bit di uso generale che sono sicure per Y2K38.