Когда использовать system (), а когда использовать execv * ()? - PullRequest
12 голосов
/ 18 февраля 2010

Мне нужно выполнить команду unix с разными аргументами в цикле.Теперь мне интересно, должен ли я использовать execvp (), передавая cmd и args, или использовать system, создавая строку, состоящую из cmd + args?

Ответы [ 3 ]

10 голосов
/ 18 февраля 2010

Ну, другие ответы в основном правильно.

Система, хотя не только fork с, а затем exec с, она не exec ваш процесс, она запускает оболочку по умолчанию, передавая вашу программу в качестве аргумента.

Итак, если вы действительно не хотите использовать оболочку (для разбора параметров и т. П.), То намного эффективнее сделать что-то вроде:

int i = fork();
if ( i != 0 ) {
    exec*(...); // whichever flavor fits the bill
} else {
    wait(); // or something more sophisticated
}
8 голосов
/ 18 февраля 2010

Семейство функций exec заменит текущий процесс новым, тогда как system отключит новый процесс и дождется его завершения.Какой из них использовать, зависит от того, что вы хотите.

Поскольку вы делаете это в цикле, я думаю, вы не хотите заменять исходный процесс.Поэтому я предлагаю вам попробовать с system.

6 голосов
/ 18 февраля 2010

Я бы использовал execvp, только если не смогу добиться того, чего хочу с системой. Обратите внимание, что для получения эквивалента системы вам также нужны execvp, fork и некоторая обработка сигналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...