Aparentemente, no, no es posible. Para empezar, solo hay un time()
función en Linux, sin time32()
o time64()
.
Después de buscar por un tiempo, puedo ver que no es culpa de libc, pero el culpable es en realidad el kernel.
Para que libc obtenga la hora actual, debe ejecutar una llamada al sistema:
time_t time (t) time_t *t;
{
// ...
INTERNAL_SYSCALL_DECL (err);
time_t res = INTERNAL_SYSCALL (time, err, 1, NULL);
// ...
return res;
}
La llamada al sistema se define como:
SYSCALL_DEFINE1(time, time_t __user *, tloc)
{
time_t i = get_seconds();
// ...
return i;
}
La función get_seconds()
devuelve un unsigned long
, así:
unsigned long get_seconds(void)
{
struct timekeeper *tk = &timekeeper;
return tk->xtime_sec;
}
Y timekeeper.xtime_sec
en realidad es de 64 bits:
struct timekeeper {
// ...
/* Current CLOCK_REALTIME time in seconds */
u64 xtime_sec;
// ...
}
Ahora, si conoces tu C, sabes que el tamaño de unsigned long
en realidad depende de la implementación. En mi máquina de 64 bits aquí, es de 64 bits; pero en mi máquina de 32 bits aquí, es de 32 bits. Es posiblemente podría ser de 64 bits en alguna implementación de 32 bits, pero no hay garantía.
Por otro lado, u64
siempre es de 64 bits, por lo que, en la base, el kernel realiza un seguimiento del tiempo en un tipo de 64 bits. Por qué luego procede a devolver esto como un unsigned long
, que no se garantiza que sea de 64 bits, me supera.
Al final, incluso si libc obligara a time_t
para mantener un valor de 64 bits, no cambiaría nada.
Podría vincular su aplicación profundamente al kernel, pero no creo que valga la pena.
Muchas respuestas anteriores dijeron que esto es imposible, pero eso es totalmente incorrecto . era no era posible en ese momento, pero la gente había estado hablando de arreglarlo durante años. Finalmente, se introdujo el soporte de tiempo de 64 bits en plataformas de 32 bits en el kernel de Linux 5.1 con la adición del nuevo *time64
llamadas al sistema. Mire esta tabla, puede ver que esas llamadas al sistema solo están disponibles en plataformas de 32 bits. Ahora, si está escribiendo código para sistemas de 32 bits, puede llamar al clock_gettime64
directamente (desde ensamblador en línea o C con syscall()
) para obtener la hora actual
Sin embargo, después de eso, estás completamente solo. Si desea un espacio de usuario completo soporte debe estar en Linux 5.6 o superior junto con musl 1.2+ o glibc 2.32+. Simplemente reconstruya su código y su time_t
tendrá una longitud de 64 bits
-
Todo el espacio de usuario debe compilarse con un
time_t
de 64 bits , que será compatible con las próximas versiones musl-1.2 y glibc-2.32, junto con los encabezados del kernel instalados desde linux-5.6 o superior. -
Las aplicaciones que usan las interfaces de llamada del sistema directamente deben ser portadas para usar el
time64
Se agregaron llamadas al sistema en Linux-5.1 en lugar de las llamadas al sistema existentes. Esto afecta a la mayoría de los usuarios defutex()
yseccomp()
así como lenguajes de programación que tienen su propio entorno de tiempo de ejecución no basado en libc.
https://lkml.org/lkml/2020/1/29/355?anz=web
Para más información
- Acercándonos al final del juego del año kernel 2038
- Manejo de símbolos de tiempo de 64 bits en la biblioteca GNU C
- glibc Y2038 Diseño de prueba
- Cambiar time_t y clock_t a 64 bits