Я пишу простую программу оболочки на C ++. Когда я передаю свои аргументы в execvp, в частности, для ls
команда, я получаю ls: cannot access H��p����: Protocol error
, Аналогичная ошибка возникает и для других команд.
Моя стратегия заключается в разборе входных данных в vector<vector<char>
а затем преобразовать его в char **
,
Вот код преобразования ниже:
//input is parsed from command-line above
vector< vector<char> > args_vector;
string s;
stringstream ss(input);
while(getline(ss, s, ' ')){
vector<char> cv(s.begin(), s.end());
cv.push_back('\0');
args_vector.push_back(cv);
}
char *args[args_vector.size() + 1];
for(int i = 0; i < args_vector.size(); i++){
char *arg = &args_vector[i][0];
args[i] = arg;
}
args[args_vector.size() + 1] = NULL;
Затем я передаю аргументы в execvp в следующем коде ниже:
pid_t child_pid
int status;
child_pid = fork();
if (child_pid == 0) {
execvp(args[0], args);
cout << "Error: execution of command failed";
}
else {
pid_t pid;
do {
pid = wait(&status);
} while (pid != child_pid);
}
Я компилирую код с помощью clang ++ и на виртуальной машине Debian 8 в Mac OS X. У кого-нибудь есть идеи, что происходит?
Чтобы развить мое предположение о вашей проблеме: я предполагаю, что токенизация (первый фрагмент кода) находится в отдельной функции, а затем возвращает, что делает вектор векторов символов, которые вы уничтожили, таким образом, указатели, которые вы сохраняете args
массив больше не будет действительным. Это ведет к неопределенное поведение, и вам очень повезло, что программа на самом деле не падает (что является распространенным симптомом неопределенного поведения).
Других решений пока нет …