É para simplificar a interface. A alternativa forke execseria algo como a função CreateProcess do Windows . Observe quantos parâmetros CreateProcesspossui 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, CreateProcesscomo não possui parâmetros suficientes, a Microsoft precisou adicionar CreateProcessAsUser e CreateProcessWithLogonW .
Com o fork/execmodelo, você não precisa de todos esses parâmetros. Em vez disso, certos atributos do processo são preservados exec. Isso permite que você forkaltere os atributos de processo desejados (usando as mesmas funções que você usaria normalmente) e, em seguida exec ,. No Linux, forknão possui parâmetros e execvepossui apenas 3: o programa a ser executado, a linha de comando a ser fornecida e seu ambiente. (Existem outras execfunções, mas são apenas wrappers execvefornecidos 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:, forkfeche / 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 forke 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.