Konzept Linux Systemprogrammierung



  • Hallo, ich benutze jetzt schon seit einiger Zeit Ubuntu, aber so richtig bin ich noch nicht hinter das Konzept der Linuxsystemprogrammierung gekommen.
    Früher habe ich mal ein paar WinAPI-Programme geschrieben, die mir dann z.B. alle laufenden Prozesse ausgegeben haben. Der Ansatz war eigentlich immer gleich: Im Internet nach der passenden WinAPI-Schnittstelle suchen und dann die msdn-Doku ausquetschen. War eigentlich kein Hexenwerk. Bei Linux scheint das aber nicht so zu funktionieren.
    Was das Anzeigen von Prozessen angeht, habe ich z.B. dies hier gefunden (http://procps.cvs.sourceforge.net/viewvc/procps/procps/proc/readproc.c?view=markup, Windows würde ja so aussehen: https://msdn.microsoft.com/de-de/library/windows/desktop/ms682623%28v=vs.85%29.aspx).
    Offensichtlich wird dort das proc-Directory ausgelesen und mit String-Funktionen verarbeitet. Ehrlich gesagt sieht das aber sehr aufwändig und auch etwas unschön aus. Gerade Stringverarbeitung mit C finde ich irgendwie masochistisch - mal ganz abgesehen von den Sicherheitsproblemen die durch Buffer-Overflows und so entstehen können.

    Ich behaupte jetzt einfach mal provokant, dass ich die Windows-Version eleganter finde. Oder denke ich einfach nur in die falsche Richtung? Bzw. wie löst man sowas denn in der Praxis?



  • *provokativ


  • Mod

    1. Darfst du das proc-Verzeichnis in der Sprache deiner Wahl auslesen.
    2. Wenn du nicht mit C-Strings umgehen kannst, ist das vielleicht nichts für dich.
    3. Die WinAPI hat doch auch eine C-Schnittstelle 😕



  • Alternativ kannst du selber auch nen kernel-Module schreiben was auf die Daten des Prozessors direkt drauf kommt ... und vergiss nicht die anderen prozessortypen auf denen linux auch laufen kann, mitzuimplementieren.
    Dann kannst die Daten auch ohne umweg ueber Strings auswerten ....

    Das "elegante" am "proc" filesystem ist, das es einen typischen Linux IPC Mechanismus abstrahiert, und sich mit dem generisch Infos zu verschieden Teilen des Systems ausgeben lassen, ohne Systemspezifisch schalten zu muessen.
    Würde sich nen Wert Parameter oder irgendwas ändern ... beispielsweisse prozent als fliesskommawert zu microsekunden Prozesszeit als unsigned integer, wäre das bei ner C-API immer ne ABI/API änderung, mit den damit verbundenen Versionsproblemen ... oder die API ist so generisch und arbeitet selber mit strings. ....

    Auf Anwenderseite ist der Vorteil, das das zeugs mit jeglicher programmiersprache ohne C-Bindings (die zwar fast jede sprache hat, aber eben auch immer kräftig gegen das look und feel der eigentlichen sprache verstossen und nicht grad unkomplex sind) auslesen kannst.
    Btw ist das theorethisch nen virtuelles FS, d.h. die daten existieren nur irgendwie im speicher, die filesystemstruktur wird einfach emuliert.

    Elegance liegt halt aber auch im Auge des Betrachters ...

    Ciao ...



  • Würde sich nen Wert Parameter oder irgendwas ändern ... beispielsweisse prozent als fliesskommawert zu microsekunden Prozesszeit als unsigned integer, wäre das bei ner C-API immer ne ABI/API änderung, mit den damit verbundenen Versionsproblemen ... oder die API ist so generisch und arbeitet selber mit strings. ....

    Naja, Versionprobleme bleiben dann ja trotzdem da. Schließlich erwarten dann die alten Programme eine Ganzzahl, während die neue Version ne Fließkommazahl ausgibt.

    Auf Anwenderseite ist der Vorteil, das das zeugs mit jeglicher programmiersprache ohne C-Bindings (die zwar fast jede sprache hat, aber eben auch immer kräftig gegen das look und feel der eigentlichen sprache verstossen und nicht grad unkomplex sind) auslesen kannst.

    Ja, das macht auf jeden Fall Sinn.

    Ist das Proc-Verzeichnis denn wirklich auf allen Distributionen identisch? Bzw. muss man bei der Low-Level-Programmierung in der Praxis aufpassen wegen unterschiedlichen Versionen etc?

    Gibt es denn auch so etwas wie eine etwas einfachere Schnittstelle für Linux-Umgebungen für C oder so sogar C++? Also irgendwie eine Art Library, die die meisten Grundfunktionen schon abdeckt und bei der man sich nicht ewig in die Linux-Dokumentation einarbeiten muss. Ich meine, es will ja nicht jeder, der nur mal wissen will ob gerade ein bestimmter Prozess läuft, gleich die gesamte Struktur des Proc-Directorys auswendig lernen.
    Grüße



  • Linux ist fast komplett in C geschrieben. Du brauchst nur die Header-Files durchsuchen.
    Das Problem dabei ist nur, man muss sich mit dem System befassen und wissen, was man da tut. Die WinAPI tut einiges von dem man gar nicht weiß, was das ist...



  • Naja, Versionprobleme bleiben dann ja trotzdem da

    Ja natürlich, aber die sind auf producer (kernelmodule in dem falle) und consumer beschränkt, nicht auf die (notwendigen) Transportwege dazwischen ....

    ist das Proc-Verzeichnis denn wirklich auf allen Distributionen identisch?

    jein
    Für Linux Systeme wenn sie modern genug sind, dank LSB ... meistens ! 🙂
    https://de.wikipedia.org/wiki/Linux_Standard_Base

    Es gibt aber immer noch vereinzelt "Sonderlösungen" die sich nicht an alles halten ....

    Neben Linux gibts aber noch ne ganze Menge anderer Unixoide, bei denen hat man weniger glück ^^ D.h. man hat arbeit um z.B. den zugriff auf die cpu info auf mehreren plattformen zu vereinheitlichen.

    der inhalt selber kann auch unterschiedlich sein, klar ... je nach hardware ...und was das OS preisgeben mag

    Aber:

    es gibt biblios die das schon versuchen zu managen, und den zugriff aufs /proc abstrahieren ... such nach "cpuinfo library"
    keine ahnung obs fürs Prozessmanagement vom OS was gibt ...

    Die Frage ist ausserdem:
    Für was sollte man sowas brauchen ... Prozessmanagement ist Aufgabe des OS und nicht einer Applikation. Nicht das man eine App schreibt, die "unkooperativ" weil sie DInge animmt über das OS, was sie gar ned wissen kann ... 😃

    Ciao ...


Log in to reply