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: ?????
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top