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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top