В моей программе я выполняю данную команду и получаю результат (журнал и статус выхода). Также моя программа должна поддерживают специфичные для оболочки команды (т.е. команды, содержащие специфические для оболочки символы ~ (tild), | (pipe), *). Но когда я пытаюсь запустить sh -c ls | wc
в моем домашнем каталоге через мою программу он не удался, и его статус выхода был 32512, также в потоке stderr было напечатано «sh: ls | wc: command not found»
.
Но интересно то, что команда sh -c ls | wc
работает правильно, если я запускаю его в оболочке.
В чем проблема? Или, что более предпочтительно, как я могу запускать специальные команды оболочки через мою программу (т.е. ec, какую команду с какими параметрами мне следует запускать)?
Приведенная ниже часть кода находится в дочерней части после fork (). Он выполняет команду.
tokenized_command
is std :: vector
, где в моем случае "sh", "-c", "ls", " | "," wc "
, также я пытался сохранить там " sh "," -c "," \ "ls | wc \ ""
, но результат такой же. команда
- это char *
, где хранится полная командная строка.
boost::shared_array<const char *> bargv(new const char *[tokenized_command.size() + 1]);
const char **argv = bargv.get();
for(int i = 0; i < tokenized_command.size(); ++i)
{
argv[i] = tokenized_command[i].c_str();
printf("argv[%d]: %s\n", i, argv[i]); //trace
}
argv[tokenized_command.size()] = NULL;
if(execvp(argv[0], (char * const *)argv) == -1)
{
fprintf(stderr, "Failed to execute command %s: %s", command, strerror(errno));
_exit(EXIT_FAILURE);
}
PS
Я знаю, что при использовании system (command)
вместо execvp
может решить мою проблему. Но system ()
ждет, пока команда не будет завершена, а для моей программы этого недостаточно. А также я Я уверен, что в реализации system ()
используется одна из функций семейства exec, поэтому проблему можно решить и с помощью exec
, но я не знаю как.