Я трохи стурбований цим. Це називається "проблема 2038 року". Чи готові ядро Linux або Ubuntu після обробки даних після 12.04?
Я трохи стурбований цим. Це називається "проблема 2038 року". Чи готові ядро Linux або Ubuntu після обробки даних після 12.04?
Відповіді:
Ні, це не вийде. У гіршому випадку, з точки зору програміста, він буде працювати так, як очікувалося: він буде перероблений на дату 1901-12-13 20:45:52:
Це на випадок, якщо ви не будете оновлювати свої поточні дистрибутиви, поки цього не станеться. " Оновлення просте. Одне з цих оновлень обов'язково містить виправлення ", як сказав chocobai .
Я пам’ятаю, що це була та сама проблема / питання з 16-бітними машинами до 2000 року, і врешті-решт це не було ніяких проблем.
Рішення з Вікіпедії:
Більшість операційних систем, призначених для роботи на 64-розрядному апаратному забезпеченні, вже використовують підписані 64-бітні
time_t
цілі числа. Використання підписаного 64-бітного значення вводить нову дату обгортання, яка в понад двадцять разів перевищує орієнтовний вік Всесвіту: приблизно 292 мільярди років з цього часу, о 15:30:08 в неділю, 4 грудня, 292,277,026,596. Можливість робити обчислення за датами обмежена тим, щоtm_year
використовує підписане 32-бітове значення int, починаючи з 1900 року. Це обмежує рік до максимуму 2147,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 році. Це включало коротку програму C, щоб продемонструвати це. У мене також було повідомлення з Девідом Міллсом про подібні проблеми з NTP - Network Time Protocol. На моєму 64-розрядному ноутбуці Ubuntu 14.04 код perl не мав обмежень, тому основні 64-розрядні версії повинні бути змінені.
Однак запуск мого давнього тестового коду показує повернення часу до UNIX Epoch. Тож не все добре з 32-розрядним кодом минулого.
Мій документ 1996 року, час UNIX закінчиться в 2038 році! на моєму веб-сайті близько 2000 року. Варіант цього під назвою "Час UNIX" був опублікований у 1998 р. у "2000 найкращих практиках для обчислень тисячоліття Y2K" 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.