2013-01-16 75 views
13

在Windows上我可以打電話:有沒有什麼辦法讓64位time_t的32位程序在Linux中

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

(均在32個和64位程序)

有什麼辦法在Linux中執行此操作(使用GCC編譯)?

+0

@Benoit這個問題不是重複的,它完全不同。 – interjay

+1

在32位Linux上並非如此,'time_t'是傳統的32位有符號數量,只剩下25年的使用壽命。在64位Unix系統上,它已經是64位數量。如果你想要一個可移植的類型,你必須適當地定義你自己的地圖,或者小心使用'time_t'。引用的另一個問題有相關的信息(但我同意它不是重複的)。 –

+1

另請參閱** [64位UNIX時間戳轉換](http://stackoverflow.com/questions/7914368/64-bit-unix-timestamp-conversion)** –

回答

10

顯然,不,這是不可能的。對於初學者來說,在Linux中只有一個time()函數,沒有time32()time64()

經過了一段時間,我發現它不是libc的錯,但罪魁禍首實際上是內核。

爲了libc中來獲取當前時間,它需要執行系統調用它:Source

time_t time (t) time_t *t; 
{ 
    // ... 
    INTERNAL_SYSCALL_DECL (err); 
    time_t res = INTERNAL_SYSCALL (time, err, 1, NULL); 
    // ... 
    return res; 
} 

系統調用定義爲:Source

SYSCALL_DEFINE1(time, time_t __user *, tloc) 
{ 
    time_t i = get_seconds(); 
    // ... 
    return i; 
} 

get_seconds()返回unsigned long,像這樣的功能:Source

unsigned long get_seconds(void) 
{ 
    struct timekeeper *tk = &timekeeper; 

    return tk->xtime_sec; 
} 

而且timekeeper.xtime_sec實際上是64位:Source

struct timekeeper { 
    // ... 
    /* Current CLOCK_REALTIME time in seconds */ 
    u64      xtime_sec; 
    // ... 
} 

現在,如果你知道你的C,你知道的unsigned long大小實際上是依賴於實現。在我的64位機器上,它是64位的;但在我的32位機器上,它是32位的。它可能是可能在某些32位實現上可能是64位,但不能保證。

另一方面,u64始終是64位,所以在最基本的位置,內核以64位類型記錄時間。然後,爲什麼它返回這個不能保證是64位長的unsigned long超出了我的想象。最後,即使libc會強制time_t保存一個64位值,它也不會改變一件事情。

您可以將您的應用程序深入到內核中,但我認爲它甚至不值得。

+0

因此,編寫一個補丁併發布它。兩者用於libc(typedef long long int time_t)和內核long long int get_seconds(void) – user877329

6

編號time64()/time32()函數被包含在標準庫中。

沒有time32_t/time64_t定義是在標準頭文件中設想的。

time_t定義爲time.htypedef __time_t time_t;

經過長時間的重新定義,您會發現__time_t被定義爲32位機器上的32位和64位機器上的64位。

0

如果你真的需要這個,爲什麼不自己推出?

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)); 
    } 
} 

並且類似地爲get_mytime64()

如果你不關心溢出,一個簡單的return time(NULL);將適用於這兩個函數感謝C的隱式數值轉換。

+0

我不認爲簡單的返回時間(NULL);將在32位平臺上適用於get_mytime64() - 它只會截斷。 – rsaxvc

+0

@rsaxvc因此,「檢查溢出等在這裏」評論。一般來說,你有一個處理32位時間的問題 – Nemo

相關問題