これについて少し心配です。「2038年問題」と呼ばれます。LinuxカーネルまたはUbuntuは、12.04の時点で、これ以降の日付を処理する準備ができていますか?
これについて少し心配です。「2038年問題」と呼ばれます。LinuxカーネルまたはUbuntuは、12.04の時点で、これ以降の日付を処理する準備ができていますか?
回答:
いいえ、失敗しません。最悪の場合、プログラマの観点からは期待どおりに動作します。日付は1901-12-13 20:45:52にリセットされます。
これが発生するまで、現在のディストリビューションを更新しない場合に備えて。「更新は簡単です。これらの更新の1つには確実に修正が含まれます。」とchocobai氏は言いました。
2000年以前の16ビットマシンでも同じ問題/質問であり、最終的には問題ではなかったことを覚えています。
ウィキペディアのソリューション:
64ビットハードウェアで実行するように設計されたほとんどのオペレーティングシステムは、既に符号付き64ビット
time_t
整数を使用しています。署名された64ビット値を使用すると、宇宙の推定年齢の20倍以上の新しいラップアラウンド日が導入されます。これは、現在から約292億年、292,277,026,596年12月4日日曜日15:30:08です。日付の計算を行う機能は、次の事実により制限されます。tm_year
年に1900から始まる符号付き32ビット整数値を使用します。これにより、年は最大2,147,485,547(2,147,483,647 + 1900)に制限されます。これはプログラムの実行に関する問題を解決しますが、バイナリデータファイル内に日付値を保存する問題は解決しません。バイナリデータファイルの多くは厳格なストレージ形式を採用しています。また、互換性レイヤーで実行されている32ビットプログラムの問題は解決しませんtime_t
。また、。
64ビットでUbuntu 13.04を使用し、好奇心により、手動で時間を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)に関する同様の問題について、David Millsにメールを送りました。Ubuntu 14.04 64ビットラップトップでは、perlコードに制限がなかったため、基礎となる64ビットライブラリを変更する必要がありました。
しかし、私の昔のテストコードを実行すると、時間はUNIXエポックに戻ります。そのため、過去の32ビットコードですべてがうまくいくとは限りません。
私の1996年の論文、UNIXの時間は2038年に終わります!この「UNIX Time」というタイトルの変形版は、1998年に「Y2K Millennium Computingの2000年ベストプラクティス」ISBN 0136465064で公開されました。
少なくとも、コアOSインターフェースについて話している場合は、64ビットLinuxの準備ができています(もちろん、個々のアプリケーションはそれを台無しにする可能性があります)。time_tは伝統的に「long」のエイリアスとして定義され、64ビットのLinuxでは「long」は64ビットです。
32ビットLinux(および64ビットLinuxの32ビットバイナリの互換性レイヤー)の状況はそれほどバラ色ではありません。壊れており、既存のすべてのバイナリを壊さずに修正するのは簡単なことではありません。API全体はtime_tを使用し、多くの場合、データ構造の一部として埋め込まれているため、APIを複製するだけでなく、使用するデータ構造も複製する必要があります。
ある程度の下位互換性がある場合でも、正しい時刻を取得したいすべてのバイナリを再構築して、新しい64ビットタイムインターフェイスを使用する必要があります。
いくつかの作業が行われました(たとえばhttps://lwn.net/Articles/643234/およびhttp://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.htmlを参照)が、完全なソリューションからはまだ長い道のりです。Y2K38で安全な汎用32ビットディストリビューションが存在するかどうかは明らかではありません。