GNU/Linux >> Tutoriels Linux >  >> Linux

Valeurs maximales pour time_t (struct timespec)

Puisque les gens ici répondent comment définir le maximum time_t valeur, et faire des suppositions quant à son type, j'ai pensé que j'ajouterais le c++ façon de faire :

#include <limits>
...
time_t maxTime = std::numeric_limits<time_t>::max();

Je ne me soucierais pas tellement de ce qui se passe dans un time_t , mais sur ce qui est raisonnable. Sur tous les systèmes que j'ai vus, un time_t peut encoder des périodes allant de 63 ans à 10 ans (presque tous les systèmes que je connais utilisent des nombres 64 bits depuis que ces génies ont inventé la fin du monde Y2K en 1999, il reste à voir qui remarquera le beaucoup plus grand "événement" lorsque l'année 2038 passe).

Si vous attendez raisonnablement que votre programme ne fonctionnera pas plus de 50 ans, rejetez toute valeur supérieure à 50*365*86400 ou saturez simplement la valeur. Je ne m'attends pas à ce qu'aucun des programmes que j'écris maintenant soit utilisé dans 50 ans (bien que je ne vivrai pas pour le vérifier).
D'un autre côté, si votre système fait utiliser un time_t 32 bits , alors cela n'a pas d'importance de toute façon, car le temps système aura survolé dans 50 ans de toute façon, donc on ne peut pas construire un temps significatif de toute façon sans changer d'époque.

Si vous demandez "combien de temps voulez-vous faire une pause ?" et que l'utilisateur dit "250 ans", je considérerais qu'il ne s'agit pas d'un comportement de programme vraiment incorrect si vous disiez "ouais, d'accord, 50 suffiront aussi". Parce que, hé, la différence n'est vraiment pas observable.


Selon Wikipédia, time_t peut être un entier ou un nombre à virgule flottante, mais il s'agit généralement d'un entier signé 32 bits ou 64 bits. Je pense que la plus grande valeur sûre que vous pouvez supposer est INT_MAX . Pour time_t au moins les nombres négatifs sont légaux et se réfèrent avant le 1er janvier 1970.


Malheureusement, la norme ISO C (actuellement C11) ne fournit aucun moyen d'obtenir la valeur maximale de time_t . Donc, à moins d'utiliser des outils comme Autoconf fournissant des informations, il faut faire quelques hypothèses.

En supposant que time_t est un type entier sans bits de remplissage (ce qui est le cas sur la plupart des plates-formes de nos jours, sinon toutes), on peut probablement prendre :

(((time_t) 1 << (sizeof(time_t) * CHAR_BIT - 2)) - 1) * 2 + 1

qui est la valeur maximale représentable pour un type entier signé (mais le fait qu'une valeur soit représentable en time_t ne signifie pas qu'il est pris en charge par le système en tant que time_t valeur).

On peut aussi vouloir détecter si time_t est un type entier. La norme ISO C spécifie que time_t est un type réel (Clause 7.27.1). Par définition, un type réel est soit un type entier soit un type réel flottant (float , double ou long double , et éventuellement d'autres ajoutés dans les futures versions de la norme, comme mentionné à l'article 6.11.1). Ainsi, si time_t n'est pas un type entier, c'est nécessairement un vrai type flottant. En conséquence, on peut détecter si time_t est un type entier avec le test (time_t) 1 / 2 == 0 .

Remarque :La norme C n'exige pas strictement que (T) 1 / 2 être différent de 0 si T est un type flottant, mais si ce n'est pas le cas, je soupçonne que de telles plates-formes auraient de sérieux problèmes avec les calculs en virgule flottante.


Linux
  1. Tutoriel de commande de type Linux pour les débutants (avec exemples)

  2. Le didacticiel de commande de type avec des exemples pour les débutants

  3. Comment rechercher des clés ou des valeurs dans Dconf ?

  4. À quoi time_t est-il finalement un typedef ?

  5. Formatage de la structure timespec

Obtenir les valeurs Helm pour une version Helm

Convertir les millisecondes en timespec pour le port GNU

Quel est l'ID de partition/le type de système de fichiers pour UDF ?

Définir la vitesse maximale pour scp

Des valeurs valides pour LC_CTYPE ?

df affiche des valeurs négatives pour utilisé ?