Я задавал тот же непоздний вопрос и по моему скромному мнению.NET / Моно, кажется, более оптимальный вариант просто, потому что Моно имеет большой послужной список для межплатформенных настольных приложений (в противоположность Java) и конечно, Моно улучшается стремительно в эти дни.
system ()
вызывает sh
для обработки вашей командной строки, чтобы вы могли получить подстановочные знаки и т. Д. exec ()
и его друзья заменяют текущий образ процесса новым образом процесса.
С помощью system ()
ваша программа продолжает работать, и вы возвращаете некоторый статус внешней команды, которую вы вызвали. С помощью exec ()
ваш процесс уничтожается.
В общем, я думаю, вы можете думать о system ()
как о интерфейсе более высокого уровня. Вы можете продублировать его функции самостоятельно, используя комбинацию fork ()
, exec ()
и wait ()
.
Чтобы ответить на ваш последний вопрос, system ()
вызывает создание дочернего процесса, а семейство exec ()
- нет.
Функция exec заменяет текущий запущенный образ процесса в случае успеха, без дочерних создается (если вы не сделали это сами ранее с помощью fork ()
). Функция system () выполняет ответвление дочернего процесса и возвращается, когда предоставленная команда завершает выполнение или возникает ошибка.
Для создания процесса:
fork (2)
, системный вызов непосредственно к ядру Для выполнения программы, заменяющей текущий образ:
execve (2)
, системный вызов непосредственно к ядру, обычно вызывается просто exec
Для ожидания завершения дочернего процесса:
wait (2)
, системный вызов непосредственно к ядро Для запуска программы в оболочке в дочернем процессе и ожидания ее завершения:
system (3)
, библиотечная функция Для получения страниц руководства для всего вышеперечисленного:
$ man 2 fork execve wait
$ man 3 system
system ()
выполнит предоставленную команду в дочернем процессе, который она порождает. exec ()
заменит текущий процесс вызовом нового исполняемого файла, который вы укажете. Если вы хотите создать дочерний процесс с помощью exec
, вам необходимо предварительно выполнить fork ()
свой процесс.
system () вызовет командную оболочку вашей системы по умолчанию, которая выполнит командную строку, переданную в качестве аргумента, которая сама может создавать или не создавать дополнительные процессы, которые будут зависеть от команды и система. В любом случае, по крайней мере, будет создан процесс командной оболочки.
С помощью system () вы можете вызывать любую команду, тогда как с помощью exec () вы можете вызывать только исполняемый файл. Сценарии оболочки и командные файлы должны выполняться командной оболочкой.
По сути, они совершенно разные и используются для разных целей. Более того, exec () заменяет вызывающий процесс и не возвращает. Более полезным было бы сравнение между system () и spawn (). Хотя систему может быть проще вызвать, она возвращает значение, которое сообщает вам, была ли вызвана командная оболочка, и ничего не говорит об успехе самой команды. С помощью spawn () вы можете получить код выхода процесса; по соглашению ненулевое значение используется для обозначения состояния ошибки. Как и exec (), spawn () должен вызывать исполняемый файл, а не сценарий оболочки или встроенную команду.