Illegal Argument execv () Unix C ++
Frage
Also habe ich im Grunde ein Vektor args pro Array mit 1 Argument, dass ich versuche in Unix zu einem execv () Aufruf zu übergeben.
execv akzeptiert zwei Parameter wie folgt: int execv (const char * path, char * const argv []);
Was ist der beste Weg, um meinen Vektor von Strings zu einem Array von Zeigern zu konvertieren? Im Moment mache ich die folgenden, aber wenn ich es mit sagen laufen, ps -a -f, ps brüllt mir sagen illegal Argument. Jede Hilfe ist willkommen.
vector<string> args = tokenize(cmd);
char * arg[args.size()];
for(int j=0; j<args.size();j++)
{
arg[j] = (char*)args[j].c_str();
}
retval = execv(args[0].c_str(), arg);
.
>ps
PID TTY TIME CMD
635 ttys000 0:00.18 -bash
16106 ttys000 0:00.00 ./test cpp
12590 ttys001 0:00.02 -bash
>ps -a
ps: illegal argument: ?????
Lösung
Ich denke, Ihr Problem sein kann, dass Sie vernachlässigen eine NULL am Ende des Feldes zu setzen. Versuchen Sie folgendes:
char * arg[args.size()+1];
arg[args.size()] = NULL;
for (int j=0; [...]
Andere Tipps
Die execv Funktionen bieten eine Reihe von Zeigern auf nullterminierten Strings, die die Argumentliste verfügbar auf das neue Programm darstellen. Das erste Argument, durch Konvention, sollte mit der Datei verknüpft an den Dateinamen verweisen ausgeführt wird. Das Array von Zeigern muss durch einen NULL-Zeiger beendet werden.