2013-01-16 4 views
13

Unter Windows zu bekommen ich anrufen kann:Gibt es eine Möglichkeit 64-Bit-time_t in 32-Bit-Programm in Linux

_time32(__time32_t); // to get 32bit time_t 
_time64(__time64_t); // to get 64bit time_t 

(beide in 32 und 64 Bit Programme)

Gibt es eine Möglichkeit mach das unter Linux (Kompilieren mit GCC)?

+0

@Benoit Diese Frage ist kein Duplikat, es ist völlig anders. – interjay

+1

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). –

+1

siehe auch ** [64-Bit-UNIX-Timestamp-Konvertierung] (http://stackoverflow.com/questions/7914368/64-bit-unix-timestamp-conversion) ** –

Antwort

10

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.

+0

Also, schreibe einen Patch und poste es. Sowohl für libc (typedef long long int time_t) als auch für den Kernel long long int get_seconds (void) – user877329

6

Keine time64()/time32() Funktion ist in Standardbibliotheken enthalten.

Keine time32_t/time64_t definiert sind in Standard-Header berücksichtigt.

time_t wird in time.h als typedef __time_t time_t definiert;

Nach einer langen Kette von Neudefinitionen werden Sie feststellen, dass __time_t als 32 Bit auf 32 Bit Maschinen und 64 Bit auf 64 Bit Maschinen definiert ist.

0

Wenn Sie das wirklich brauchen, warum rollen Sie nicht Ihre eigenen?

typedef int32_t my_time32; 
typedef int64_t my_time64; 


my_time32 get_mytime32() { 
    if (sizeof(time_t) == sizeof(my_time32)) 
     return time(NULL); 
    else { 
     /* Check for overflow etc. here... */ 
     return (my_time32)(time(NULL)); 
    } 
} 

Und in ähnlicher Weise für get_mytime64().

Wenn Sie sich nicht für Überlauf interessieren, würde ein einfaches return time(NULL); für beide Funktionen dank C implizite numerische Konvertierungen funktionieren.

+0

Ich denke nicht eine einfache Rückkehr Zeit (NULL); würde für get_mytime64() auf 32-Bit-Plattformen funktionieren - es würde nur abgeschnitten werden. – rsaxvc

+0

@rsaxvc Ja, daher der Kommentar "auf Überlauf usw. hier prüfen". Im Allgemeinen haben Sie ein Problem mit 32-Bit-Zeiten – Nemo

Verwandte Themen