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: ?????
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top