C++ Pfad zum Programm finden

Freezedevil

Lieutenant
Registriert
Mai 2011
Beiträge
640
Hi,

ich hab eine einfache Frage auf die es hoffentlich eine ebenso einfach Antwort gibt. Es gibt doch sicherlich eine Möglichkeit den Pfad zum aktuell ausgeführten Programm zu finden. Bisher habe ich den angehangenen Code und kann auf diese Weise den Pfad inklusive Namen des Executable bekommen. Mein Anliegen ist jetzt nur den Pfad zu bekommen. Selbstverständlich wäre es kein Problem diesen zu extrahieren, aber wenn man ihn auch direkt bekommen kann, muss man nicht noch unnötig auf dem String arbeiten.
Das einzig relevante OS ist Ubuntu.

Code:
#include <iostream>
#include <unistd.h>

int main(int argc, char* argv[]) {
    char buf[255];
    readlink("/proc/self/exe", buf, sizeof(buf));
    std::cout << buf << std::endl;
    return 0;
}
 
Versuchs mal so:

Code:
int main(int argc, char** argv) {
    cout << argv[0] << endl;

    return 0;
}

Edit: Ich sehe grade du willst nur den Pfad ohne den namen der Datei selbst. Ich weiß nicht ob es da einen direkten weg gibt, ansonsten müsstest du einfach das erste / von hinten durch \0 ersetzen.
 
Zuletzt bearbeitet:
Danke für die Antwort, aber über argv[0] bekomme ich ja nicht einmal zwangsläufig den korrekten Dateinamen geschweige denn den Pfad dorthin.

Ich hab es jetzt erstmal so gelöst wie du im Edit vorgeschlagen hast (ist denke ich die beste Lösung wenn es nicht direkt geht), aber die Frage steht noch im Raum, falls jemandem etwas besseres einfällt.

Ihr könnt auch mal drauf gucken ob unter obskuren Bedingungen, an die ich gerade nicht gedacht hab, was falsches passiert.
Danke
Code:
#include <iostream>
#include <unistd.h>

int main(int argc, char* argv[]) {
	char buf[255];
	int count = readlink("/proc/self/exe", buf, sizeof(buf)) - 1;
	if (count <= 0) {
		return 1;
	}
	while (buf[count] != '/') {
		buf[count] = 0;
		--count;
	}
	std::cout << buf << std::endl;
	return 0;
}
 
argv[0] muß nicht zwangsläufig den absoluten Pfad enthalten. Ich glaube nicht, daß es da eine allgemeingültige, platformunabhängige Lösung gibt. Unter Windows könntest du mit GetModuleFileName() weiterkommen.


EDIT: Gerade gelesen, daß du mit Linux arbeitest ... sorry.
 
Alternativ sollte es (unter Linux zumindest) mit getcwd() gehen, siehe hier oder auf deutsch hier, auf der deutschen Seite einmal STRG+F drücken und dann getcwd eingeben ;)
 
These functions return a null-terminated string containing an absolute pathname that is the current working directory of the calling process.
Wenn ich das richtig verstehe bekomme ich damit den Pfad von dem aus das Programm aufgerufen wurde, nicht den in dem es liegt.
 
stan2008 schrieb:
Alternativ sollte es (unter Linux zumindest) mit getcwd() gehen

Das current working directory muß nicht zwangsweise das die Executable enthaltende Verzeichnis sein.
 
antred schrieb:
Das current working directory muß nicht zwangsweise das die Executable enthaltende Verzeichnis sein.

Aber man kann sich den Pfad aus argv[0] und getcwd() zusammenbauen, oder vergesse ich etwas?

€: Ok, wenn das Binary in $PATH liegt, geht es so auch nicht.

€2: Richtige Lösung: /proc/self/exe
 
Zuletzt bearbeitet:
Falls man einen Alias verwendet geht es auch nicht mit argv[0]
Über /proc/self/exe hab ich es ja schon im Eingangspost gemacht, aber da bekommt man zusätzlich zum Pfad auch den Namen und das möchte ich nicht.

Da es scheinbar keine direkte und damit elegantere Methode gibt, mache ich es einfach wie in Post #3.

Vielen Dank für eure Hilfe.
 
Zurück
Oben