Я немного обеспокоен этим. Это называется «проблема 2038 года». Готово ли ядро Linux или Ubuntu обрабатывать даты после этого, начиная с 12.04?
Я немного обеспокоен этим. Это называется «проблема 2038 года». Готово ли ядро Linux или Ubuntu обрабатывать даты после этого, начиная с 12.04?
Ответы:
Нет, это не подведет. В худшем случае, с точки зрения программиста, он будет работать как положено: он будет сброшен до даты 1901-12-13 20:45:52:
Это в случае, если вы не будете обновлять ваши текущие дистрибутивы, пока это не произойдет. « Обновление легко. Одно из этих обновлений наверняка будет содержать исправление », - сказал Чокобай .
Я помню, что это была та же проблема / вопрос с 16-битными машинами до 2000 года, и в конце концов это не было никаких проблем.
Решение из Википедии:
Большинство операционных систем, предназначенных для работы на 64-разрядном оборудовании, уже используют 64-разрядные
time_t
целые числа со знаком. Использование 64-разрядного значения со знаком вводит новую дату переноса, которая более чем в двадцать раз превышает предполагаемый возраст вселенной: примерно через 292 миллиарда лет, в 15:30:08 в воскресенье, 4 декабря, 292 277 026 596. Возможность вычислений по датам ограничена тем, чтоtm_year
использует 32-битное значение int со знаком, начиная с 1900 года. Это ограничивает год максимум 2 147 485 547 (2 147 483 647 + 1900). Хотя это решает проблему для выполнения программ, оно не решает проблему хранения значений даты в двоичных файлах данных, многие из которых используют жесткие форматы хранения. Это также не решает проблему для 32-битных программ, работающих на уровнях совместимости, и может не решить проблему для программ, которые неправильно хранят значения времени в переменных других типов, кромеtime_t
.
Я использую Ubuntu 13.04 на 64-битной версии и, по любопытству, вручную изменил время на 2038-01-19 03:13:00. После 03:14:08 ничего не произошло
Так что не стоит беспокоиться об этой проблеме.
Больше о:
Вы можете проверить, будет ли зависать время вашего компьютера, используя следующий скрипт Perl:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Если ваш компьютер будет в порядке, вы получите это:
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
Если ваш компьютер похож на мой, он будет выглядеть примерно так:
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
Это также может сделать это:
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
?
Я написал и опубликовал небольшую статью по этому вопросу еще в 1996 году. Это включало короткую программу на Си, чтобы продемонстрировать это. У меня также были электронные письма с Дэвидом Миллсом о подобных проблемах с NTP-протоколом сетевого времени. На моем 64-битном ноутбуке Ubuntu 14.04 код perl не имел ограничений, поэтому базовые 64-битные библиотеки должны были быть изменены.
Тем не менее, выполнение моего давнего тестового кода показывает, что время возвращается к эпохе UNIX. Так что не все хорошо с 32-битным кодом из прошлого.
Моя статья 1996 года, время UNIX истечет в 2038 году! был на моем веб-сайте с 2000 года. Вариант под названием «Время UNIX» был опубликован в 1998 году в «Лучшем опыте 2000 года для компьютерных вычислений тысячелетия», ISBN 0136465064.
64-битная версия Linux готова, по крайней мере, если вы говорите об основных интерфейсах ОС (отдельные приложения, конечно, могут все испортить). time_t традиционно определяется как псевдоним «long», а «long» в 64-битной Linux - 64-битная.
Ситуация для 32-битного Linux (и уровня совместимости для 32-битных двоичных файлов в 64-битном Linux) гораздо менее радужна. Он сломан, и исправить его, не сломав все существующие двоичные файлы, не простая задача. Целый набор API использует time_t, и во многих случаях он внедряется как часть структур данных, поэтому API-интерфейсы не только должны дублироваться, но и структуры данных, с которыми они работают.
Даже если существует некоторый уровень обратной совместимости, все двоичные файлы, которые хотят получить правильное время, необходимо будет перестроить для использования новых 64-битных временных интерфейсов.
Была проделана определенная работа (см., Например, https://lwn.net/Articles/643234/ и http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ), но на самом деле мы все еще далеки от полного решения. Неясно, будут ли когда-либо общие 32-разрядные дистрибутивы общего назначения, которые безопасны для Y2K38.