{"id":6728,"date":"2020-01-06T18:04:00","date_gmt":"2020-01-06T17:04:00","guid":{"rendered":"http:\/\/kergroixnoble.fr\/blog\/?p=6728"},"modified":"2020-01-05T11:14:38","modified_gmt":"2020-01-05T10:14:38","slug":"50-ans-dunix","status":"publish","type":"post","link":"https:\/\/kergroixnoble.fr\/blog\/2020\/50-ans-dunix\/","title":{"rendered":"50 ans d&rsquo;UNIX"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignleft size-medium\"><a href=\"https:\/\/kergroixnoble.fr\/blog\/wp-content\/uploads\/2020\/01\/20200104_170810_0006_pfz200.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/kergroixnoble.fr\/blog\/wp-content\/uploads\/2020\/01\/20200104_170810_0006_pfz200-300x225.jpg\" alt=\"\" class=\"wp-image-6756\" srcset=\"https:\/\/kergroixnoble.fr\/blog\/wp-content\/uploads\/2020\/01\/20200104_170810_0006_pfz200-300x225.jpg 300w, https:\/\/kergroixnoble.fr\/blog\/wp-content\/uploads\/2020\/01\/20200104_170810_0006_pfz200.jpg 550w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Tout est parti d&rsquo;un post de <a href=\"https:\/\/www.bortzmeyer.org\">St\u00e9phane Bortzmeyer<\/a> sur les <a href=\"https:\/\/www.bortzmeyer.org\/epoch-50.html\">50 ans<\/a> d&rsquo;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Unix\">UNIX<\/a>, ou plut\u00f4t de son <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Epoch\">epoch<\/a>. St\u00e9phane est quelqu&rsquo;un de tr\u00e8s connu dans la communaut\u00e9 du libre et en g\u00e9n\u00e9ral, ce qu&rsquo;il \u00e9crit est non seulement tr\u00e8s int\u00e9ressant mais plus que fiable. Mais l\u00e0, sur le coup, j&rsquo;ai eu un doute soudain.<\/p>\n\n\n\n<p><strong>1577836800<\/strong><\/p>\n\n\n\n<p>L&rsquo;epoch d&rsquo;UNIX d\u00e9marre au 1\u1d49\u02b3 janvier 1970 et s&rsquo;incr\u00e9mente de 1 chaque seconde. En gros, c&rsquo;est le nombre de seconde depuis ce premier janvier l\u00e0. Ainsi, pour les 50 ans d&rsquo;UNIX, le 1\u1d49\u02b3  janvier 2020, l&rsquo;epoch valait 1577836800 secondes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># date --date='@0'\njeudi 1 janvier 1970, 01:00:00 (UTC+0100)\n\n# date --date='@1577836800'\nmercredi 1 janvier 2020, 01:00:00 (UTC+0100)<\/code><\/pre>\n\n\n\n<p>Les jours commencent normalement \u00e0 0 h pile mais \u00e9tant sur l&rsquo;heure de Paris, nous avons une heure de d\u00e9calage par rapport au temps <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Temps_universel_coordonn%C3%A9\">UTC<\/a>. En effet, le calcul interne du temps d&rsquo;une machine UNIX se fait toujours en <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Temps_moyen_de_Greenwich\">GMT<\/a> (Greenwich) contrairement au syst\u00e8me Windows de Microsoft qui utilisait en interne le temps local (je ne sais pas ce qu&rsquo;il advient sur les derni\u00e8res versions).<\/p>\n\n\n\n<p><strong>Comment arrive-t-on \u00e0 ce nombre-l\u00e0 ?<\/strong><\/p>\n\n\n\n<p>Il suffit de faire sur votre calculette ou dans votre terminal <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Bourne-Again_shell\">Bash<\/a> le petit calcul suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># echo $(( 3600 * 24 * ( 50 * 365 + 12 ) ))\n1577836800<\/code><\/pre>\n\n\n\n<p>Pour les perdus en Math, on d\u00e9taille  un peu ! Dans un jour, il y a 24 h de 3600 s chacune. On multiplie ce nombre par le nombre d&rsquo;ann\u00e9e et de jour dans l&rsquo;ann\u00e9e soit 50 fois 365. Mais, il ne faut pas oublier qu&rsquo;il y a des ann\u00e9es bissextiles dans lesquelles il y a 1 jour de plus. Vous pouvez refaire le calcul pour montrer qu&rsquo;il y en a 12 sur cette p\u00e9riode (la partie enti\u00e8re de 50\/4 donne le bon r\u00e9sultat dans le cas pr\u00e9sent).<\/p>\n\n\n\n<p><strong>Rien ne vous choque ?<\/strong><\/p>\n\n\n\n<p>Si non, passez votre chemin ! Si oui, vous pouvez prolonger la lecture de quelques minutes suppl\u00e9mentaires&#8230;<\/p>\n\n\n\n<p>Sur le coup, je me suis dit qu&rsquo;il n&rsquo;y a que tr\u00e8s peu de chance que le nombre total de seconde entre ces deux premiers janviers finisse par un nombre multiple de 100 (finissant par un double z\u00e9ro), m\u00eame si dans la formule nous multiplions par 3600 donc par 100 ! Pourquoi donc ?<\/p>\n\n\n\n<p><strong>Les secondes intercalaires&#8230;<\/strong><\/p>\n\n\n\n<p>Qu&rsquo;est-ce que c&rsquo;est que \u00e7a ? La <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Seconde_intercalaire\">seconde intercalaire<\/a> permet d&rsquo;ajuster de temps en temps, pas souvent, d&rsquo;une <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Seconde_(temps)\">seconde<\/a> le <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Temps_universel_coordonn%C3%A9\">temps universel coordonn\u00e9<\/a> (UTC) li\u00e9 au <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Temps_atomique_international\">temps atomique international<\/a> (TAI) afin que ce temps demeure proche du <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Temps_universel\">temps universel<\/a> (UT1) li\u00e9 \u00e0 la rotation de la Terre (lentement variable). Eh oui, un jour tr\u00e8s lointain, la Terre ne tournera plus sur elle-m\u00eame.<\/p>\n\n\n\n<p>En bref, on ajoute parfois une seconde ici ou l\u00e0. Il y a donc des minutes qui durent 61 s et non 60 s. Il est tr\u00e8s peu probable d&rsquo;avoir ajout\u00e9 100 s en 50 ans. Effectivement, ce n&rsquo;est pas le cas.<\/p>\n\n\n\n<p>Comme la commande \u00abdate\u00bb d&rsquo;UNIX ne me permet pas de faire un calcul pr\u00e9cis du temps, je vais utiliser un petit programme en <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Perl_(langage)\">Perl<\/a> ayant l\u2019excellente biblioth\u00e8que <a href=\"https:\/\/metacpan.org\/pod\/DateTime\">DateTime<\/a> qui int\u00e8gre la gestion des secondes intercalaires.<\/p>\n\n\n\n<p>Voici un petit bout de code qu&rsquo;on peut \u00e9crire dans le fichier \u00abdate-unix-50years\u00bb.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/perl\n\nuse strict;\nuse DateTime;\n\nmy $dt1970 = DateTime->from_epoch(epoch => 0,\n   time_zone   => 'Europe\/Paris');\nmy $dt2020 = DateTime->new(\n   year        => 2020,\n   month       => 01,\n   day         => 01,\n   hour        => 01,\n   minute      => 00,\n   second      => 00,\n   time_zone   => 'Europe\/Paris');\n\nprintf \"%7i: %10i s\\n\", 1970, $dt1970->epoch;\nprintf \"%7i: %10i s\\n\", 2020, $dt2020->epoch;\n\nmy $duration = $dt2020->subtract_datetime_absolute($dt1970);\nmy ($seconds) = $duration->in_units('seconds');\n\nprintf \"%7s: %10i s\\n\", 'Elapsed', $seconds;\nprintf \"%7s: %10i s\\n\", 'Leap', $dt2020->leap_seconds();<\/code><\/pre>\n\n\n\n<p>On lance le code et voici ce qu&rsquo;il nous retourne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># .\/date-unix-50years\n   1970:          0 s\n   2020: 1577836800 s\nElapsed: 1577836827 s\n   Leap:         27 s<\/code><\/pre>\n\n\n\n<p>On retrouve bien les r\u00e9sultats pr\u00e9c\u00e9dents sur les temps epoch. Cela nous arrange quelque part, nous ne sommes pas en train de faire n&rsquo;importe quoi ! Nous avons utilis\u00e9 la m\u00e9thode \u00ab<a href=\"https:\/\/metacpan.org\/pod\/DateTime#$dt-%3Esubtract_datetime_absolute(-$datetime-)\">subtract_datetime_absolute<\/a>\u00bb qui prend en compte correctement le temps absolu. Par ailleurs, la m\u00e9thode \u00ab<a href=\"https:\/\/metacpan.org\/pod\/DateTime#$dt-%3Eleap_seconds()\">leap_seconds<\/a>\u00bb retourne le nombre de secondes intercalaires d&rsquo;une date donn\u00e9e.<\/p>\n\n\n\n<p>Il y a donc 1577836827 secondes entre ces deux dates distantes de 50 ans, soit <strong>27 s<\/strong> de plus que ce que nous donnait un b\u00eate calcul. Afin de valider tout cela, voici le <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Seconde_intercalaire#Historique\">tableau<\/a> donnant les secondes intercalaires depuis leur cr\u00e9ation en 1972. Il y a bien eu 27 secondes ajout\u00e9es ces derni\u00e8res 50 ann\u00e9es. Mine de rien, ce n&rsquo;est pas compl\u00e8tement nul !<\/p>\n\n\n<h2 id=\"tablepress-3-name\" class=\"tablepress-table-name tablepress-table-name-id-3\">Tableau des secondes intercalaires entre 1972 et 2019<\/h2>\n\n<table id=\"tablepress-3\" class=\"tablepress tablepress-id-3\" aria-labelledby=\"tablepress-3-name\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">Ann\u00e9e<\/th><th class=\"column-2\">30 juin<br \/>\n23:59:60<\/th><th class=\"column-3\">31 d\u00e9c.<br \/>\n23:59:60<\/th><td class=\"column-4\"><\/td><th class=\"column-5\">Ann\u00e9e<\/th><th class=\"column-6\">30 juin<br \/>\n23:59:60<\/th><th class=\"column-7\">31 d\u00e9c.<br \/>\n23:59:60<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">1972<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">1997<\/td><td class=\"column-6\">1<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">1973<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">1998<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">1<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">1974<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">1999<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">1975<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2000<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-6\">\n\t<td class=\"column-1\">1976<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2001<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-7\">\n\t<td class=\"column-1\">1977<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2002<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-8\">\n\t<td class=\"column-1\">1978<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2003<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-9\">\n\t<td class=\"column-1\">1979<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2004<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-10\">\n\t<td class=\"column-1\">1980<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2005<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">1<\/td>\n<\/tr>\n<tr class=\"row-11\">\n\t<td class=\"column-1\">1981<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2006<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-12\">\n\t<td class=\"column-1\">1982<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2007<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-13\">\n\t<td class=\"column-1\">1983<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2008<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">1<\/td>\n<\/tr>\n<tr class=\"row-14\">\n\t<td class=\"column-1\">1984<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2009<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-15\">\n\t<td class=\"column-1\">1985<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2010<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-16\">\n\t<td class=\"column-1\">1986<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2011<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-17\">\n\t<td class=\"column-1\">1987<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2012<\/td><td class=\"column-6\">1<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-18\">\n\t<td class=\"column-1\">1988<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2013<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-19\">\n\t<td class=\"column-1\">1989<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2014<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-20\">\n\t<td class=\"column-1\">1990<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2015<\/td><td class=\"column-6\">1<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-21\">\n\t<td class=\"column-1\">1991<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2016<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">1<\/td>\n<\/tr>\n<tr class=\"row-22\">\n\t<td class=\"column-1\">1992<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2016<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">1<\/td>\n<\/tr>\n<tr class=\"row-23\">\n\t<td class=\"column-1\">1993<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2017<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-24\">\n\t<td class=\"column-1\">1994<\/td><td class=\"column-2\">1<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2018<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-25\">\n\t<td class=\"column-1\">1995<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">1<\/td><td class=\"column-4\"><\/td><td class=\"column-5\">2019<\/td><td class=\"column-6\">0<\/td><td class=\"column-7\">0<\/td>\n<\/tr>\n<tr class=\"row-26\">\n\t<td class=\"column-1\">1996<\/td><td class=\"column-2\">0<\/td><td class=\"column-3\">0<\/td><td class=\"column-4\"><\/td><td class=\"column-5\"><\/td><td class=\"column-6\"><\/td><td class=\"column-7\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-3 from cache -->\n\n\n\n<p>On est en droit de se demander pourquoi il y en a de moins en moins depuis les ann\u00e9es 2000 ? Mais cela est une autre histoire&#8230;<\/p>\n\n\n\n<p>Alors pourquoi l&rsquo;epoch des syst\u00e8mes UNIX ne g\u00e8rent pas les secondes intercalaires ? Cela est en partie d\u00fb \u00e0 la <em>norme<\/em> <a href=\"https:\/\/fr.wikipedia.org\/wiki\/POSIX\">POSIX<\/a> qui n&rsquo;est pas coh\u00e9rente sur le temps. En effet, POSIX exige \u00e0 la fois des jours durant exactement 86400 s et des dates repr\u00e9sentant le temps UTC. Les deux \u00e9tant incompatibles, il est donc impossible de repr\u00e9senter correctement le temps l\u00e9gal et d&rsquo;\u00eatre POSIX. Le choix de respecter une dur\u00e9e journali\u00e8re en nombre de seconde est (\u00e9tait) le plus simple, le plus rapide et limite le risque de bogue, mais \u00e0 quelques inconv\u00e9nients&#8230; En pratique, les machines UNIX rattrapent petit \u00e0 petit cette seconde avant ou apr\u00e8s la seconde intercalaire en se synchronisant automatiquement avec des serveurs de temps g\u00e9rant le protocole <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Network_Time_Protocol\">NTP<\/a>. \u00c0 noter que depuis Windows 10, Microsoft a int\u00e9gr\u00e9 la gestion des secondes intercalaires au c\u0153ur de son syst\u00e8me d&rsquo;exploitation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tout est parti d&rsquo;un post de St\u00e9phane Bortzmeyer sur les 50 ans d&rsquo;UNIX, ou plut\u00f4t de son epoch. St\u00e9phane est quelqu&rsquo;un de tr\u00e8s connu dans la communaut\u00e9 du libre et en g\u00e9n\u00e9ral, ce qu&rsquo;il \u00e9crit est non seulement tr\u00e8s int\u00e9ressant &hellip; <a href=\"https:\/\/kergroixnoble.fr\/blog\/2020\/50-ans-dunix\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[9],"class_list":["post-6728","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-my"],"_links":{"self":[{"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/posts\/6728"}],"collection":[{"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/comments?post=6728"}],"version-history":[{"count":25,"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/posts\/6728\/revisions"}],"predecessor-version":[{"id":6763,"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/posts\/6728\/revisions\/6763"}],"wp:attachment":[{"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/media?parent=6728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/categories?post=6728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kergroixnoble.fr\/blog\/wp-json\/wp\/v2\/tags?post=6728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}