Это должно упростить интерфейс. Альтернатива fork
и exec
было бы что-то как функция CreateProcess Windows. Заметьте сколько параметров 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
.
Как larsks упомянутый, самый современный Unixes используют копию на записи, таким образом, fork
не включает значительные издержки.
В дополнении к ответу cjm Единственная Спецификация Unix определяет названную функцию vfork()
. Та функция работает как ветвление, за исключением того, что разветвленный процесс имеет неопределенное поведение, если это делает что-нибудь кроме попытки, вызывающей функцию семейства должностных лиц или вызов _exit()
.
Таким образом в значительной степени единственное использование с определенным поведением:
pid_t ret = vfork();
if(ret == 0)
{
exec(...);
_exit(EXIT_FAILURE); //in case exec failed for any reason.
}
Таким образом, что делает vfork
? Это, недорогое fork
. В implemenations без копии на записи получающийся процесс совместно использует пространство памяти с исходным процессом (следовательно неопределенное поведение). В реализациях с копией на записи, vfork
разрешен быть идентичным fork()
, так как реализации копии на записи быстры.
Существует также дополнительное posix_spawn
функция (и a posix_spawnp
функция), который может непосредственно создать новый процесс. (Также допустимо реализовать их с использованием вызова библиотеки fork
и exec
, и реализация в качестве примера обеспечивается.)