Argumento ilegal Execv () Unix C ++
Pergunta
Então, basicamente, tenho um vetor args com 1 argumento por matriz que estou tentando passar para uma chamada Execv () no Unix.
O EXECV aceita dois parâmetros como assim: int Execv (const char *path, char *const argv []);
Qual é a melhor maneira de converter meu vetor de cordas em uma variedade de indicadores? No momento, estou fazendo o seguinte, mas quando eu o corro com, digamos, ps -a -f, ps grita comigo dizendo discussões ilegais. Qualquer ajuda é 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: ?????
Solução
Eu acho que seu problema pode ser que você esteja deixando de colocar um nulo no final da matriz. Experimente isso:
char * arg[args.size()+1];
arg[args.size()] = NULL;
for (int j=0; [...]
Outras dicas
As funções EXECV fornecem uma variedade de indicadores a seqüências de caracteres com terminação nula que representam a lista de argumentos disponível para o novo programa. O primeiro argumento, por convenção, deve apontar para o nome do arquivo associado ao arquivo que está sendo executado. A variedade de ponteiros deve ser encerrada por um ponteiro nulo.