Wie kann man herausfinden in welchem Ordner mein C-Programm liegt?



  • Hallo,

    ich habe folgendes Problem und es wäre sehr schön wenn da jemand eine Idee hat:

    ich habe ein Programm das unter /opt/test/mein_programm liegt.

    dieses Programm wird allerdings aus /opt/test2 mit /opt/test/mein_programm
    aufgerufen. Die Funktion getcwd(current working directory) kenne ich wohl, aber
    diese hilft mir in diesem Fall ja nicht, da diese natürlich /opt/test2 ausspuckt. Hat jemand eine Idee wie ich das Verzeichnis herausbekomme in dem
    das Programm liegt, also /opt/test

    Vielen Dank im voraus

    Carsten



  • du könntest dir von autoconf (oder dem configure Script, was du verwendest) eine Konstante setzen lassen, wo sich das Programm befindet



  • wenn /opt/test/ in $PATH eigetragen ist (ich glaube mit PATH=PATH=PATH;/opt/test/ geht das),dann kannst du mit 'which mein_programm' das bestimmen.



  • naja, weiss nicht ob des mit "which" so gut ist....vorraussetzung ist ja, dass dein name eindeutig ist.
    würde eher das mit der umgebungsvariablen oder etwas einer konfigurationsdatei machen.
    äääh frage zum eigentlichen problem: du willst es wahrscheinlich nicht hardcoden, oder? weil sonst sollte es doch eigentlich auch so funzen!



  • Wieso ist die Idee mit which nix? Falls dein Name nicht eindeutig ist, lässt du einfach nen MD5 Check über die Executable drüberlaufen...



  • Du kannst den Commandostring parsen .... also den argv[0] muesste dir das den vollstaendigen Commandostring geben, also: "/opt/test/mein_programm" wenn es woanders ausfuehrst ... oder ".\mein_programm" / "mein_programm" wenn du es aus dem Aktuellen Verzeichnis aus, oder von nem releativen pfad vom Aktuellen verzeichniss aus ausrufst ... Viel Spass 🙂
    Funzt aber leider auch ned, wenn dein Programm im PATH ist, oder du symbolische Links verwendest.

    Aber ne andere Sache, wie Du siehst ist es bei Unix System sehr schwierig und unzuverlaessig herauszubekommen, wo das binary liegt (mit symbolischen links wirds so richtig intressant) ...
    Deshalb benutzt Unix auch eine etwas andere Art der Dateistrukturierung als Windows z.b .
    Bei windows legt man userunabhaengige ApplikationsKonfigurationen ins Applicationsverzeichniss. Bei Unix kommt das alles ins /etc, oder in nen unterverzeichniss davon! Groessere Ablagedateien kommen ins /var/<appname> Verzeichniss. Temporaere Dateien nach /var/temp etc.
    Die eigentliche binaerdatei (executable) kommt in ein anderes vorgesehenes Verzeichniss, getrennt von den anderen Applicationsdatein ... meist /usr/bin, oder /usr/X11/bin ... oder es werden zumindest symbolische Links dahin erzeugt. Applicationsdaten passen gut ins opt verzeichniss ...

    Benutzen Applicationen abweichende Pfade von diesen Shema , legens meist auch ne Umgebungsvariable an, um andere binarys zu finden (KDE mit KDE_DIR) .. etc.

    Wozu braucht man da noch den Pfad, wo dein executable liegt ???

    Ciao ...



  • @headhunter:

    was willst du machen? den md5 wert für die datei berechnen lassen und dann vergleichen ob´s das richtige ist?
    weiss ja nicht ob das so clever ist. dann musst du ja die den md5wert im aufrufenden programm hardcoden, was meiner meinung nach ja noch wartungsaufwendiger ist, als den pfad hardzucoden. du musst ja dann jedesmal den wert ändern, falls du das aufzurufende programm änderst!
    oder hab ich dich da falsch verstanden??


Anmelden zum Antworten