Системный вызов UNIX для создания процесса, fork (), создает дочерний процесс путем копирования родительского процесса. Насколько я понимаю, за этим почти всегда следует вызов exec () для замены пространства памяти дочернего процесса (включая текстовый сегмент). Копирование пространства памяти родителя в fork () всегда казалось мне расточительным (хотя я понимаю, что отходы можно минимизировать, копируя при записи сегменты памяти, чтобы копировались только указатели). Во всяком случае, кто-нибудь знает, почему этот подход дублирования требуется для создания процесса?
process
process-management
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.select
был сломан, но это уже другая история).Ответы:
Это для упрощения интерфейса. Альтернативой
fork
иexec
будет что-то вроде функции Windows CreateProcess . Обратите внимание, сколько параметровCreateProcess
имеет, и многие из них являются структурами с еще большим количеством параметров. Это потому, что все, что вы можете контролировать в новом процессе, должно быть переданоCreateProcess
. На самом делеCreateProcess
не хватает параметров, поэтому Microsoft пришлось добавить CreateProcessAsUser и CreateProcessWithLogonW .С
fork/exec
моделью вам не нужны все эти параметры. Вместо этого определенные атрибуты процесса сохраняютсяexec
. Это позволяет вамfork
затем изменить любые атрибуты процесса, которые вы хотите (используя те же функции, которые вы обычно используете), а затемexec
. В Linuxfork
не имеет параметров иexecve
имеет только 3: программу для запуска, командную строку для ее выдачи и ее среду. (Существуют и другиеexec
функции, но они являются просто обертками,execve
предоставляемыми библиотекой C, для упрощения общих случаев использования.)Если вы хотите , чтобы начать процесс с другим текущим каталогом:
fork
,chdir
,exec
.Если вы хотите Перенаправление STDIN / STDOUT:
fork
, закрытие / открытые файлы,exec
.Если вы хотите , чтобы пользователи переключателя:
fork
,setuid
,exec
.Все эти вещи могут быть объединены по мере необходимости. Если кто-то придумает новый тип атрибута процесса, вам не нужно менять
fork
иexec
.Как уже упоминалось, большинство современных Unix-систем используют копирование при записи, поэтому
fork
не требует значительных накладных расходов.источник
В дополнение к ответу cjm, Спецификация Single Unix определяет функцию с именем
vfork()
. Эта функция работает как fork, за исключением того, что разветвленный процесс имеет неопределенное поведение, если он делает что-то кроме попыток вызова функции exec familly или вызова_exit()
.Таким образом, почти единственное использование с определенным поведением:
Так что же
vfork
делать? Это недорогоfork
. В реализациях без копирования при записи результирующий процесс будет совместно использовать пространство памяти с исходным процессом (отсюда и неопределенное поведение). В реализациях с копированием при записиvfork
разрешено быть идентичнымfork()
, поскольку реализации копирования при записи выполняются быстро.Существует также дополнительная
posix_spawn
функция (иposix_spawnp
функция), которая может непосредственно создавать новый процесс. (Также допустимо реализовать их с помощью вызова библиотеки с использованиемfork
иexec
, и приведен пример реализации.)источник