Недопустимый аргумент Execv() Unix C++
Вопрос
Итак, у меня в основном есть векторные аргументы с 1 аргументом на массив, которые я пытаюсь передать вызову execv() в unix.
Execv принимает два параметра следующим образом:int execv(const char * путь, 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: ?????
Решение
Я думаю, ваша проблема может заключаться в том, что вы пренебрегаете помещением NULL в конец массива.Попробуй это:
char * arg[args.size()+1];
arg[args.size()] = NULL;
for (int j=0; [...]
Другие советы
Функции execv предоставляют массив указателей на строки, заканчивающиеся нулем, которые представляют список аргументов, доступных новой программе.Первый аргумент, по соглашению, должен указывать на имя файла, связанное с выполняемым файлом.Массив указателей должен заканчиваться нулевым указателем.