Ich bin etwas besorgt darüber. Es heißt das "Jahr-2038-Problem". Ist der Linux-Kernel oder Ubuntu bereit, Datumsangaben nach diesem Datum, Stand 12.04, zu verarbeiten?
Ich bin etwas besorgt darüber. Es heißt das "Jahr-2038-Problem". Ist der Linux-Kernel oder Ubuntu bereit, Datumsangaben nach diesem Datum, Stand 12.04, zu verarbeiten?
Antworten:
Nein, es wird nicht scheitern. Im schlimmsten Fall funktioniert es aus Sicht eines Programmierers wie erwartet: Es wird auf das Datum 1901-12-13 20:45:52 zurückgesetzt:
In diesem Fall werden Sie Ihre aktuellen Distributionen erst dann aktualisieren. "Das Aktualisieren ist einfach. Eines dieser Updates wird mit Sicherheit einen Fix enthalten ", sagte Chocobai .
Ich erinnere mich, dass es vor 2000 bei 16-Bit-Rechnern dasselbe Problem / dieselbe Frage gab und es am Ende keine Probleme gab.
Eine Lösung von Wikipedia:
Die meisten auf 64-Bit-Hardware ausgelegten Betriebssysteme verwenden bereits signierte 64-Bit-
time_t
Ganzzahlen. Die Verwendung eines vorzeichenbehafteten 64-Bit-Werts führt zu einem neuen Umlaufdatum, das mehr als das Zwanzigfache des geschätzten Alters des Universums beträgt: in ungefähr 292 Milliarden Jahren, am Sonntag, dem 4. Dezember, um 15:30:08 Uhr, 292.277.026.596 Uhr. Die Möglichkeit, Berechnungen für Daten durchzuführen, wird durch die Tatsache begrenzt, dasstm_year
Verwendet einen vorzeichenbehafteten 32-Bit-Int-Wert ab 1900 für das Jahr. Dies begrenzt das Jahr auf ein Maximum von 2.147.485.547 (2.147.483.647 + 1900). Während dies das Problem beim Ausführen von Programmen löst, löst es nicht das Problem des Speicherns von Datumswerten in Binärdatendateien, von denen viele starre Speicherformate verwenden. Es behebt auch nicht das Problem für 32-Bit-Programme, die unter Kompatibilitätsebenen ausgeführt werden, und möglicherweise nicht das Problem für Programme, die Zeitwerte falsch in Variablen eines anderen Typs als speicherntime_t
.
Ich benutze Ubuntu 13.04 auf 64-Bit und aus Neugier habe ich die Zeit manuell auf 2038-01-19 03:13:00 geändert. Nach 03:14:08 war nichts passiert:
An diesem Problem besteht also kein Grund zur Sorge.
Mehr über:
Mithilfe des folgenden Perl-Skripts können Sie überprüfen, ob die Uhrzeit Ihres Computers abstürzt:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Wenn es Ihrem Computer gut geht, erhalten Sie Folgendes:
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
Wenn Ihr Computer so ist wie ich, wird er sich wie folgt herumschlagen:
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
Das könnte auch so sein:
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
?
Ich schrieb und veröffentlichte 1996 einen kurzen Artikel darüber. Dies beinhaltete ein kurzes C-Programm, um dies zu demonstrieren. Ich hatte auch E-Mails mit David Mills über ähnliche Probleme mit NTP, dem Network Time Protocol. Auf meinem Ubuntu 14.04 64-Bit-Laptop zeigte der Perl-Code keine Einschränkung, sodass die zugrunde liegenden 64-Bit-Bibliotheken geändert worden sein müssen.
Wenn ich jedoch meinen vor langer Zeit erstellten Testcode ausführe, werden die Zeitumbrüche auf die UNIX-Epoche zurückgeführt. Mit dem 32-Bit-Code aus der Vergangenheit ist also nicht alles in Ordnung.
Mein Artikel von 1996, The UNIX time, läuft 2038 aus! befindet sich seit etwa 2000 auf meiner Website. Eine Variante dieses Titels mit dem Titel "UNIX Time" wurde 1998 in der ISBN 0136465064 "Best Practices for Y2K Millennium Computing" (Jahr 2000) veröffentlicht.
64-Bit-Linux ist bereit, zumindest wenn Sie über die Kern-OS-Schnittstellen sprechen (einzelne Anwendungen können es natürlich noch vermasseln). time_t wird traditionell als Alias für "long" definiert und "long" unter 64-Bit-Linux ist 64-Bit.
Die Situation für 32-Bit-Linux (und die Kompatibilitätsebene für 32-Bit-Binärdateien unter 64-Bit-Linux) ist weitaus weniger rosig. Es ist kaputt und es zu reparieren, ohne alle existierenden Binärdateien zu beschädigen, ist keine leichte Aufgabe. Eine ganze Reihe von APIs verwenden time_t und in vielen Fällen ist es als Teil von Datenstrukturen eingebettet. Daher müssen nicht nur die APIs dupliziert werden, sondern auch die Datenstrukturen, mit denen sie arbeiten.
Selbst wenn eine gewisse Abwärtskompatibilität besteht, müssen alle Binärdateien, die die richtige Zeit erhalten möchten, neu erstellt werden, um die neuen 64-Bit-Zeitschnittstellen zu verwenden.
Es wurden einige Arbeiten durchgeführt (siehe zum Beispiel https://lwn.net/Articles/643234/ und http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ), aber leider sind noch weit von einer vollständigen Lösung entfernt. Es ist nicht klar, ob es jemals 32-Bit-Allzweckdistributionen geben wird, die Y2K38-sicher sind.