Wie kann ich den Pfad ermitteln, in dem sich die ausführbare Binärdatei in einem C-Programm befindet?
Ich suche nach etwas ähnlich wie __FILE__
in Ruby / Perl / PHP (aber natürlich wird das Makro __FILE__
in C zur Kompilierzeit bestimmt).
dirname(argv[0])
gibt mir in allen Fällen, was ich will, es sei denn, die Binärdatei ist in $PATH
des Benutzers ... dann bekomme ich überhaupt nicht die Information, die ich will, sondern ""
oder "."
Ein Trick, den ich verwendet habe, der auf mindestens OS X und Linux funktioniert, um das $ PATH-Problem zu lösen, ist, die "echte binäre" foo.exe
anstelle von foo
zu machen: die Datei foo
, was der Benutzer tatsächlich aufruft, ist ein Stub-Shell-Skript, das die Funktion mit ihren ursprünglichen Argumenten aufruft.
Die Umleitung durch ein Shell-Skript bedeutet, dass das reale Programm ein argv[0]
erhält, das tatsächlich nützlich ist, anstatt eines, das in $PATH
leben kann. Ich habe einen Blogbeitrag dazu aus der Perspektive geschrieben der Standard-ML-Programmierung, bevor mir klar wurde, dass dies wahrscheinlich ein sprachunabhängiges Problem war.
dirname(argv[0])
wird mir in allen Fällen geben, was ich will, es sei denn, die Binärdatei ist in$PATH
des Benutzers ... dann bekomme ich überhaupt nicht die Informationen, die ich will, sondern "" oder "."
argv[0]
ist nicht zuverlässig, es kann einen Alias enthalten, der vom Benutzer über seine Shell definiert wurde.
Beachten Sie, dass auf Linux und den meisten UNIX-Systemen Ihre Binärdatei nicht unbedingt mehr existieren muss, solange sie noch läuft. Außerdem könnte die Binärdatei ersetzt worden sein. Wenn Sie also darauf verlassen wollen, dass die Binärdatei selbst wieder mit anderen Parametern oder etwas anderem ausgeführt wird, sollten Sie das unbedingt vermeiden.
Es würde es einfacher machen, Ratschläge zu geben, wenn Sie sagen würden, warum Sie den Pfad zur Binärdatei selbst benötigen?
Noch eine nicht portable Lösung für MacOS X:
%Vor%Und das funktioniert auch für Binärdateien, die nicht in Anwendungspaketen sind.
Beachten Sie, dass argv[0]
schlechter als unbrauchbar ist, wenn ich ein Programm wie dieses ausführe:
Die Linux-Lösung löst dieses Problem - ich nehme an, tut die Windows-Lösung.