2008-12-04 20 views
8

Ich versuche, Informationen wie OS-Version, Festplattenspeicher, Plattenspeicher und RAM installiert auf einem Linux-System in C++ zu erhalten. Ich weiß, dass ich system() verwenden kann, um verschiedene Linux-Befehle auszuführen und ihre Ausgabe zu erfassen (was ich gerade mache), aber ich frage mich, ob es einen besseren Weg gibt? Gibt es in der C++ - Standardbibliothek etwas, mit dem ich Informationen vom Betriebssystem abrufen kann?Wie lese ich Systeminformationen in C++?

Antwort

12

Wenn Sie mit * nix-Befehle über das System.

tun Dann Mann Blättern zum Boden des Mannes Seite und es wird in der Regel zeigen Ihnen, was relevant C Systemaufrufe bezogen.

Example: man uname: 
SEE ALSO 
     uname(2), getdomainname(2), gethostname(2) 


Explanation of numbers: 

(1): User UNIX Command 
(2): Unix and C system calls 
(3): C Library routines 
(4): Special file names 
(5): File formats 
(6): 
(7): 
(8): System admin commands 

Also, wenn Sie System verwenden ("uname"). Auf der man-Seite können Sie sehen, dass es auch einen uname C-Systemaufruf gibt (uname (2)). Sie können nun einen 'man 2 uname' ausführen, um Informationen darüber zu erhalten, wie der C-Systemaufruf uname verwendet wird.

+2

Sie können auch ein vorhandenes Systemprogramm (Anwendung) strace, wenn Sie mit dem Lärm umgehen können. Z.B. "strace uname -a" Dies zeigt Ihnen ALLE Systemaufrufe an, die von diesem Programm ausgeführt wurden. Suchen Sie den richtigen Systemaufruf, und Sie können die gleiche Routine von Ihrem eigenen Programm aufrufen. –

+0

Sie wissen nicht, wie glücklich ich bin, dass ich die Ausgabe des Systems ("df") nicht analysieren muss. Danke vielmals. :) –

5

Es gibt nichts in der Standardbibliothek C++ für diese Zwecke. Die Bibliothek, die Sie verwenden können, ist libhal, die den Blick von Programmen auf die Hardware abstrahiert, verschiedene Informationen von /proc, /sys und andere zu sammeln. HAL, scrollen Sie nach unten, es scheint auch eine inoffizielle C++ - Bindung zu geben (habe sie aber nicht getestet, während libhal auch für C++ - Programme funktioniert). Verwenden Sie den Befehl lshal, um alle für HAL verfügbaren Geräteinformationen anzuzeigen.

2

Wenn Sie nicht HAL verwenden möchten, wie Litb suggeriert, können Sie Dinge direkt aus der /proc filesystem lesen, sofern es auf Ihrem System vorhanden ist. Dies ist nicht der plattformunabhängigste Weg, und in vielen Fällen müssen Sie ein wenig analysieren, um die Dateien auseinander zu nehmen.

Ich denke, HAL abstrahiert viele dieser Details für Sie, aber wissen Sie, dass Sie es direkt aus/proc lesen können, wenn Sie eine Bibliothek verwenden, ist keine Option.

2

Systeminformationen sind definitionsgemäß nicht tragbar, so dass es keine Standardlösung. Am besten verwenden Sie eine Bibliothek, die die meiste Arbeit für Sie erledigt. Eine solche plattformübergreifende Bibliothek (im Gegensatz zu hal, die derzeit Linux-spezifisch ist) ist SIGAR API, die Open Source BTW ist. Ich habe es in einem C++ Projekt ohne viel Mühe verwendet (die Installation ist ein bisschen nicht Standard aber kann leicht herausgefunden werden)