Pfad zur Binärdatei in C

8

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 "."

    
singpolyma 16.04.2009, 20:58
quelle

9 Antworten

5

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.

%Vor%

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.

    
Rob Simmons 08.05.2011, 04:08
quelle
15

Völlig nicht portable Linux-Lösung:

%Vor%

Dies verwendet den Trick "/ proc / self", der auf den laufenden Prozess verweist. Auf diese Weise wird verhindert, dass die PID nachgeschlagen wird. Fehler beim Umgang mit links als Übung zur Vorsicht.

    
richq 16.04.2009 21:08
quelle
8

Die nicht-portable Windows-Lösung:

%Vor%     
i_am_jorf 16.04.2009 21:12
quelle
6

Hier ist ein Beispiel, das für Linux-Systeme hilfreich sein könnte:

%Vor%

Im Wesentlichen verwenden Sie getpid() , um Ihre PID zu finden, und dann herauszufinden, wo die symbolische Verbindung bei /proc/<pid>/exe zeigt.

    
Matt J 16.04.2009 21:06
quelle
4
  

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.

    
Bastien Léonard 16.04.2009 21:12
quelle
4

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?

    
raimue 17.04.2009 02:11
quelle
3

Noch eine nicht portable Lösung für MacOS X:

%Vor%

Und das funktioniert auch für Binärdateien, die nicht in Anwendungspaketen sind.

    
Ingemar Ragnemalm 02.11.2013 08:56
quelle
2

Das Suchen von $ PATH ist nicht zuverlässig, da Ihr Programm möglicherweise mit einem anderen Wert von PATH aufgerufen wird. z.B.

%Vor%     
sigjuice 16.04.2009 21:12
quelle
1

Beachten Sie, dass argv[0] schlechter als unbrauchbar ist, wenn ich ein Programm wie dieses ausführe:

%Vor%

Die Linux-Lösung löst dieses Problem - ich nehme an, tut die Windows-Lösung.

    
Jonathan Leffler 17.04.2009 00:59
quelle

Tags und Links