Bu konuda biraz endişeliyim. Buna "2038 yılı problemi" denir. Linux çekirdeği veya Ubuntu bundan sonra 12.04 itibariyle tarihleri işlemeye hazır mı?
Bu konuda biraz endişeliyim. Buna "2038 yılı problemi" denir. Linux çekirdeği veya Ubuntu bundan sonra 12.04 itibariyle tarihleri işlemeye hazır mı?
Yanıtlar:
Hayır, başarısız olmayacak. En kötü durumda, bir programcının bakış açısından, beklendiği gibi çalışacaktır: 1901-12-13 20:45:52 tarihine kadar yeniden başlatılacaktır:
Bu durumda, bu gerçekleşinceye kadar mevcut dağıtımlarınızı güncellemeyeceksiniz. Chocobai , " Güncellemek kolaydır. Bu güncellemelerden biri kesinlikle bir düzeltme içerecektir. " Dedi.
2000'den önceki 16-bit makinelerde aynı sorun / soru olduğunu hatırlıyorum ve sonunda herhangi bir sorun olmadı.
Vikipedi bir çözüm:
64 bit donanım üzerinde çalışmak üzere tasarlanan çoğu işletim sistemi zaten işaretli 64 bit
time_t
tam sayıları kullanıyor. İmzalanmış 64 bitlik bir değer kullanılması, evrenin tahmini yaşından yirmi kat fazla yirmi kat daha fazla olan yeni bir sarma tarihi sunar: 4 Aralık 292,277,026,596, bundan sonraki yaklaşık 292 milyar yıl, 15:30: 08'de. Tarihler üzerinde hesaplamalar yapabilme özelliği,tm_year
yıl için 1900'den başlayan imzalı bir 32 bit int değeri kullanır. Bu, yılı maksimum 2,147,485,547 (2,147,483,647 + 1900) ile sınırlandırır. Bu, programların yürütülmesi sorununu çözerken, çoğu katı depolama formatları kullanan, tarih değerlerinin ikili veri dosyaları içinde saklanması sorununu çözmez. Ayrıca uyumluluk katmanları altında çalışan 32 bit programlar için sorunu çözmez ve zaman değerlerini dışındaki türlerdeki değişkenlerde yanlış saklayan programlar için sorunu çözemeztime_t
.
Ubuntu 13.04'ü 64-bit kullanıyorum ve merakımla zamanı 2038-01-19 03:13:00 olarak değiştirdim. 03:14:08 sonra hiçbir şey olmadı:
Yani bu konuda endişelenecek bir şey yok.
Hakkında daha ayrıntılı:
Aşağıdaki Perl betiğini kullanarak bilgisayarınızın saatinin çöküp çökmeyeceğini kontrol edebilirsiniz:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Bilgisayarınız iyi olacaksa, şunu alacaksınız:
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
Bilgisayarınız benimkine benziyorsa, şöyle sarılır:
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
Bunu da yapabilir:
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
mı?
1996'da bu konuda kısa bir yazı yazdım ve yayınladım. Bu, onu göstermek için kısa bir C programı içeriyordu. Ayrıca David Mills ile NTP - Ağ Zaman Protokolü ile benzer konular hakkında e-postalar aldım. Ubuntu 14.04 64-bit dizüstü bilgisayarımda perl kodu sınırlama getirmedi, bu nedenle temel 64-bit lib'lerin değiştirilmiş olması gerekiyordu.
Bununla birlikte, uzun zaman önce yapılan test kodumu çalıştırmak, UNIX Dönemi’ne geri dönme zamanını gösteriyor. Yani geçmişten gelen 32 bitlik kod ile her şey yolunda değil.
1996 yazım, UNIX zamanı 2038'de bitecek! 2000 yılından bu yana web sitemde yayınlandı. Bu "UNIX Time" başlıklı bir varyantı 1998 yılında "Y2K Millennium Computing için En İyi 2000 Yılı 2000 Yılı" ISBN 0136465064'te yayınlandı.
64-bit Linux hazır, en azından çekirdek işletim sistemi arayüzlerinden bahsediyorsanız (bireysel uygulamalar elbette hala bozulabilir). time_t geleneksel olarak 64-bit linux üzerinde "uzun" ve "uzun" için bir takma ad olarak tanımlanır, 64-bit'tir.
32 bit Linux için durum (ve 64 bit Linux'ta 32 bit ikili dosyalar için uyumluluk katmanı) çok daha az pembe. Mevcut tüm ikili dosyaları bozmadan kırılması ve düzeltilmesi kolay bir iş değildir. Tüm API'ler time_t kullanır ve çoğu durumda veri yapılarının bir parçası olarak gömülür, bu nedenle yalnızca API'lerin çoğaltılması değil, birlikte çalıştıkları veri yapılarının da olması gerekir.
Bir miktar geriye dönük uyumluluk seviyesi olsa bile, doğru zaman almak isteyen tüm ikili dosyaların yeni 64-bit zaman arayüzlerini kullanmak için yeniden inşa edilmesi gerekecektir.
Bazı çalışmalar yapıldı (örneğin https://lwn.net/Articles/643234/ ve http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html sayfasına bakın ) hala tam bir çözümden uzun bir yol. Y2K38 güvenli olan genel amaçlı 32-bit dağıtımların olup olmayacağı açık değildir.