Ist args [0] garantiert der Ausführungspfad?

8

Dies ist eine grundlegende Frage, aber dennoch eine wichtige Frage ...

Beim Starten eines C ++ - Programms, dessen Hauptmethode die folgende gemeinsame Signatur hat:

%Vor%

Ist args [0] immer der Pfad zum aktuell laufenden Programm? Was ist mit Cross-Plattform (da ich in einer Linux-Umgebung bin, aber später portieren kann)?

    
jamesmillerio 21.12.2008, 01:21
quelle

4 Antworten

21

Es ist nicht immer so. Es ist der Wert, den Sie dem Programm vom Betriebssystem gegeben haben. Wenn Sie beispielsweise ein Programm mit exec starten, können Sie dies auf einen beliebigen Wert setzen:

%Vor%

Der erste Parameter ist die zu startende Datei und argv wird argv [0] und alle anderen Parameter für main enthalten. envp enthält die Umgebungsvariablen (nicht definiert durch Standard C oder C ++. Dies ist eine Posix-Sache).

Genauer gesagt ist dies die Definition von argv in C ++:

  

Eine Implementierung soll die Hauptfunktion nicht vorgeben. Diese Funktion darf nicht überlastet werden. Es sollte   haben einen Rückgabetyp vom Typ int, aber ansonsten ist der Typ implementierungsdefiniert. Alle Implementierungen   Erlauben beide der folgenden Definitionen von main:

%Vor%
  

und

%Vor%
  

In der letzteren Form ist argc die Anzahl der Argumente, die dem Programm von der Umgebung in   auf dem das Programm ausgeführt wird. Wenn argc ungleich Null ist, müssen diese Argumente in argv[0] through angegeben werden    argv[argc-1] als Zeiger auf die Anfangszeichen von nullterminierten Multibyte-Strings (NTMBSs)   (17.3.2.1.3.2) und argv[0] sollen der Zeiger auf das Anfangszeichen eines NTMBS sein, der den   Name zum Aufruf des Programms oder "". Der Wert von argc soll nicht negativ sein. Der Wert von    argv[argc] muss 0 sein. [Hinweis: Es wird empfohlen, alle weiteren (optionalen) Parameter nachher hinzuzufügen   argv. ]

Es liegt an der Implementierung, was einen "Namen zum Aufruf des Programms" definiert. Wenn Sie den vollständigen Pfad Ihrer ausführbaren Datei abrufen möchten, können Sie GetModuleFileName unter Windows und argv[0] (um den Namen zu erhalten, der für die Ausführung verwendet wird, können relativ sein) zusammen mit getcwd (um das aktuelle Arbeitsverzeichnis zu erhalten, versuche den Namen absolut zu machen).

    
Johannes Schaub - litb 21.12.2008, 01:26
quelle
5

Nein. Unter Windows garantiert GetModuleFileName den exakten vollständigen Pfad zum aktuell ausgeführten Programm. Unter Linux gibt es einen Symlink / proc / self / exe. Führen Sie einen Readlink auf diesem Symlink aus, um den vollständigen Pfad des gerade ausgeführten Programms zu erhalten. Auch wenn Ihr Programm über einen Symlink aufgerufen wurde / proc / self / exe zeigt immer auf das aktuelle Programm.

    
Tim Matthews 21.12.2008 01:48
quelle
3

Es ist so nicht garantiert, dass Studenten versuchten, die Tatsache, dass sie Rogue auf dem Schul-Mainframe spielten, zu verstecken, indem sie C-Programme schreiben, die es mit argv [0] von "cc" oder "tcsh" starten würden. p>     

chaos 21.12.2008 02:04
quelle
2

Hier ist, was der C-Standard sagt, dass argv[0] sein sollte:

  

Wenn der Wert von argc größer als ist   Null, der String, auf den gezeigt wird    argv[0] steht für den Programmnamen;    argv[0][0] soll der Nullwert sein   Zeichen, wenn der Programmname nicht ist   verfügbar in der Host-Umgebung.

Ob es den vollständigen Pfad enthält, ist die Antwort, dass argv [0] nicht unbedingt den vollständigen Pfad zur ausführbaren Datei enthält. Unter Windows scheint es genau das zu sein, was in der Befehlszeile angegeben wurde. Weiß nicht, was Linux / Unix macht.

    
Michael Burr 21.12.2008 01:40
quelle

Tags und Links