È per semplificare l'interfaccia. L'alternativa forke execsarebbe qualcosa come la funzione CreateProcess di Windows . Notare quanti parametri CreateProcessha, e molti di loro sono strutture con ancora più parametri. Questo perché tutto ciò che potresti voler controllare sul nuovo processo deve essere passato a CreateProcess. In realtà, CreateProcessnon ha abbastanza parametri, quindi Microsoft ha dovuto aggiungere CreateProcessAsUser e CreateProcessWithLogonW .
Con il fork/execmodello, non hai bisogno di tutti quei parametri. Invece, alcuni attributi del processo sono preservati exec. Ciò ti consente di forkmodificare gli attributi di processo desiderati (utilizzando le stesse funzioni che utilizzeresti normalmente) e quindi exec . In Linux, forknon ha parametri e ne execveha solo 3: il programma da eseguire, la riga di comando da assegnare e il suo ambiente. (Esistono altre execfunzioni, ma sono solo i wrapper execveforniti dalla libreria C per semplificare i casi d'uso comuni.)
Se si vuole iniziare un processo con una directory corrente diversa: fork, chdir, exec.
Se si desidera reindirizzare stdin / stdout: fork, vicino / file aperti, exec.
Se si desidera utenti interruttore: fork, setuid, exec.
Tutte queste cose possono essere combinate secondo necessità. Se qualcuno presenta un nuovo tipo di attributo di processo, non è necessario cambiare forke exec.
Come accennato, gli Unix più moderni usano il copy-on-write, quindi forknon comportano un sovraccarico significativo.
fork(2)pagina man sotto Linux dice: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.Immagino (ma non lo so per certo) che questo è il caso di altri gusti Unix moderni.