Zugriff auf Systemvariablen



  • Hallo, wie kann ich von einem C-Programm auf bestimmte Systemvariablen zugreifen?
    Bisher arbeite ich direkt mit einem Systemzugriff (system(...)), was aber unpraktikabel ist.

    Ich möchte gerne einem String beispielsweise die $PATH-Variable zuweisen, diese dann so parsen, dass ich alle Pfade, die durch die Doppelpunkte getrennt sind, untereinander anzeigen kann (mit printf).



  • Es gibt

    char *getenv(const char *name);
    

    in stdlib.h

    man: getenv(3)



  • Besten Dank für die schnelle Antwort supertux! 🙂

    Noch kurz ne Frage hinten dran. Wenn ich eine Variable, z. B. char *Variable mit Werten fülle, muss diese zwingend allokiert und wieder freigegeben werden?



  • das kommt darauf an, ob die Funktion getenv den Speicherplatz allokiert oder nicht (ich denke das macht die Funktion). Freigeben musst du den Speicherplatz wahrscheinlich selber wieder.

    Schau doch einfach mal nach:

    MAN: man: getenv(3)
    MSDN: getenv



  • Hi Horst2,

    in der MSDN hab ich nichts dazu gefunden. In der Manpage wird beschrieben, dass die Funktionen versuchen Speicher zu allokieren.

    Mir ging es aber auch mehr darum, ob es nötig ist, dass ich für selbst definierte Variablen Speicherplatz für diese allokieren sollte oder ob das nicht nötig sei:

    char *Variable;
    Variable = getenv("PATH");
    

    Also zum Beispiel mit

    char *Variable = malloc(sizeof(char) * 1000);
    

    und nach Benutzung halt

    free(Variable);
    

    Jetzt hänge ich noch an einem nächsten Problem, wie kann ich die Variable parsen (Inhalt Bsp.: /usr/local/bin:/user/sbin:/usr/bin).
    In C++ kann man ja schön mit find und mid arbeiten. Ziel ist es ja, dass ich alle Einträge zwischen den Doppelpunkten filtern und ausgeben kann.

    Welche Möglichkeiten hab ich in c? 😕



  • die funktion die du suchst heist strtok

    MSDN strtok

    da steht auch ein Beispiel dabei



  • also ich habe gerade noch einmal ausprobiert (getenv). Ich brauchte weder Speicher zu allocieren noch freizugeben

    mfg
    Horst



  • Super danke, hab das gerade umgesetzt!

    Bevor ich nen neuen Beitrag öffne, hab ich noch eine Frage (sorry beschäftige mich erst seit ein paar Tagen mit der Programmierung unter Unix).

    Mit getenv kann man ja schön auf die Systemvariablen zugreifen. Nun hab ich mehrere system-Aufrufe in meinem Programm, die ich gerne ersetzen würde.

    Gibt es auch eine Funktion mit der man die Ausgabe eines Shell-Befehls direkt in eine Variable umleiten kann (Bsp.: char *Variable = AusgabeVonBefehl)? 😕



  • so eine Funktion ist mir nicht bekannt. du kannst aber die Ausgabe eines Shell-Befehls in eine Datei umleiten und dann den Inhalt der Datei in einer Variable speichern.

    Beispiel:

    ls -l > datei
    


  • Dressman1981 schrieb:

    Gibt es auch eine Funktion mit der man die Ausgabe eines Shell-Befehls direkt in eine Variable umleiten kann (Bsp.: char *Variable = AusgabeVonBefehl)? 😕

    ich hab sowas noch nie gemacht, aber ich schätze, dass man Pipes dafür verwenden kann, oder du machst eine Umleitung in eine Datei und dann liest du die Datei, wobei ich von der Verwendung von system abrate.

    In den man pages stand nix zu free(var), wenn var=getenv(...); sein soll und ich habe sowas nicht benutzt.



  • Hmm, gibt es da wirklich keinen Befehl?

    Na ja, das mit der Erzeugung einer Datei hört sich nicht so praktikabel an. Die müsste dann ja vom Programm erst erzeugt und dann nach dem Befüllen wieder gelöscht werden.

    Eigentlich müsste man doch die Ausgabe des Befehls auch einer selbst definierten Shell-Variable zuweisen können, oder? Wenn ja, wie würde das funktionieren?
    Dann könnte ich ja wieder über den getenv-Befehl die eigene Variable und deren Inhalt auslesen.



  • was mir gerade noch einfällt ist, dass du den stdout umlegen kannst, z.B. in eine Datei. dann werden alle ausgaben die normalerweise in der Konsole erscheinen in die Datei geschreiben





  • Da war ja jemand noch lange wach! 😉

    Danke Probe-Nutzer!

    Das war genau die Funktion, die ich gesucht habe!



  • hab auch ne frage zum thema getenv():

    ist es möglich, dass getenv die änderung einer environment variable während der laufzeit mitbekommt??
    folgendes problem:
    hab einen hintergrundprozess der eine environment variable einliest und falls diese einen bestimmten wert hat in einer endlosschleife hängen bleibt. wenn sich die variable ändert oder mit unsetenv (CSH) gelöscht wird, soll das prozess weiter arbeiten also nicht mehr in der schleifen laufen. dies funktioniert allerdings nicht, da der prozess anscheinend beim initalisieren die environment variablen einliest und mit getenv danach auf eine gespeicherte, sprich nicht aktulle, version zu greift. habt ihr da vielleicht irgendeine lösung, dass ich die environment variable auch zur laufzeit ändern kann und der prozess das mitbekommt??

    LG Patrick

    PS: habe sogar versucht mit:

    system("unsetenv VAR");
    

    die variable im C-Programm direkt zu löschen, aber das hatte auch keinen erfolg.


Anmelden zum Antworten