Итак, вот фрагмент моего кода, который доставляет мне проблемы:
void childProcessHandler(string command){
int argCounter = 0;
for(int i=0; i!=command.size(); i++)
argCounter+=( command.at(i) == ' ');
char * temp, *token;
char *childArgs[argCounter];
argCounter = 1;
temp = new char [command.size()+1];
strcpy (temp, command.c_str());
token = strtok (temp," ");
childArgs[0] = token;
while (token!=NULL)
{
token = strtok(NULL," ");
childArgs[argCounter] = token;
argCounter++;
}
//delete[] temp; //Should remove token as well?
execvp(childArgs[0], childArgs);
cout<<"PROBLEM!"<<endl;
exit(-1);
}
В методе main () мой код попадает в точку, где он forks () (затем родительский процесс ожидает завершения дочернего процесса.) Затем дочерний процесс (ID процесса == 0 yes?) Вызывает метод childProcessHandler с пользовательским вводом (команда для запуска + аргументы) в качестве аргумента. Затем я токенизирую пользовательский ввод и вызываю execvp.
Все компилируется и выполняется. Строка после execvp никогда не достигается, потому что execvp возвращается только в случае ошибки yes?
Проект состоит в том, чтобы смоделировать терминал Unix, однако, когда я даю ему команду «дата», ничего не печатается, как должно ... Дочерний процесс завершается, и родительский процесс возобновляется очень хорошо, но ничего не отправляется обратно в окно терминала. ...
Что я делаю не так?
(Также нам «рекомендовали» использовать strtok для токенизации, но если у кого-то есть что-нибудь попроще, я открыт для мнений.)
СПАСИБО!
EDIT
Приведенный выше код работает, например, если я наберу «date» вместо «date». Я думаю, что может быть что-то подозрительное в «tokenizer», не помещающем нулевой символ в конец массива childArgs []. Я поиграюсь с этим и спасибо за быстрые ответы!
(Ninja edit, также закомментировано delete [] temp)