Мне нужно выполнить команду unix с разными аргументами в цикле. Теперь я задаюсь вопросом, следует ли мне использовать execvp(), передавая в cmd и args или использовать систему, строя строку, состоящую из cmd + args?
Когда использовать system() и когда использовать execv *()?
Ответ 1
Ну, другие ответы в основном верны.
Система, а не только fork
, а затем exec
s, она не выполняет exec
ваш процесс, она запускает оболочку по умолчанию, передавая вашу программу в качестве аргумента.
Итак, если вы действительно не хотите оболочку (для разбора параметров и т.п.), гораздо эффективнее сделать что-то вроде:
int i = fork();
if ( i != 0 ) {
exec*(...); // whichever flavor fits the bill
} else {
wait(); // or something more sophisticated
}
Ответ 2
Семейство функций exec
заменит текущий процесс новым, в то время как system
откажется от нового процесса, а затем дождитесь его завершения. Какой из них зависит от того, что вы хотите.
Поскольку вы делаете это в цикле, я думаю, вы не хотите заменять исходный процесс. Поэтому я предлагаю вам попробовать с system
.
Ответ 3
Я бы использовал execvp только в том случае, если не могу добиться того, чего хочу с системой. Обратите внимание, что для получения эквивалента системы вам понадобятся execvp, fork и некоторая обработка сигналов.