有没有办法在Linux中的32位程序中获得64位time_t

chi*_*yer 15 c linux time gcc

在Windows上我可以打电话:

_time32(__time32_t); // to get 32bit time_t
_time64(__time64_t); // to get 64bit time_t
Run Code Online (Sandbox Code Playgroud)

(32位和64位程序)

在Linux中有没有办法做到这一点(用GCC编译)?

net*_*der 13

显然,不,这是不可能的.对于初学者来说,time()Linux中只有一个功能,没有time32()或time64().

在搜索了一段时间后,我可以看到它不是libc的错,但罪魁祸首实际上是内核.

为了libc中获取当前时间,它需要执行一个系统调用它:(来源)

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

该系统呼叫被定义为:(源)

SYSCALL_DEFINE1(time, time_t __user *, tloc)
{
    time_t i = get_seconds();
    // ...
    return i;
}
Run Code Online (Sandbox Code Playgroud)

该函数get_seconds()返回一个unsigned long,如下所示:(源)

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

    return tk->xtime_sec;
}
Run Code Online (Sandbox Code Playgroud)

而timekeeper.xtime_sec实际上是64位:(来源)

struct timekeeper {
    // ...
    /* Current CLOCK_REALTIME time in seconds */
    u64                     xtime_sec;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你知道你的C,你知道它的大小unsigned long实际上是依赖于实现的.在我的64位机器上,它是64位; 但在我的32位机器上,这是32位.在某些32位实现上它可能是64位,但不能保证.

另一方面,u64总是64位,所以在最基础上,内核以64位类型跟踪时间.为什么然后它继续返回这个unsigned long,不保证是64位长,超出了我.

最后,即使libc强制time_t保持64位值,它也不会改变.

您可以将应用程序深深地绑定到内核中,但我认为它甚至不值得.

  • 所以,写一个补丁并发布它。对于 libc (typedef long long int time_t) 和内核 long long int get_seconds(void) (2认同)

phu*_*clv 8

上面的许多答案都说这是不可能的,但这是完全不正确的。这在当时是不可能的,但人们多年来一直在谈论修复它。最后,通过添加新的syscalls将32 位平台上的 64 位时间支持引入到 Linux 5.1 内核中。查看此表,您可以看到这些系统调用仅在 32 位平台上可用。现在,如果您正在为 32 位系统编写代码,则可以直接调用(从内联汇编或 C with )以获取当前时间*time64clock_gettime64syscall()

但是在那之后你就完全靠自己了。如果您想要完整的用户空间支持,您必须使用 Linux 5.6 或更高版本以及 musl 1.2+ 或 glibc 2.32+。只需重建您的代码,您的代码time_t就会变成 64 位长

  • 所有用户空间都必须使用 64 位 编译time_t,这将在即将到来的 musl-1.2 和 glibc-2.32 版本以及来自 linux-5.6 或更高版本的已安装内核头文件中得到支持。

  • 直接使用系统调用接口的应用程序需要移植以使用time64linux-5.1 中添加的系统调用来代替现有的系统调用。这会影响大多数用户futex()和seccomp()以及编程语言有自己的运行环境不是基于libc中。

https://lkml.org/lkml/2020/1/29/355?anz=web

想要查询更多的信息


Dav*_*rra 7

time64()/time32()标准库中不包含任何功能.

time32_t/time64_t标准标题中没有考虑任何定义.

time_t被定义time.h为typedef __time_t time_t;

经过长链重新定义后,您会发现__time_t在32位计算机上定义为32位,在64位计算机上定义为64位.