Различие между “системой” и “должностным лицом” в Linux?

Я задавал тот же непоздний вопрос и по моему скромному мнению.NET / Моно, кажется, более оптимальный вариант просто, потому что Моно имеет большой послужной список для межплатформенных настольных приложений (в противоположность Java) и конечно, Моно улучшается стремительно в эти дни.

67
задан David Guyon 19 May 2014 в 11:43
поделиться

5 ответов

system () вызывает sh для обработки вашей командной строки, чтобы вы могли получить подстановочные знаки и т. Д. exec () и его друзья заменяют текущий образ процесса новым образом процесса.

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

В общем, я думаю, вы можете думать о system () как о интерфейсе более высокого уровня. Вы можете продублировать его функции самостоятельно, используя комбинацию fork () , exec () и wait () .

Чтобы ответить на ваш последний вопрос, system () вызывает создание дочернего процесса, а семейство exec () - нет.

89
ответ дан 24 November 2019 в 14:37
поделиться

Функция exec заменяет текущий запущенный образ процесса в случае успеха, без дочерних создается (если вы не сделали это сами ранее с помощью fork () ). Функция system () выполняет ответвление дочернего процесса и возвращается, когда предоставленная команда завершает выполнение или возникает ошибка.

19
ответ дан 24 November 2019 в 14:37
поделиться

Для создания процесса:

  • fork (2) , системный вызов непосредственно к ядру

Для выполнения программы, заменяющей текущий образ:

  • execve (2) , системный вызов непосредственно к ядру, обычно вызывается просто exec

Для ожидания завершения дочернего процесса:

  • wait (2) , системный вызов непосредственно к ядро

Для запуска программы в оболочке в дочернем процессе и ожидания ее завершения:

  • system (3) , библиотечная функция

Для получения страниц руководства для всего вышеперечисленного:

   $ man 2 fork execve wait
   $ man 3 system
6
ответ дан 24 November 2019 в 14:37
поделиться

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

7
ответ дан 24 November 2019 в 14:37
поделиться

system () вызовет командную оболочку вашей системы по умолчанию, которая выполнит командную строку, переданную в качестве аргумента, которая сама может создавать или не создавать дополнительные процессы, которые будут зависеть от команды и система. В любом случае, по крайней мере, будет создан процесс командной оболочки.

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

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

2
ответ дан 24 November 2019 в 14:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: