Разница между использованием fork/execvp и системным вызовом

В чем разница между использованием system() для выполнения двоичного кода и использованием комбинации fork/execvp.

Есть ли разница в безопасности/пропускной способности/производительности.

Ответ 1

Система также использует комбинацию fork/exec.... Если вы выполняете fork/exec самостоятельно, вы можете выполнить параллель с выполняемым процессом, тогда как system блокирует (включает wait). Кроме того, system выполняет команду не напрямую, а через оболочку (что создает проблемы с битом setuid) и system блокирует/игнорирует определенные сигналы (SIGINT, SIGCHILD, SIGQUIT).

Ответ 2

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

Изменить: конечно, справочная страница содержит более подробную информацию.

Ответ 3

system() будет fork()/exec() оболочкой, а затем оболочкой будет fork()/exec() программа, которую вы хотите запустить.

So system() в два раза тяжелее, чем fork()/exec()

Ответ 4

system() работает в Windows, но fork() не делает.

Если вы не используете уровень совместимости, такой как Cygwin, но даже тогда вилка может быть очень дорогой.

Ответ 5

там также popen(), который похож на system(), но позволяет читать дочерний вывод и предоставлять ввод