É para simplificar a interface. A alternativa fork
e exec
seria algo como a função CreateProcess do Windows . Observe quantos parâmetros CreateProcess
possui e muitos deles são estruturas com ainda mais parâmetros. Isso ocorre porque tudo o que você deseja controlar sobre o novo processo deve ser passado CreateProcess
. De fato, CreateProcess
como não possui parâmetros suficientes, a Microsoft precisou adicionar CreateProcessAsUser e CreateProcessWithLogonW .
Com o fork/exec
modelo, você não precisa de todos esses parâmetros. Em vez disso, certos atributos do processo são preservados exec
. Isso permite que você fork
altere os atributos de processo desejados (usando as mesmas funções que você usaria normalmente) e, em seguida exec
,. No Linux, fork
não possui parâmetros e execve
possui apenas 3: o programa a ser executado, a linha de comando a ser fornecida e seu ambiente. (Existem outras exec
funções, mas são apenas wrappers execve
fornecidos pela biblioteca C para simplificar casos de uso comuns.)
Se você deseja iniciar um processo com um diretório atual diferente: fork
, chdir
, exec
.
Se você deseja redirecionar stdin / stdout:, fork
feche / abra arquivos exec
,.
Se você quiser usuários Switch: fork
, setuid
, exec
.
Todas essas coisas podem ser combinadas conforme necessário. Se alguém criar um novo tipo de atributo de processo, você não precisará alterar fork
e exec
.
Como os larsks mencionaram, a maioria dos Unixes modernos usa cópia na gravação, portanto fork
, não envolve sobrecarga significativa.
fork(2)
página de manual no Linux diz: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.
Imagino (mas não sei ao certo) que esse é o caso de outros sabores modernos do Unix.