在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編譯)?
在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編譯)?
顯然,不,這是不可能的。對於初學者來說,在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位值,它也不會改變一件事情。
您可以將您的應用程序深入到內核中,但我認爲它甚至不值得。
因此,編寫一個補丁併發布它。兩者用於libc(typedef long long int time_t)和內核long long int get_seconds(void) – user877329
編號time64()/time32()
函數被包含在標準庫中。
沒有time32_t/time64_t
定義是在標準頭文件中設想的。
time_t
定義爲time.h
爲typedef __time_t time_t
;
經過長時間的重新定義,您會發現__time_t
被定義爲32位機器上的32位和64位機器上的64位。
如果你真的需要這個,爲什麼不自己推出?
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的隱式數值轉換。
@Benoit這個問題不是重複的,它完全不同。 – interjay
在32位Linux上並非如此,'time_t'是傳統的32位有符號數量,只剩下25年的使用壽命。在64位Unix系統上,它已經是64位數量。如果你想要一個可移植的類型,你必須適當地定義你自己的地圖,或者小心使用'time_t'。引用的另一個問題有相關的信息(但我同意它不是重複的)。 –
另請參閱** [64位UNIX時間戳轉換](http://stackoverflow.com/questions/7914368/64-bit-unix-timestamp-conversion)** –