Это для упрощения интерфейса. Альтернативой fork
и exec
будет что-то вроде функции Windows CreateProcess . Обратите внимание, сколько параметров CreateProcess
имеет, и многие из них являются структурами с еще большим количеством параметров. Это потому, что все, что вы можете контролировать в новом процессе, должно быть передано CreateProcess
. На самом деле CreateProcess
не хватает параметров, поэтому Microsoft пришлось добавить CreateProcessAsUser и CreateProcessWithLogonW .
С fork/exec
моделью вам не нужны все эти параметры. Вместо этого определенные атрибуты процесса сохраняются exec
. Это позволяет вам fork
затем изменить любые атрибуты процесса, которые вы хотите (используя те же функции, которые вы обычно используете), а затем exec
. В Linux fork
не имеет параметров и execve
имеет только 3: программу для запуска, командную строку для ее выдачи и ее среду. (Существуют и другие exec
функции, но они являются просто обертками, execve
предоставляемыми библиотекой C, для упрощения общих случаев использования.)
Если вы хотите , чтобы начать процесс с другим текущим каталогом: fork
, chdir
, exec
.
Если вы хотите Перенаправление STDIN / STDOUT: fork
, закрытие / открытые файлы, exec
.
Если вы хотите , чтобы пользователи переключателя: fork
, setuid
, exec
.
Все эти вещи могут быть объединены по мере необходимости. Если кто-то придумает новый тип атрибута процесса, вам не нужно менять fork
и exec
.
Как уже упоминалось, большинство современных Unix-систем используют копирование при записи, поэтому fork
не требует значительных накладных расходов.
fork(2)
странице руководства под Linux написано: «Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Я представляю (но не знаю наверняка), что это имеет место для других современных разновидностей Unix.