Estou um pouco preocupado com isso. É chamado de "problema do ano 2038". O kernel Linux ou Ubuntu está pronto para lidar com datas após isso ainda, a partir de 12.04?
Estou um pouco preocupado com isso. É chamado de "problema do ano 2038". O kernel Linux ou Ubuntu está pronto para lidar com datas após isso ainda, a partir de 12.04?
Respostas:
Não, não irá falhar. Na pior das hipóteses, do ponto de vista de um programador, ele funcionará conforme o esperado: será redefinido para a data 1901-12-13 20:45:52:
Nesse caso, você não atualizará suas distribuições atuais até que isso aconteça. "A atualização é fácil. Uma dessas atualizações certamente conterá uma correção ", disse chocobai .
Lembro que era o mesmo problema / pergunta com máquinas de 16 bits antes de 2000 e, no final, não havia nenhum problema.
Uma solução da Wikipedia:
A maioria dos sistemas operacionais projetados para executar em hardware de 64 bits já usa
time_t
números inteiros assinados de 64 bits . O uso de um valor assinado de 64 bits apresenta uma nova data envolvente que é vinte vezes maior que a idade estimada do universo: daqui a aproximadamente 292 bilhões de anos, às 15:30:08 de domingo, 4 de dezembro, 292.277.026.596. A capacidade de fazer cálculos em datas é limitada pelo fato de quetm_year
usa um valor int assinado de 32 bits a partir de 1900 para o ano. Isso limita o ano a um máximo de 2.147.485.547 (2.147.483.647 + 1900). Enquanto isso resolve o problema de execução de programas, não resolve o problema de armazenar valores de data em arquivos de dados binários, muitos dos quais empregam formatos rígidos de armazenamento. Também não resolve o problema de programas de 32 bits em execução em camadas de compatibilidade e pode não resolver o problema de programas que armazenam incorretamente valores de tempo em variáveis de tipos diferentes detime_t
.
Uso o Ubuntu 13.04 em 64 bits e, por curiosidade, mudei manualmente o horário para 2038-01-19 03:13:00. Após 03:14:08 nada aconteceu:
Portanto, não há nada para se preocupar com esse problema.
Mais sobre:
Você pode verificar se o tempo do seu computador falhará usando o seguinte script Perl:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Se o seu computador estiver bom, você receberá o seguinte:
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
Se o seu computador for como o meu, ele será dividido desta maneira:
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
Também poderia fazer isso:
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
?
Escrevi e publiquei um pequeno artigo sobre isso em 1996. Isso incluía um pequeno programa em C para demonstrá-lo. Também tive e-mails com David Mills sobre problemas semelhantes com o NTP, o Network Time Protocol. No meu laptop Ubuntu 14.04 de 64 bits, o código perl não exibia a limitação, portanto as bibliotecas de 64 bits subjacentes devem ter sido modificadas.
No entanto, a execução do meu código de teste há muito tempo mostra o tempo que remonta à época do UNIX. Portanto, nem tudo está bem com o código de 32 bits do passado.
Meu artigo de 1996, O tempo UNIX se esgotará em 2038! está no meu site desde cerca de 2000. Uma variante deste título "UNIX Time" foi publicada em 1998 no "Ano 2000 Melhores Práticas para a Computação do Milênio Y2K" ISBN 0136465064.
O Linux de 64 bits está pronto, pelo menos se você estiver falando sobre as principais interfaces do sistema operacional (aplicativos individuais, é claro, ainda podem estragar tudo). O time_t é tradicionalmente definido como um alias para "long" e "long" no Linux de 64 bits.
A situação do Linux de 32 bits (e a camada de compatibilidade dos binários de 32 bits no Linux de 64 bits) é muito menos otimista. Está quebrado e corrigi-lo sem quebrar todos os binários existentes não é uma tarefa fácil. Um monte de APIs usa time_t e, em muitos casos, é incorporado como parte das estruturas de dados, para que as APIs não sejam apenas duplicadas, mas também as estruturas de dados com as quais trabalham.
Mesmo se houver algum nível de compatibilidade com versões anteriores, todos os binários que desejam obter o tempo correto precisarão ser reconstruídos para usar as novas interfaces de tempo de 64 bits.
Houve algum trabalho realizado (veja, por exemplo, https://lwn.net/Articles/643234/ e http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ), mas afirmamos que ainda estão muito longe de uma solução completa. Não está claro se haverá ou não distribuições de 32 bits de uso geral que são seguras para o Y2K38.