gpt4 book ai didi

c - 有没有办法在 Linux 的 32 位程序中获取 64 位 time_t?

转载 作者:IT王子 更新时间:2023-10-29 00:23:56 25 4
gpt4 key购买 nike

在 Windows 上我可以调用:

_time32(__time32_t); // to get 32-bit time_t
_time64(__time64_t); // to get 64-bit 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 位类型跟踪时间。为什么它继续将其作为 unsigned long 返回,这不保证是 64 位长,这超出了我的理解。

最后,即使 libc 强制 time_t 保存 64 位值,它也不会改变任何事情。

您可以将您的应用程序深深地绑定(bind)到内核中,但我认为这甚至不值得。

关于c - 有没有办法在 Linux 的 32 位程序中获取 64 位 time_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14361651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com