Anzeige:
Ergebnis 1 bis 4 von 4

Thema: [C] linux - absoluten pfad zum programm auslesen

  1. #1
    zico
    Gast

    [C] linux - absoluten pfad zum programm auslesen

    Hallo Leute

    Mein erster Post hier und gleich eine für mich sehr schwierige Aufgabenstellung

    Der Hintergrund:
    Ich schreibe ein Programm, welches von mehreren speziellen Daten abhängig ist. diese sollen systemweit verfügbar sein und deren Pfad ist in DATA_PATH fest definiert. Bei Programmstart springt das Programm daraufhin in das Homeverzeichnis und in ein spezielles config-directory (~/.program-config) um dort configs zu schreiben und weitere Daten zu lesen etc.

    Das funktioniert auch alles wunderbar soweit. Sprich die systemweiten Daten werden über den absolut definierten DATA_PATH ausgelesen und die configs in ~/.program-config verarbeitet.
    Mein Problem besteht nun darin, dass ich das Programm auch als Binary release zur Verfügung stellen möchte.
    Dazu sollen die systemweiten Daten IMMER aus DEM Verzeichnis ausgelesen werden, in welchem sich die binary, also das Programm selbst befindet.
    Also bräuchte ich irgendeine Funktion, die
    DATA_PATH auf das Verzeichnis definiert, in welchem sich gerade die Binary befindet. Quasi die Ausgabe des Befehls "pwd", aber nun weiss ich nicht, ob sich das in C direkt realisieren lässt.

    Jemand eine Idee?

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Ort
    Darmstadt
    Beiträge
    59
    warum nimmst du keinen relativen pfad? d.h. du liest aus der anfänglich initialisierten variable argv[0] den relativen pfad des programmes aus, ziehst davon den programmnamen ab und hängst stattdessen den namen der ini an.

    konkretes beispiel:
    dein programm heißt prog.bin, deine config heißt prog.conf und der programmpfad ist /home/user/proggi

    du bist im verzeichnis: /home
    von dort startest du das programm mit dem kommando user/proggi/proggi.bin =: argv[0]
    dein programm entfernt von argv[0] die letzten zeichen bis zum ersten '/':
    user/proggi/ und fügt den namen der config an: user/proggi/prog.conf. da die dateizugriffe relativ zum systempfad geschehen, triffst du immer die datei, die du brauchst.

    falls du es so implementierst paß auf sonderfälle wie systempfad = dateipfad, etc. auf

    gruß,
    benjamin
    +++ this message is printed on 100% recycled electrons +++

  3. #3
    zico
    Gast
    Ja, das wäre theoretisch eine Möglichkeit, wenn das Programm wirklick im Homeverzeichnis liegen würde - was bei einem vorcompilierten Paket wahrscheinlich ist.
    Dennoch möchte ich auch dem Nutzer die Möglichkeit geben es vllt nach /opt bsp zu verschieben, wordurch dieses System wohl nicht mehr funktionieren würde.

    Momentan wäre dies mein Code, mit dem ich mich schon fast zufrieden geben würde:

    Code:
    {
    char *home = getenv("HOME");
    
    if ((t = FindArg("-userdir")))
    	chdir(Args[t+1]);
    
    else if (home) {
    	char buf[PATH_MAX + 5];
    
    	strcpy(buf, home);
    	strcat(buf, "/.prog-config");
    	if (chdir(buf)) {
    		mkdir(buf, 0755);
    		if (chdir(buf))
    			fprintf(stderr, "Cannot change to $HOME/.prog-config\n");
    	}
    }
    }
    Mit einem absoluten Pfad für die systemweiten Daten wäre der code absolut okay.
    Der Code wechselt per chdir in das user config Verzeichnis.
    Nun habe ich jedoch gehört, dass das einige Distributoren das garnicht so gerne sehen. Kann das jemand bestätigen oder ne Erklärung geben?

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Unter Linux hasst nur die eine chance:
    dein argv[0] auszuwerten.

    diesen Parameter gibt es ja unter anderem zu dem zweck ... nur isser nicht so leicht auszuwerten ....

    argv[0] ist genau der string, mit dem Du, oder dein WM oder was auch immer, dein programm aufgerufen hat ...

    Steht da nen absoluter pfad ala "//usr//bin//myprog" musst naturlich nur noch deinen programmnamen abkoppeln ...
    ist es ein relativer pfad ala .//myprog oder ..//data//myprog oder was weiss ich, musst deinen absoluten pfad dazu "ausrechnen"
    Dazu brauchst natuerlich die Position deines aktuellen Verzeichnisses (pwd) bei aufruf. Dafuer gibts in Posix ne systemfunktion. Da bei nem programmaufruf die ENV variablen (wo auch das aktuelle verzeichniss mit drinsteht) fuer den Prozess beim aufruf mitkopiert werden, brauchst auch keine angst haben, das nach dem aufruf jemand von aussen das veraendern kann, das kannst nur du im prozess fuer deinen prozess selber (oder du selbst rufst ne shell auf wo der user das tun kann). Das solltest du natuerlich nicht tun .... zumindest erst nachdem deinen absoluten Pfad ermittelt hasst ....

    BTW.
    Die QT macht es zum beispiel so (geht auch ned anders) weiss nich ob es noch andere Libs gibt die dir da unter die arme greifen koennen.

    Ciao ...

Lesezeichen

Berechtigungen

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