Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Abfragen von Systeminformationen

  1. #1
    Registrierter Benutzer
    Registriert seit
    31.03.2003
    Beiträge
    75

    Red face Abfragen von Systeminformationen

    Hallo,

    wie Frage ich Informationen aus meinem Betriebsystem Linux mit C/C++ am besten ab?

    Habe jetzt schon einige Tage herumgedoktert und für wenige Dinge Systemaufrufe, für die meisten Dinge Prorgammaufrufe per "popen()" gemacht und die Ausgabe geparst.

    Das ganze sieht aus wie ein Shell-Script in C/C++ Syntax.

    Gibt es nicht ne einfachere und elegantere Möglichkeit?

    Ich denke da an Windows und die sog. Registrierungsdatenbank.

    Ich möchte keine externen Prorgamme benutzen, da mein Prorgamm unabhängig sein soll. Ich möchte aber auch keine Verrenkungen machen über 10 Ecken irgendwelche "simplen" Infos aus dem Betribsystem rauszuquetschen.

    Die Daten die ich brauche muss das Betriebsystem ja selbst benutzen, also hoffe ich, daß es irgendwo eine gut strukturierte Zugriffsmöglichkeit gibt.

    Wer andere Threads von mir kennt, weiß daß ich immernoch dran bin "simple" Abfragen zu machen, nach der Stuktur:

    Rechnername, Domainname, Gateway, DNS-Server?
    Welche Netzwerkinterfaces (Device-Namen) stecken im Rechner?
    Was sind MAC, Hersteller & Modell, Typ (Token-Ring,Ethernet oder WLAN), Anschluss (ISA, PCI, USB), Geschwindigkeiten (und Duplexmodus) , aktuelle Geschw., Netzwerkkabel eingesteckt der Netzwerkinterfaces?
    Welche IP Daten haben die Netzwerkinterfaces (IP-Adresse(n), Netzmaske)?

    Bei WLAN gibts dann noch mehr zu tun...

    Der Kernel muss diese Dinge ja intern verwalten. Das möchte ich "ganz eifnach" auslesen.

    Was mich "krank" macht: Ich hab mir schon den Sourcecode zahlreicher Prorgamme angeschaut, und JEDES ermittelt diese Daten völlig anders.

    Gibt es keinen "Standard"-Weg?

    Es ist nicht sinnvoll, wenn ich jetzt die Funktionen ein weiteresmal implementiere.

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Eigentlich sollte es unter Linux unter /proc und /sys genügend Informationen geben, ob es vielleicht sogar ein direkteres Kernelinterface gibt, weiß ich allerdings nicht.
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  3. #3
    Registrierter Benutzer
    Registriert seit
    04.05.2005
    Ort
    Dortmund
    Beiträge
    31
    Ich würde einfach mal in /proc herumschauen. Ich denke an viele Infos kommst Du anders gar nicht heran - ausser Du programmierst im Kernelspace, was ich als übertrieben einschätzen würde... schließlich sind die Informationen ja schon da.

    Mfg, Lord Kefir

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Für ein paar der Sachen gibt es Funktionen, etwa gethostname oder getdomainname
    Nameserver stehen in /etc/resolv.conf

    Für die meisten Hardware Eigenschaften arbeitet man am besten über HAL [1], welcher noch den zusätzlichen Vorteil hat, daß man sich über Änderungen informieren lassen kann.

    Ciao,
    _

    [1] http://webcvs.freedesktop.org/*check..._with_tag=HEAD
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Kannst du für die ganzen Netzwerkinformationen nicht Systemprogramme wie ifconfig und ähnliche brauchen? Die müssen ja für funktionierende Netzwerke sowieso installiert sein - es dürfte also kein Problem sein, solche Programme als Voraussetzung zu betrachten. (Ich meine: Der Kernel ist ja auch ein "externes Programm").

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  6. #6
    Registrierter Benutzer
    Registriert seit
    31.03.2003
    Beiträge
    75
    Zitat Zitat von bischi
    Kannst du für die ganzen Netzwerkinformationen nicht Systemprogramme wie ifconfig und ähnliche brauchen? ...
    Doch, das machen auch viele und das stört mich eben.

    Ich will doch nicht in C/C++ Programmieren um dann wieder in den Stil von Shellscripten zu gelangen.

    Ich möchte eine C/C++ Funktion aufrufen und Rückgabewerte erhalten.

    Ich möchte nicht über das Bestreibsystem andere Prorgamme in einer Shell aufrufen lassen um deren Output zu parsen, was nämlich "popen" und "KProcess" machen.

    Aber anscheinend ist diese, aus C/C++-Sicht äußerst häßliche, Methode leider gang und gebe, z.B. bei "knemo" oder "knetload".

    Das einzige Netzwerk-Tool was wohl nicht "ifconfig" aufruft ist "ifconfig" selber

    Ich hab mir jetzt das Buch "Linux, Unix, Systemprogrammierung" von Helmut Herold geholt, leider nur 2.te Auflage. Mal sehn wie weit ich damit komm.

  7. #7
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Ort
    Darmstadt
    Beiträge
    59
    Zitat Zitat von stefan-tiger
    Doch, das machen auch viele und das stört mich eben.

    Ich will doch nicht in C/C++ Programmieren um dann wieder in den Stil von Shellscripten zu gelangen.

    Ich möchte eine C/C++ Funktion aufrufen und Rückgabewerte erhalten.
    [...]
    das wird jetzt kein wirklich konstruktiver beitrag, aber was ist am scripten denn so schlimm? im grunde machst du dir nur überflüssige arbeit. natürlich sollte man alles mal von hand gemacht haben, aber ob man eine betriebssystemsmethode oder ein dienstprogramm aufruft, macht für das verständnis keinen unterschied. um bestimmte ziele zu erreichen, ist das aufrufen von dienstprogrammen nun mal komfortabler
    +++ this message is printed on 100% recycled electrons +++

  8. #8
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Es ist potentiell heikler - da hat er allerdings schon recht. Eine schöne saubere API wäre da bei weitem zu bevorzugen - wenn es sie denn gäbe.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  9. #9
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    um bestimmte ziele zu erreichen, ist das aufrufen von dienstprogrammen nun mal komfortabler
    In vielen Faellen ist das sogar von der Aufgabenstellung her ausgeschlossen !
    system und exec aufruafe haben eklatante sicherheitsprobleme ... rein von der Logik her.
    Performance ist auch nen problem ... jedesmal den prozess ueberlagern, die komplette umgebung sichern ... ist ned wirklich performant wenn man nen simplen aufruf taetigen will ...
    Es wird meist nie standardkonform ....

    Systeminformationen abrufen unter Linux iss prinzipiell nen "heikles" Thema ...
    Warum ?
    Einige Informationen sollen und duerfen userspace programme nicht bekommen.
    Was will denn ein userspace programm bitte mit der MAC adresse ? Ausser sie zu irgendwas zu missbrauchen ? Es gibt ne menge interfaces die tcp/ip koennen und sowas gar nicht haben ... virtuelle interface ???
    Andere sachen sind auch absichtlich nicht einfach zugaenglich, weil sie dynamisch sein koennten, und implementationsdetails eines anderen protokolls sind.
    Z.B. Gateway fuer bestimmte netze ... du liest den aus, arbeitest damit ... und zoff ... was ist wenn da nen routed mit laeuft der dir den gateway im betrieb umschaltet ?

    Du solltest dir genau ueberlegen was du machen willst.
    Fuer alles, was fuer normale user linux programme nach standard vorgesehen ist, gibt es im Posix standard ne funktion.
    Alles was darueber hinausgeht, sind hacks fuer bestimmte besondere aufgabenstellungen. Die sind dann nich mehr posix standard sondern du schiesst dich auf nen bestimmtes system (Linux) oder gar ne bestimmte distribution ein .... und das sollt man vermeiden.

    Ciao ...
    Geändert von RHBaum (06-03-2006 um 11:58 Uhr)

  10. #10
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Ort
    Darmstadt
    Beiträge
    59
    Zitat Zitat von RHBaum
    In vielen Faellen ist das sogar von der Aufgabenstellung her ausgeschlossen !
    warum? alles was eine os-funktion kann, kann ein dienstprogramm auch (alleine weil das dienstprogramm die os-funktion aufrufen kann) zu performance und/oder sicherheit siehe unten.

    Zitat Zitat von RHBaum
    system und exec aufruafe haben eklatante sicherheitsprobleme ... rein von der Logik her.
    an die meisten informationen von system und / oder exec-aufrufen musst du gelegentlich aber kommen. das betriebssystem stellt auch nur solche funktionien zur verfügung, die der 'nutzer' auch nutzen können soll. falls sich dadurch sicherheitslücken auftuen, ist es aufgabe der os-coder diese zu schließen und nicht einfach gezielt zugriff auf informationen zu unterbinden, an die man anderweitig doch kommen kann.

    Zitat Zitat von RHBaum
    Performance ist auch nen problem ... jedesmal den prozess ueberlagern, die komplette umgebung sichern ... ist ned wirklich performant wenn man nen simplen aufruf taetigen will ...
    Es wird meist nie standardkonform ....
    [...]
    warum? das auslesen der informationen hat doch konstante laufzeit. man liest doch auch nicht, wenn man zugriff auf eine datei im dateisystem haben möchte, den boot-record, die i-nodes, etc. von neuem aus, sondern speichert sich diese daten irgendwo. den zeitlichen aufwand halte ich durchaus für vertretbar

    scripten hat gegenüber 'hard-coden' auch den vorteil, daß es wirklich absolut platformunabhängig läuft und du dich nicht auf bestimmte betriebssysteme / distributionen einschießen mußt.

    Zitat Zitat von RHBAUM
    Was will denn ein userspace programm bitte mit der MAC adresse ? Ausser sie zu irgendwas zu missbrauchen ? Es gibt ne menge interfaces die tcp/ip koennen und sowas gar nicht haben ... virtuelle interface ???
    ich hab den TCP/IP-header grad nicht im kopf, aber vielleicht möchtest du deine eigenen protokolle implementieren, weil dir z.b. der tcp-header zu aufgeplustert ist, dir UDP aber zu schlank ist.
    eine andere möglichkeit wäre z.b., daß du ein tool schreiben möchtest, mit dem du remote einen DHCP-server konfigurieren kannst. um deinen aktuelle netzwerkkarte in die datenbank eintragen zu können, mußt du an die MAC ...

    Zitat Zitat von peschmae
    Es ist potentiell heikler - da hat er allerdings schon recht. Eine schöne saubere API wäre da bei weitem zu bevorzugen - wenn es sie denn gäbe.
    jup
    +++ this message is printed on 100% recycled electrons +++

  11. #11
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    warum? alles was eine os-funktion kann, kann ein dienstprogramm auch
    Eher andersrum ^^ alles was ein dienstprogramm kann sollt eine Api vom BS auch oder ^^ wobei man hier sehr wohl unterscheiden muss, auf welchen Standard man sich runner begibt (Posix, Distri )

    das betriebssystem stellt auch nur solche funktionien zur verfügung, die der 'nutzer' auch nutzen können soll.
    und du willst programme schreiben die drueber hinausgehen ? dann solltest aber auch damit leben, dass dein programm nicht mehr portabel und plattformunabhaengig bleibt ....

    alls sich dadurch sicherheitslücken auftuen, ist es aufgabe der os-coder diese zu schließen
    wenn sich diese Luecken durch die tools oder die Information auftun, sicherlich ... ueber die rede ich nicht, sondern ueber die die ein exec/system aufruf als solches immer mit sich bringt, egal was man da genau aufruft ....

    warum? das auslesen der informationen hat doch konstante laufzeit. man liest doch auch nicht, wenn man zugriff auf eine datei im dateisystem haben möchte, den boot-record, die i-nodes, etc. von neuem aus, sondern speichert sich diese daten irgendwo. den zeitlichen aufwand halte ich durchaus für vertretbar
    Wenn man die sache einmal macht ... ok
    wenn man die infos aber 20 mal die sekunde braucht ....
    und ich red ned um overhaed den das hilfsprogramm brauch, sondern overhead den dein programm braucht um den eigenen prozess fuers hilfsprogramm zu ueberlagern ...
    zum besipiel ruf mal zigtausend mal gethostbyname auf, oder parse zigtausend mal den ausgabestream von nem exec ("nslookup irgendwas").

    scripten hat gegenüber 'hard-coden' auch den vorteil, daß es wirklich absolut platformunabhängig läuft und du dich nicht auf bestimmte betriebssysteme / distributionen einschießen mußt.
    Ich behaupte nicht das scripts keine vorteile haben ... wenn ein script meine anforderungen erfuellt, ist es meist sogar die bessere variante, weil es eben weniger entwicklungszeit verbraucht hat, aber darum gehts hier wohl nicht oder ?

    ich hab den TCP/IP-header grad nicht im kopf, aber vielleicht möchtest du deine eigenen protokolle implementieren, weil dir z.b. der tcp-header zu aufgeplustert ist, dir UDP aber zu schlank ist.
    Das Osi Schichtmodell haett mir mein Informatiklehrer bei der Frage um die Ohren gehauen ^^
    Im ernst, wenn du TCP/IP im speziellen falle UDP verwenden willst, solltest du dich an konventionen halten. Und eine davon ist, das die MAC eben Implementationsdetail ist ... nicht mal auf TCP/IP schicht, die iss schon zu hoch dafuer sondern auf Datenuebertragungsschicht.
    Wenn du Anwendungen schreibst die TCP/IP frames verwenden und gleichzeitig MAC adressen auswerten, solltest du nicht davon ausgehen, dass deine anwendung auf anderen systemen oder bei paar umkonfigurierungen noch laeuft ^^

    mit dem du remote einen DHCP-server konfigurieren kannst
    schreibst du programme oder Tools zur systemverwaltung ^^ das ist nen unterschied, und zwar nen gewaltiger ^^
    und grad fuer solche zwecke wuerd ich sogar scripts bevorzugen, weil der entwicklungsaufwand geringer ist und ich mir bei solchen benutzerdefiniert zurechtgestrickten loesungen sicher sein kann, dass die nur bei mir funktionieren, dann waer mir der aufwand fuern c/c++ prog zu hoch ...

    Ciao ...

  12. #12
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von BinEinGast
    warum? das auslesen der informationen hat doch konstante laufzeit.
    Konstant schon, aber das Starten des externen Executables ist Overhead und das Parsen des Outputs auch.

    Abgesehen davon ist das Parsen eines Programmoutputs, der nicht für maschinelle Weiterverarbeitung gedacht ist, also keinen definierten Konventionen folgt, immer eine problematische Sache. Thematik Screenscraping.

    Die sauberste Lösung unter Linux ist derzeit sicher HAL.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  13. #13
    Registrierter Benutzer
    Registriert seit
    31.03.2003
    Beiträge
    75
    Ich formuliers mal ganz einfach:

    Wenn ich statt Kernelfunktionen (bzw. Systemfunktionen) den Output von externen Prorgammen parsen will dann brauche ich etliche Dinge die ich vielleicht nicht habe oder von denen ich vielleicht nicht abhängig sein will.

    Ausserdem ist das Output parsen mitunter aufwändig und fehleranfällig.
    Ganz zu schweigen von wenn auf einem anderen PC auf dem das Prorgamm laufen soll irgendwelche Konsolenprogramme verschiede Schalter nicht haben weil ihre Version zu alt ist, oder der Output anders ist usw. usw.

    Und in "speziellen" Fällen, wie z.B. Linux auf nicht PC-artigen-Systemen betreiben hat man auch vieles einfach nicht verfügbar, wie ne shell, geschweige denn "ifconfig".

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Nachdem du es lieber selber implementierst anstatt auf etablierte Mechanismen zu setzen, schlage ich vor, du siehst dir den Code des etablierten Systems an, also den Source von hald

    http://freedesktop.org/wiki/Software...ldInstructions

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    31.03.2003
    Beiträge
    75
    Zitat Zitat von anda_skoa
    Nachdem du es lieber selber implementierst anstatt auf etablierte Mechanismen zu setzen, schlage ich vor, du siehst dir den Code des etablierten Systems an, also den Source von hald

    http://freedesktop.org/wiki/Software...ldInstructions

    Ciao,
    _
    Werd ich machen, dankeschön. Aber zuerst muss ich durch mein Buch: Linux-Unix-Systemnprogrammierung kommen.

    Danach sollte ich ein besseres Verständnis haben.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •