Wie kann man Werte aus einen Systemaufruf übergeben oder System-Infos gewinnen?



  • Man kann ja mit dem Befehl "system" Befehle ausführen lassen. Wie kann man es allerdings so machen, dass ein Ergebnis in eine Variable übergeben wird ohne dabei die Konsole öffnen zu lassen.

    Beispiel:

    main
    {
     const char msg = system ("dmesg")
    }
    

    In dem Beispiel möchte ich System-Infos einlesen aber es wird immer die Konsole geöffnet. Das soll aber nicht passieren, sondern es sollen Zwecks weiterer Verarbeitung nur die Ergebnisse übergeben werden. ODER gibt es eine Alternative, um Systeminfos (Kernelinfos) dierkt zu gewinnen?
    Danke im Voraus...



  • Im Standard gibt's keine Möglichkeiten. Jenseits des Standards könntest du dir mal popen() (das leitet die Ein/Ausgabe eines system()-Aufrufes in ein FILE* um, das du dann auslesen kannst) bzw. die WinAPI Registry-Funktionen ansehen.



  • Sowas wäre schon mal ok.
    Wie kann ich popen() verwenden?

    etwa so:

    popen("auszuführendes Programm", "Pfad zur datei")
    


  • Nein, ungefähr so:

    FILE* pipe = popen(befehl,"r");
    //anschließend die Daten per fscanf() oder fread() aus pipe einlesen
    

    Eine Alternative wären noch Pipes auf Systemebene:

    string command = befehl + " > " + zieldatei;
    system(command.c_str());
    ifstream data(zieldatei.c_str());
    


  • Wie kann man Systeminfos, in der Art wie man Sie über dmesg bekommen kann ohne einen Systemaufruf erhalten? Gibt es hierfür auch spezielle Funktionen um solche Daten zu erhalten?



  • <LinuxSpezifisch>
    Normalerweise öffnet ein Prozess der Systeminformationen haben möchte Dateien im /proc oder /sys Filesystem (Beispiel /proc/meminfo für den aktuellen Speicherstand) und liest diese aus. Dabei sind das keine echten Dateien, sondern Pseudodateien, mit deren Öffnung Du den Kernel beauftragst Dir dort eben bestimmte Informationen zur Verfügung zu stellen.
    </LinuxSpezifisch>



  • Für Linux wäre schon richtig.
    Verstehe ich das jetzt richtig, dass die Infos bereits im Rohzustand abgelegt sind und man diese nur noch mit Dateieinlesefunktionen abholen muss?
    So wie ich das aber erkenne sind diese Dateien eigentlich 0byte-groß. Wie liest man die denn aus?



  • Öh. Öffnen. Lesen. Schließen. Wie jede andere Datei auch 😉

    Wie gesagt, das sind Pseudo-Dateien, und damit der Kernel sich nicht bei jedem ls die Arbeit machen muss die Länge der Informationen zu berechnen, wird halt 0 ausgegeben. Wenn Du die Datei zum Lesen öffnest und dann liest, kommen schon Informationen raus.



  • Ahh 💡 , gibts da eine Übersicht wo in welcher Datei was zu finden ist? Es sollte ja nur das eingelesen werden was gebraucht wird. Dann könnte ich mir tatsächlich den Systembefehl sparen, den ich eigentlich nur ungern nutzen wollte...



  • Schau dir doch mal /proc an, so viele Dateien sind da nicht drin. Die Verzeichnisse mit PIDs als Namen brauchst du dir ja nicht anzusehen.



  • Interessant wären allerdings vorallem Hardwarinfos wie z.B: Flashstructur, Speicherplatz, HD-Größe usw.


Anmelden zum Antworten