Offenbar ist es nicht möglich. Für den Anfang gibt es nur eine time()
Funktion in Linux, keine time32()
oder time64()
.
Nach der Suche nach einer Weile kann ich sehen, dass es nicht Libc Schuld ist, aber der Schuldige ist eigentlich der Kernel.
Damit Libc die aktuelle Zeit zu holen, braucht es einen Systemaufruf für ihn auszuführen: (Source)
time_t time (t) time_t *t;
{
// ...
INTERNAL_SYSCALL_DECL (err);
time_t res = INTERNAL_SYSCALL (time, err, 1, NULL);
// ...
return res;
}
Der Systemaufruf ist definiert als: (Source)
SYSCALL_DEFINE1(time, time_t __user *, tloc)
{
time_t i = get_seconds();
// ...
return i;
}
Die Funktion get_seconds()
eine unsigned long
zurückkehrt, wie folgt: (Source)
unsigned long get_seconds(void)
{
struct timekeeper *tk = &timekeeper;
return tk->xtime_sec;
}
Und timekeeper.xtime_sec
ist tatsächlich 64-Bit: (Source)
struct timekeeper {
// ...
/* Current CLOCK_REALTIME time in seconds */
u64 xtime_sec;
// ...
}
Nun, wenn Sie Ihre C kennen, wissen Sie, dass die Größe von unsigned long
ist tatsächlich abhängig von der Implementierung . Auf meiner 64-Bit-Maschine hier ist es 64-Bit; aber auf meiner 32-Bit-Maschine hier ist es 32-Bit. Es möglicherweise könnte 64-Bit auf einigen 32-Bit-Implementierung, aber es gibt keine Garantie.
Auf der anderen Seite, u64
ist immer 64-Bit, so an der Basis, der Kernel verfolgt die Zeit in einem 64-Bit-Typ. Warum es dann fortfährt, dieses als unsigned long
zurückzugeben, das garantiert nicht 64 Bit lang ist, ist jenseits von mir.
Am Ende, auch wenn libc time_t
zwingen würde, einen 64-Bit-Wert zu halten, würde es nichts ändern.
Sie könnten Ihre Anwendung tief in den Kernel binden, aber ich denke nicht, dass es sich lohnt.
@Benoit Diese Frage ist kein Duplikat, es ist völlig anders. – interjay
Nicht wirklich ... auf 32-Bit-Linux ist "time_t" eine traditionelle 32-Bit-Menge, die signiert ist und nur noch 25 Jahre Lebensdauer hat. Auf 64-Bit-Unix-Systemen ist es bereits eine 64-Bit-Menge. Wenn Sie einen portablen Typ wünschen, müssen Sie Ihre eigenen Karten entsprechend definieren oder einfach 'time_t' verwenden. Die andere Frage verweist auf relevante Informationen (aber ich stimme zu, dass es kein Duplikat ist). –
siehe auch ** [64-Bit-UNIX-Timestamp-Konvertierung] (http://stackoverflow.com/questions/7914368/64-bit-unix-timestamp-conversion) ** –