Linux-Befehl, um die Anzahl der Bits (32 oder 64) zurückzugeben?
13
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?
@Sathya: Das ist nicht gerade ein Duplikat, da der Prozessor 64-Bit sein kann, auch wenn das Linux nicht ist.
Gilles 'SO- hör auf böse zu sein'
Antworten:
13
Sie können feststellen, ob die CPU 64-Bit, 32-Bit oder beides unterstützt, indem Sie die flagsZeile einchecken /proc/cpuinfo. Sie müssen die möglichen Flags Ihrer Architekturfamilie kennen. Auf i386 / amd64-Plattformen lmkennzeichnet 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]86sind 32-Bit und x86_6464-Bit. Beachten Sie, dass auf mehreren Architekturen ein 64-Bit-Kernel 32-Bit-Userland-Programme ausführen kann. Selbst wenn also uname -mein 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 -mmöglicherweise ein "virtualisierter" Wert zurückgegeben wird. Wenn Sie beispielsweise unter Linux setarch i386 bashauf einem amd64-System ausgeführt werden und uname -mvon dieser Bash aus arbeiten, sehen Sie uname -mBerichterstellung 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_releaseBefehl abfragen . Genauer lsb_release -sdruckt 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-architecturecore-2.0-ia32core-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).
Auf GNU - Systeme (und andere , wenn sie es haben), sollten Sie in der Lage sein zu tun , getconf WORD_BIToder getconf LONG_BIT(, trivial, und tragbare obwohl es) anstelle eines eigenen C - Programm zu kompilieren.
Bis auf weiteres angehalten.
@Dennis: Danke für die Korrektur. Ich hatte nicht daran gedacht, getconfhier 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 getconfsollte sich c89oder c99in $(getconf PATH)beziehen, aber in der Praxis würde ich mir Sorgen machen, dass jemand eine Alternative installiert, ccdie vom Vendor c89Wrapper ausgeführt wird.
Gilles 'SO - hör auf böse zu sein'
Es gibt eine .in der Regex fehlt: grep '^flags.*:.*\blm\b' /proc/cpuinfo. Auch funktioniert es nur für mich ohne die -qFlagge
byf-ferdy
@ byf-ferdy Es hat nicht gefehlt .: 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 -qFlag 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 -qFlag.
Gilles 'SO- hör auf böse zu sein'
@ Gilles ah Ich wusste nicht über die -qFlagge. Ty, arbeitet jetzt :)
Byf-Ferdy
3
Sie können 64-Bit verwenden uname -aund suchen, um x86_64festzustellen, 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.
Wenn Sie bekommen, führen x86_64 GNU/LinuxSie einen 64-Bit-Kernel aus. Wenn Sie etwas Ähnliches erhalten, führen i386/i486/i586/i686Sie höchstwahrscheinlich einen 32-Bit-Kernel aus
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-Plattformenlm
kennzeichnet das Flag beispielsweise amd64-fähige CPUs (CPUs, die dieses Flag nicht haben, sind nur i386-fähig).Sie können feststellen, ob der Kernel 32-Bit oder 64-Bit ist, indem Sie die Architektur mit abfragen
uname -m
. Zum Beispieli[3456]86
sind 32-Bit undx86_64
64-Bit. Beachten Sie, dass auf mehreren Architekturen ein 64-Bit-Kernel 32-Bit-Userland-Programme ausführen kann. Selbst wenn alsouname -m
ein 64-Bit-Kernel angezeigt wird, kann nicht garantiert werden, dass 64-Bit-Bibliotheken verfügbar sind.Beachten Sie auch, dass
uname -m
möglicherweise ein "virtualisierter" Wert zurückgegeben wird. Wenn Sie beispielsweise unter Linuxsetarch i386 bash
auf einem amd64-System ausgeführt werden unduname -m
von dieser Bash aus arbeiten, sehen Sieuname -m
Berichterstellungi386
. 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 . Genauerlsb_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 ausgibtsizeof(size_t)
.quelle
getconf WORD_BIT
odergetconf 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 Standardsystemgetconf
sollte sichc89
oderc99
in$(getconf PATH)
beziehen, aber in der Praxis würde ich mir Sorgen machen, dass jemand eine Alternative installiert,cc
die vom Vendorc89
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, umx86_64
festzustellen, ob Sie 64-Bit ausführen. Alles andere (soweit ich weiß) und Sie verwenden 32-Bit oder Sie verwenden Hardwarealpha
, die kein PC ist, wie z. B.sparc
, oderppc64
.quelle
alpha
,sparc64
,ppc64
, ...quelle
Art:
Wenn Sie bekommen, führen
x86_64 GNU/Linux
Sie einen 64-Bit-Kernel aus. Wenn Sie etwas Ähnliches erhalten, führeni386/i486/i586/i686
Sie höchstwahrscheinlich einen 32-Bit-Kernel ausquelle
getconf verwendet die wenigsten Systemaufrufe:
quelle