Недопустимый аргумент Execv() Unix C++

Итак, у меня в основном есть векторные аргументы с 1 аргументом на массив, который я пытаюсь передать вызову execv() в unix.

Execv принимает два параметра, например: int execv(const char *path, char *const argv[]);

Каков наилучший способ преобразовать мой вектор строк в массив указателей? Прямо сейчас я делаю следующее, но когда я запускаю его, скажем, ps -a -f, ps кричит на меня, говоря о недопустимом аргументе. Любая помощь приветствуется.

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

person rideon88    schedule 07.10.2009    source источник


Ответы (2)


Я думаю, ваша проблема может заключаться в том, что вы пренебрегаете добавлением NULL в конец массива. Попробуй это:

char * arg[args.size()+1];
arg[args.size()] = NULL;
for (int j=0; [...]
person Jeremy Friesner    schedule 07.10.2009
comment
Угу... так и было. Вот что бывает, когда смотришь на одно и то же +8 часов в день. - person rideon88; 07.10.2009

Функции execv предоставляют массив указателей на строки с завершающим нулем, представляющие список аргументов, доступных для новой программы. Первый аргумент по соглашению должен указывать на имя файла, связанного с исполняемым файлом. Массив указателей должен заканчиваться указателем NULL.

person pierrotlefou    schedule 07.10.2009