Programmiersprache: C - Wie erhalte ich den Pfad der ausführbaren Datei?
-
Eine Möglichkeit könnte sein:
char buffer[80], path[80]; FILE *stream; snprintf(buffer, 80, "which %s", argv[0]); stream = popen(buffer, "r"); fgets(path, 80, stream); printf("Absoluter Pfad: %s", path); pclose(stream);
Martin
-
@Martin
die getcwd Lösung sollte aber schneller und portabler sein und ist IMHO schöner#include <unistd.h> #include <string.h> int main() { char buffer[100]; getcwd(buffer,sizeof(buffer)); return write(STDOUT_FILENO,buffer,strlen(buffer))==-1; }
-
@kingruedi:
Dein Code ist zwar nett, löst aber nicht das Problem von Dragonos. getcwd() liefert meines Wissens das aktuelle Verzeichnis, Dragonos wollte doch aber den Pfad der Binary-Datei haben, also z. B. "/usr/local/bin/my_program"Martin
-
Das geht meines Wissens auch überhaupt nicht. Ich kenn jedenfalls kein Programm, welches Konfigurationsdateien im bin-Verzeichnis sucht, die tun das i.A. unter /etc bzw. im $HOME.
-
Bashar schrieb:
Das geht meines Wissens auch überhaupt nicht. Ich kenn jedenfalls kein Programm, welches Konfigurationsdateien im bin-Verzeichnis sucht, die tun das i.A. unter /etc bzw. im $HOME.
Ich kann die Frage von Dragonos schon gut nachvollziehen, und mit meinem Code (s. o.) lässt sich das Problem auch lösen.
Ich nehme an, Dragonos will sein Programm in ein separates Verzeichnis ablegen, in dem auch die zugehörigen Konfigurationsdateien liegen und das auch in die PATH-Variable eingetragen ist. So hat man alle zu dem Programm gehörenden Dateien in einem Verzeichnis (sehr praktisch zu handhaben) und kann das Programm trotzdem "aus jedem anderen Verzeichnis heraus" aufrufen.Martin
-
Sicher klappt das, WENN deine Annahmen zutreffen. Es ist aber schlechte Programmierpraxis, sich darauf zu verlassen.
-
Martin G schrieb:
@kingruedi:
Dein Code ist zwar nett, löst aber nicht das Problem von Dragonos. getcwd() liefert meines Wissens das aktuelle Verzeichnis, Dragonos wollte doch aber den Pfad der Binary-Datei haben, also z. B. "/usr/local/bin/my_program"Martin
oh, ist mir auch gerade aufgefallen. Nunja, ein Versuch war es wert
-
Bashar schrieb:
Sicher klappt das, WENN deine Annahmen zutreffen. Es ist aber schlechte Programmierpraxis, sich darauf zu verlassen.
Welche Annahmen meinst du?
Die Frage ist immer, wo soll man allgemeingültige (also nicht User-spezifische) Konfigurationsdateien ablegen? In "/etc" tummeln sich ohnehin schon 'ne Menge, von denen man kaum noch zuordnen kann, zu welchem Programm sie gehören. Da ist mir die Lösung mit einem separaten Verzeichnis deutlich sympatischer - und vor allem ohne Root-Rechte realisierbar.
-
Martin G schrieb:
Welche Annahmen meinst du?
Dass das Programm im Pfad liegt und dass es auch entsprechend aufgerufen wurde, nicht z.B. über einen Link.
Die Frage ist immer, wo soll man allgemeingültige (also nicht User-spezifische) Konfigurationsdateien ablegen? In "/etc" tummeln sich ohnehin schon 'ne Menge, von denen man kaum noch zuordnen kann, zu welchem Programm sie gehören.
Das ist aber nunmal das Unix-Konzept. Systemweite Config nach /etc, User-spezifische ins Home. Wenn das Programm mehrere Config-Dateien benötigt, bekommt es ein /etc/programm/ bzw. $HOME/.programm/ Verzeichnis.
Da ist mir die Lösung mit einem separaten Verzeichnis deutlich sympatischer - und vor allem ohne Root-Rechte realisierbar.
Systemweise Konfigurationen sollte nur root bzw. jemand von root autorisiertes manipulieren können.
-
Martin G schrieb:
Bashar schrieb:
Sicher klappt das, WENN deine Annahmen zutreffen. Es ist aber schlechte Programmierpraxis, sich darauf zu verlassen.
Welche Annahmen meinst du?
Die Frage ist immer, wo soll man allgemeingültige (also nicht User-spezifische) Konfigurationsdateien ablegen? In "/etc" tummeln sich ohnehin schon 'ne Menge, von denen man kaum noch zuordnen kann, zu welchem Programm sie gehören. Da ist mir die Lösung mit einem separaten Verzeichnis deutlich sympatischer - und vor allem ohne Root-Rechte realisierbar./usr/local/etc/$ProgName
mfg
v R