Was ist ein Linux-Befehl, mit dem ich programmgesteuert entweder 32 oder 64 zurückgeben kann, um anzugeben, ob der Prozessor ein 32-Bit- oder ein 64-Bit-Prozessor ist?
Was ist ein Linux-Befehl, mit dem ich programmgesteuert entweder 32 oder 64 zurückgeben kann, um anzugeben, ob der Prozessor ein 32-Bit- oder ein 64-Bit-Prozessor ist?
Antworten:
Sie können feststellen, ob die CPU 64-Bit, 32-Bit oder beides unterstützt, indem Sie die flags
Zeile einchecken /proc/cpuinfo
. Sie müssen die möglichen Flags Ihrer Architekturfamilie kennen. Auf i386 / amd64-Plattformen lm
kennzeichnet das Flag beispielsweise amd64-fähige CPUs (CPUs, die dieses Flag nicht haben, sind nur i386-fähig).
grep -q '^flags\s*:.*\blm\b' /proc/cpuinfo # Assuming a PC
Sie können feststellen, ob der Kernel 32-Bit oder 64-Bit ist, indem Sie die Architektur mit abfragen uname -m
. Zum Beispiel i[3456]86
sind 32-Bit und x86_64
64-Bit. Beachten Sie, dass auf mehreren Architekturen ein 64-Bit-Kernel 32-Bit-Userland-Programme ausführen kann. Selbst wenn also uname -m
ein 64-Bit-Kernel angezeigt wird, kann nicht garantiert werden, dass 64-Bit-Bibliotheken verfügbar sind.
[ "$(uname -m)" = "x86_64" ] # Assuming a PC
Beachten Sie auch, dass uname -m
möglicherweise ein "virtualisierter" Wert zurückgegeben wird. Wenn Sie beispielsweise unter Linux setarch i386 bash
auf einem amd64-System ausgeführt werden und uname -m
von dieser Bash aus arbeiten, sehen Sie uname -m
Berichterstellung i386
. Auf diese Weise können Sie so tun, als befänden Sie sich auf einem „32-Bit-System“, obwohl es sich um einen 64-Bit-Kernel handelt, um beispielsweise 32-Bit-Programme zu kompilieren, ohne eine Kreuzkompilierung einzurichten.
Sie können sehen, was im Benutzerland verfügbar ist, indem Sie die LSB- Unterstützung mit dem lsb_release
Befehl abfragen . Genauer lsb_release -s
druckt eine :
-separated Liste der unterstützten LSB Funktionen. Jedes Feature hat das Formular . Beispielsweise wird die Verfügbarkeit einer ix86 C-Bibliothek durch angezeigt , während dies für amd64 analog ist. Da jedoch nicht jede Distribution alle verfügbaren LSB-Module deklariert, ist möglicherweise mehr verfügbar, als auf diese Weise erkannt werden kann.module-version-architecture
core-2.0-ia32
core-2.0-amd64
Sie können die bevorzugte Wortgröße für die Entwicklung ermitteln (vorausgesetzt, ein C-Compiler ist verfügbar), indem Sie ein 5-zeiliges C-Programm kompilieren, das sizeof(void*)
oder ausgibt sizeof(size_t)
.
getconf WORD_BIT
oder getconf LONG_BIT
(, trivial, und tragbare obwohl es) anstelle eines eigenen C - Programm zu kompilieren.
getconf
hier zu verwenden. Das hört sich im Prinzip gut an, aber es ist schwierig sicherzustellen, dass die Ergebnisse für den speziellen C-Compiler gelten, den Sie verwenden, wenn es mehr als einen gibt (normalerweise gcc / icc oder ähnliches unter Linux, gcc / native cc an anderer Stelle). Auf ein Standardsystem getconf
sollte sich c89
oder c99
in $(getconf PATH)
beziehen, aber in der Praxis würde ich mir Sorgen machen, dass jemand eine Alternative installiert, cc
die vom Vendor c89
Wrapper ausgeführt wird.
.
in der Regex fehlt: grep '^flags.*:.*\blm\b' /proc/cpuinfo
. Auch funktioniert es nur für mich ohne die -q
Flagge
.
: Ich hatte "null oder mehr Leerzeichen", aber eigentlich gibt es einen Tabulator. Ich habe den regulären Ausdruck geändert, um auch Tabulatoren zuzulassen. Mit dem -q
Flag gibt es keine Ausgabe, aber der Exit-Status des Befehls zeigt an, ob das Flag vorhanden ist. Wenn Sie eine Ausgabe wünschen, entfernen Sie das -q
Flag.
-q
Flagge. Ty, arbeitet jetzt :)
Sie können 64-Bit verwenden uname -a
und suchen, um x86_64
festzustellen, ob Sie 64-Bit ausführen. Alles andere (soweit ich weiß) und Sie verwenden 32-Bit oder Sie verwenden Hardware alpha
, die kein PC ist, wie z. B. sparc
, oder ppc64
.
alpha
, sparc64
, ppc64
, ...
Art:
uname -a
Wenn Sie bekommen, führen x86_64 GNU/Linux
Sie einen 64-Bit-Kernel aus. Wenn Sie etwas Ähnliches erhalten, führen i386/i486/i586/i686
Sie höchstwahrscheinlich einen 32-Bit-Kernel aus
getconf verwendet die wenigsten Systemaufrufe:
$ 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