有什么办法可以在Linux的32位程序中获得64位的time_t

在Windows上,我可以打电话给:

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

(在32位和64位程序中)

有没有办法在Linux(这与GCC编译)这样做?

Solutions Collecting From Web of "有什么办法可以在Linux的32位程序中获得64位的time_t"

显然,不,这是不可能的。 对于初学者来说,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位的,所以在u64情况下,内核以64位类型跟踪时间。 为什么接下来将这个作为unsigned long整数返回,这不能保证是64位长,超出了我的想法。

最后,即使libc会强制time_t保存一个64位的值,也不会改变一件事情。

你可以将你的应用程序深入到内核中,但是我认为这不值得。

标准库中不包含time64()/time32()函数。

标准头文件中没有定义time32_t/time64_t

time_t被定义为time.htypedef __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的隐式数值转换而对两个函数都有效。