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?

WilliamKF
quelle
1
@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).

Gilles 'SO - hör auf böse zu sein'
quelle
3
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.

Wuffers
quelle
3
Alles andere , und Sie sind 32-Bit oder Nicht-PC - Hardware (wie alpha, sparc64, ppc64, ...
Gilles ‚SO- Anschlag, der böse‘
@Gilles: Danke, ich habe meine Antwort entsprechend bearbeitet.
Wuffers
2
uname -m | sed 's/x86_//;s/i[3-6]86/32/'
WilliamKF
quelle
1

Art:

uname -a

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

Reisender Tech-Typ
quelle
1
Das ist nicht die Frage.
Harrymc
1

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
Rachel Duncan
quelle