2009-10-07 7 views
1

Donc, j'ai fondamentalement un vecteur args avec 1 argument par tableau que j'essaye de passer à un appel execv() dans unix. Execv accepte deux paramètres comme: int execv (const char * chemin, char * const argv []);Argument illégal Execv() Unix C++

Quelle est la meilleure façon de convertir mon vecteur de chaînes en un tableau de pointeurs? En ce moment, je suis en train de faire ce qui suit mais quand je le lance avec say, ps -a -f, ps me crie disant argument illégal. Toute aide est appréciée.

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: ????? 

Répondre

5

Je pense que votre problème peut être que vous négligez de mettre une valeur NULL à la fin de la matrice. Essayez ceci:

char * arg[args.size()+1]; 
arg[args.size()] = NULL; 
for (int j=0; [...] 
+0

Ugh ... c'était ça. C'est ce qui se passe quand vous regardez la même chose pendant +8 heures en une journée. – rideon88

1

Les fonctions de execv fournissent un tableau de pointeurs sur des chaînes terminées par null qui représentent la liste des arguments à la disposition du nouveau programme. Le premier argument, par convention, doit pointer vers le nom de fichier associé au fichier en cours d'exécution. Le tableau de pointeurs doit être terminé par un pointeur NULL.