È per semplificare l'interfaccia. L'alternativa fork
e exec
sarebbe qualcosa come la funzione CreateProcess di Windows . Notare quanti parametri CreateProcess
ha, 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à, CreateProcess
non ha abbastanza parametri, quindi Microsoft ha dovuto aggiungere CreateProcessAsUser e CreateProcessWithLogonW .
Con il fork/exec
modello, non hai bisogno di tutti quei parametri. Invece, alcuni attributi del processo sono preservati exec
. Ciò ti consente di fork
modificare gli attributi di processo desiderati (utilizzando le stesse funzioni che utilizzeresti normalmente) e quindi exec
. In Linux, fork
non ha parametri e ne execve
ha solo 3: il programma da eseguire, la riga di comando da assegnare e il suo ambiente. (Esistono altre exec
funzioni, ma sono solo i wrapper execve
forniti 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 fork
e exec
.
Come accennato, gli Unix più moderni usano il copy-on-write, quindi fork
non 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.