当我输入uname -a时,它会给出以下输出。

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux

我怎么知道给定的操作系统是32位还是64位?

这在编写配置脚本时很有用,例如:我为什么体系结构构建?


当前回答

lscpu会列出关于你的CPU的其他信息:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

其他回答

#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}

lscpu会列出关于你的CPU的其他信息:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

如今,一个系统可以是多拱的,所以无论如何它都没有意义。你可能想要找到编译器的默认目标:

$ cc -v 2>&1 | grep ^Target
Target: x86_64-pc-linux-gn

你可以尝试编译一个hello world:

$ echo 'int main() { return 0; }' | cc -x c - -o foo
$ file foo
foo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b114e029a08abfb3c98db93d3dcdb7435b5bba0c, not stripped

Getconf使用最少的系统调用:

$ strace getconf LONG_BIT | wc -l
253

$ strace arch | wc -l
280

$ strace uname -m | wc -l
281

$ strace grep -q lm /proc/cpuinfo | wc -l
301

我想知道在Debian中构建软件的具体情况(安装的Debian系统可以是32位版本,具有32位内核、库等,也可以是64位版本,其中的内容是为64位而不是32位的兼容模式编译的)。

Debian包本身在实际创建包含所有元数据(包括平台体系结构)的包时需要知道它们是用于什么体系结构的(当然),因此有一个打包工具可以输出它以供其他打包工具和脚本使用,称为dpkg-architecture。它既包括它被配置为构建的目的,也包括当前主机。(通常情况下,这些都是一样的。)64位机器上的输出示例:

DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_OS=linux
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu

您可以只打印其中一个变量,或者使用命令行选项对dpkg-architecture的值进行测试。

我不知道dpkg-architecture是如何推导体系结构的,但是您可以查看它的文档或源代码(dpkg-architecture和dpkg系统的大部分代码都是Perl)。