execvp mit parametern
-
Hi Leute
ich habe ein ProgrammX
dieses rufe ich wie folgt auf ./ProgrammX ./ProgrammZ 2
hierbei ist ./ProgrammZ = argv[1] und 2 argv[2]
nun möchte ich aus programmX heraus das ProgrammZ mit 2 als Parameter aufrufen ...
dazu verwende ich execvp(argv[1],&argv[2]);
das Programm wird zwar aufgerufen, aber es wird kein Parameter mitgegeben ....
woran liegt das?
-
Der zweite Parameter sollte wohl auch ein Array sein. Erstes Element ist (wie in deinem Programm auch) argv[0]: der Programmname... erst argv[1] ist der eigentlich erste Parameter.
-
ja ich hab ein char* const* array gebaut das erziehlt aber auch keinen erfolg...
hat noch jemand ne idee?
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C (C89, C99 und C11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
hab das Problem gelöst ... als zweiter Parameter muss &argv[1] stehen ... wieso auch immer
jemand ne idee?
-
Die Argumentenliste fängt i.A mit dem Programmnamen an.
-
Immer die passende manpage
man execvp
lesen. Da steht, wie das Array aufgebaut sein muss.Und schön das du "ein
char* const*
array gebaut" hast, der Code wäre dazu recht hilfreich, um den Fehler zu finden.Wenn du
&argv[1]
nimmst, übernimmst du halt einfach das Ende deines Argumenten-Arrays. In deinem speziellen Fall passt das so, im Allgemeinem aber eher nicht.char *targ[3]; targ[0] = argv[1]; /* Programmname */ targ[1] = argv[2]; /* 1. Parameter */ targ[2] = 0; /* NULL-Terminierung */
-
Das ist doch totaler Nonsens, die Zeiger nochmal zu kopieren.
Also entweder mit constint main(int argc,char**argv) { const char **arg = argv+1; execvp(arg[0],arg+1);
oder direkt
int main(int argc,char**argv) { ++argv; execvp(argv[0],argv+1);
-
Wutz, du hast nicht gelesen, was ich geschrieben hab, oder?
lagalopex schrieb:
Wenn du
&argv[1]
nimmst, übernimmst du halt einfach das Ende deines Argumenten-Arrays. In deinem speziellen Fall passt das so, im Allgemeinem aber eher nicht.Und du hast 2-mal +1...
-
hans-sonny schrieb:
jemand ne idee?
Wie DirkB schon geschrieben hat, der Argument Vector enthält als erstes Element den Namen/Pfad des Programms. Falls dich eine sinnvolle Nutzung davon interessiert:
Viele Programme passen ihr Verhalten entsprechend dem Namen, mit dem sie aufgerufen wurden, an. So entscheidet bzip2 darüber ob es etwas packen oder entpacken soll je nachdem ob es als "bzip2" oder "bunzip2" aufgerufen wurde. Mit "bzcat" wird dekomprimiert und auf Stdout ausgegeben. Letztendlich ist es jedoch immer die gleiche Binary.
Ähnliches machen viele Vi-Implementierungen, etwa Vim. Aufgerufen als "ex" starten sie im Ex-Mode. Steht "view" in argv[0], wird die Datei read-only betrachtet.