在运行时确定 Linux 的 CPU 架构?

3

我想在Linux环境下运行时检测CPU架构,我查看了getauxval(AT_PLATFORM)但很遗憾这个方法并不是很通用,因为它相对较新。是否有替代getauxval(AT_PLATFORM)的方法呢?我可以解析/proc/cpuinfo,但认为可能有更简单的方法。我正在尝试获取类似于uname -m的输出。


2
这感觉像是一个XY问题。你打算如何处理得到的信息? - Botje
1
“CPU 架构” 指的是它是 32 位还是 64 位,对吗?而不是 x86 vs ARM vs PowerPC? - Jorengarenar
1
你打算在什么古老的硬件上运行你的软件? - Botje
3
我会亲自解析/proc/cpuinfo - Galik
1
@kebs 抱歉,我想也标记一下 C++ 的人,因为他们也处理系统调用。 - love4shells___
显示剩余6条评论
2个回答

4
I'm trying to get output similar to uname -m.

为什么不看一下uname是如何实现的呢?运行apt source coreutils,然后在src/uname.c中查看:

...
while ((c = getopt_long (argc, argv, "asnrvmpio",
                        uname_long_options, NULL)) != -1)
...

case 'm':
    toprint |= PRINT_MACHINE;

并且
if (uname (&name) == -1)
...
if (toprint & PRINT_MACHINE)
        print_element (name.machine);

(请注意uname函数的用法)。


uname是由POSIX定义并在glibc中封装的系统调用:

#include <sys/utsname.h>
int uname(struct utsname *buf);

此外,在lib/uname.c中,您可以看到coreutils为Windows系统实现自定义的uname函数(因为Windows不支持uname系统调用)。该实现使用GetVersionExGetSystemInfo WinAPIs提供类似的功能。

将机器硬件标识符存储在buf->machine中,并由uname -m打印出来。


0
如果您有一个需要在不同架构上构建的程序,并且需要一个构建系统来为不同架构指定不同代码的情况,那么添加一些定义的常量将非常简单,这样您就可以评估它是在哪个系统上构建的,并在程序内部检查该常量。
相反,如果您的程序足够可移植,在不同(大多数)架构上构建时可能不需要知道它是在哪个架构上构建的。
这可能是历史上解决问题的方案。如果您的程序可以在非Linux系统(例如BSD或QNX)中构建,则我认为您无法以可移植的方式解决此问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接