Trochę mnie to martwi. Nazywa się to „problemem roku 2038”. Czy jądro Linuxa lub Ubuntu jest gotowe do obsługi dat po tym dniu, począwszy od 12.04?
Trochę mnie to martwi. Nazywa się to „problemem roku 2038”. Czy jądro Linuxa lub Ubuntu jest gotowe do obsługi dat po tym dniu, począwszy od 12.04?
Odpowiedzi:
Nie, to nie zawiedzie. W najgorszym przypadku z punktu widzenia programisty będzie działał zgodnie z oczekiwaniami: zostanie zresetowany do daty 1901-12-13 20:45:52:
To w przypadku, gdy nie zaktualizujesz swoich obecnych dystrybucji, dopóki tak się nie stanie. „ Aktualizacja jest łatwa. Jedna z tych aktualizacji na pewno będzie zawierać poprawkę. ” Jak powiedział chocobai .
Pamiętam, że był to ten sam problem / pytanie z 16-bitowymi maszynami przed 2000 rokiem i ostatecznie nie było żadnych problemów.
Rozwiązanie z Wikipedii:
Większość systemów operacyjnych zaprojektowanych do działania na 64-bitowym sprzęcie korzysta już z 64-bitowych
time_t
liczb całkowitych ze znakiem. Użycie podpisanej wartości 64-bitowej wprowadza nową datę zawijania, która jest ponad dwudziestokrotnie większa niż szacowany wiek wszechświata: od około 292 miliardów lat, o 15:30:08 w niedzielę, 4 grudnia 292 277, 026,596. Możliwość wykonywania obliczeń w terminach jest ograniczona faktemtm_year
używa podpisanej 32-bitowej wartości int począwszy od 1900 roku. Ogranicza to rok do maksymalnie 2 147 485 547 (2 147 483 647 + 1900). Chociaż rozwiązuje to problem wykonywania programów, nie rozwiązuje problemu przechowywania wartości dat w plikach danych binarnych, z których wiele wykorzystuje sztywne formaty przechowywania. Nie rozwiązuje również problemu dla programów 32-bitowych działających pod warstwami kompatybilności i może nie rozwiązać problemu dla programów, które niepoprawnie przechowują wartości czasu w zmiennych typów innych niżtime_t
.
Używam Ubuntu 13.04 na 64-bitach i, z ciekawości, ręcznie zmieniłem czas na 2038-01-19 03:13:00. Po 03:14:08 nic się nie stało:
Więc nie ma się czym przejmować tym problemem.
Więcej na temat:
Możesz sprawdzić, czy czas na komputerze się zawiesi, używając następującego skryptu Perl:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Jeśli twój komputer będzie w porządku, otrzymasz:
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
Jeśli twój komputer jest podobny do mojego, obejmie go w następujący sposób:
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
Może to również zrobić:
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
?
Napisałem i opublikowałem krótki artykuł na ten temat w 1996 roku. Obejmował on krótki program C, aby to zademonstrować. Otrzymałem również e-maile od Davida Millsa na temat podobnych problemów z NTP - Network Time Protocol. Na moim 64-bitowym laptopie z Ubuntu 14.04 kod perla nie wykazywał ograniczenia, więc podstawowe biblioteki 64-bitowe musiały zostać zmodyfikowane.
Jednak uruchomienie mojego dawnego kodu testowego pokazuje, że czas wraca do Epoki UNIX. Więc nie wszystko jest dobrze z 32-bitowym kodem z przeszłości.
Mój artykuł z 1996 r. Czas UNIX skończy się w 2038 r.! istnieje na mojej stronie od około 2000 roku. Wariant zatytułowany „Czas UNIX” został opublikowany w 1998 r. w „Najlepszych praktykach w 2000 roku dla Y2K Millennium Computing” ISBN 0136465064.
64-bitowy system Linux jest gotowy, przynajmniej jeśli mówisz o podstawowych interfejsach systemu operacyjnego (poszczególne aplikacje mogą go oczywiście popsuć). time_t jest tradycyjnie definiowany jako alias dla „long”, a „long” w 64-bitowym systemie Linux to 64-bit.
Sytuacja w 32-bitowym systemie Linux (i warstwie zgodności dla 32-bitowych plików binarnych w 64-bitowym systemie Linux) jest znacznie mniej różowa. Jest zepsuty i naprawienie go bez zerwania wszystkich istniejących plików binarnych nie jest łatwym zadaniem. Cała gama interfejsów API korzysta z time_t iw wielu przypadkach jest osadzona jako część struktur danych, więc interfejsy API muszą być nie tylko duplikowane, ale także struktury danych, z którymi pracują.
Nawet jeśli istnieje pewien poziom kompatybilności wstecznej, wszystkie pliki binarne, które chcą uzyskać poprawny czas, będą musiały zostać przebudowane, aby móc korzystać z nowych 64-bitowych interfejsów czasowych.
Wykonano już pewne prace (patrz na przykład https://lwn.net/Articles/643234/ i http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ), ale uważamy, że są jeszcze daleko od pełnego rozwiązania. Nie jest jasne, czy kiedykolwiek pojawią się 32-bitowe dystrybucje ogólnego przeznaczenia, które są bezpieczne dla Y2K38.