Argumento Ilegal execv () Unix C ++
Pregunta
Así que, básicamente, tiene un vector args con 1 argumento por matriz que estoy tratando de pasar a una llamada execv () en UNIX.
execv acepta dos parámetros, así: int execv (camino char * const, char * const argv []);
¿Cuál es la mejor manera de convertir mi vector de cadenas a una matriz de punteros? En este momento estoy haciendo lo siguiente, pero cuando lo ejecuto con, por ejemplo, ps -f -a, ps me grita diciendo argumento ilegal. Cualquier ayuda es apreciada.
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: ?????
Solución
Creo que su problema puede ser que usted está descuidando a poner un nulo al final de la matriz. Prueba esto:
char * arg[args.size()+1];
arg[args.size()] = NULL;
for (int j=0; [...]
Otros consejos
Las funciones execv proporcionan un conjunto de punteros a cadenas terminadas en cero, que representan la lista de argumentos disponible para el nuevo programa. El primer argumento, por convenio, debe apuntar al nombre de archivo asociado con el archivo que está siendo ejecutado. La matriz de punteros debe terminarse con un puntero NULL.