GNU/Linux >> Tutoriales Linux >  >> Linux

Valores máximos para time_t (struct timespec)

Dado que las personas aquí están respondiendo cómo establecer el máximo time_t y hacer más conjeturas sobre su tipo, pensé en agregar el c++ forma de hacerlo:

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

No me importaría mucho lo que entra en un time_t , sino sobre lo que es razonable. En cualquier sistema que haya visto, un time_t puede codificar lapsos de tiempo desde 63 años hasta 10 años (prácticamente todos los sistemas que conozco usan números de 64 bits desde que estos genios idearon el fin del mundo Y2K en 1999, queda por ver quién notará el mucho más grande "evento" cuando pasa el año 2038).

Si espera razonablemente que su programa estará funcionando por no más de 50 años, rechace cualquier valor mayor a 50*365*86400, o simplemente sature el valor. No espero que ninguno de los programas que escribo ahora esté en uso dentro de 50 años (aunque no viviré para verificarlo).
Por otro lado, si su sistema no use un time_t de 32 bits , entonces no importa de todos modos, porque el tiempo del sistema se habrá desbordado en 50 años de cualquier manera, por lo que de todos modos no se puede construir un tiempo significativo sin cambiar de época.

Si pregunta "¿cuánto tiempo desea hacer una pausa?" y el usuario dice "250 años", consideraría que no es realmente un comportamiento incorrecto del programa si dijera "sí, claro, 50 también servirán". Porque, bueno, la diferencia realmente no es observable.


Según Wikipedia, time_t puede ser un número entero o de coma flotante, pero normalmente es un número entero con signo de 32 o 64 bits. Creo que el valor seguro más grande que puede asumir es INT_MAX . Para time_t al menos los números negativos son legales y se refieren a antes del 1 de enero de 1970.


Desafortunadamente, el estándar ISO C (actualmente C11) no proporciona ninguna forma de obtener el valor máximo de time_t . Entonces, a menos que uno use herramientas como Autoconf para proporcionar información, uno necesita hacer algunas suposiciones.

Suponiendo que time_t es un tipo entero sin bits de relleno (que es el caso en la mayoría de las plataformas hoy en día, si no en todas), uno probablemente puede tomar:

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

que es el valor máximo representable para un tipo entero con signo (pero el hecho de que un valor sea representable en time_t no significa que sea compatible con el sistema como time_t valor).

También se puede querer detectar si time_t es de tipo entero. El estándar ISO C especifica que time_t es un tipo real (Cláusula 7.27.1). Por definición, un tipo real es un tipo entero o un tipo flotante real (float , double o long double , y posiblemente otros agregados en futuras versiones del estándar, como se menciona en la Cláusula 6.11.1). Por lo tanto, si time_t no es un tipo entero, es necesariamente un tipo flotante real. Como consecuencia, se puede detectar si time_t es un tipo entero con la prueba (time_t) 1 / 2 == 0 .

Nota:El estándar C no requiere estrictamente que (T) 1 / 2 ser diferente de 0 si T es de tipo flotante, pero si este no es el caso, sospecho que tales plataformas tendrían serios problemas con los cálculos de punto flotante.


Linux
  1. Tutorial de comandos de tipo Linux para principiantes (con ejemplos)

  2. ¿Qué define el tamaño máximo para un solo argumento de comando?

  3. ¿Cómo escribir la contraseña para varias ventanas?

  4. ¿Cómo encontrar la aplicación para un tipo Mime en Linux?

  5. ¿Cómo buscar claves o valores en Dconf?

Obtener valores de Helm para una versión de Helm

¿Cómo deshabilitar un alias en Bash para un solo comando?

Formato de estructura timespec

Convertir milisegundos a especificación de tiempo para el puerto GNU

¿Cuál es la identificación de partición/tipo de sistema de archivos para UDF?

Establecer la velocidad máxima para scp