Es para simplificar la interfaz. La alternativa forky execsería algo así como la función CreateProcess de Windows . Observe cuántos parámetros CreateProcesstiene, y muchos de ellos son estructuras con aún más parámetros. Esto se debe a que debe pasar todo lo que desee controlar sobre el nuevo proceso CreateProcess. De hecho, CreateProcessno tiene suficientes parámetros, por lo que Microsoft tuvo que agregar CreateProcessAsUser y CreateProcessWithLogonW .
Con el fork/execmodelo, no necesita todos esos parámetros. En cambio, ciertos atributos del proceso se conservan en todo exec. Esto le permite fork, luego cambiar los atributos de proceso que desee (usando las mismas funciones que usaría normalmente), y luego exec . En Linux, forkno tiene parámetros, y execvesolo tiene 3: el programa a ejecutar, la línea de comando para darle y su entorno. (Hay otras execfunciones, pero son solo envoltorios execveproporcionados por la biblioteca C para simplificar los casos de uso comunes).
Si desea iniciar un proceso con un directorio actualizado diferente: fork, chdir, exec.
Si desea redirigir stdin / stdout: fork, cerrar / abrir archivos, exec.
Si quieres usuarios del interruptor: fork, setuid, exec.
Todas estas cosas se pueden combinar según sea necesario. Si a alguien se le ocurre un nuevo tipo de atributo de proceso, no tiene que cambiar forky exec.
Como se mencionó anteriormente, la mayoría de los Unix modernos usan copia en escritura, por lo forkque no implica una sobrecarga significativa.
fork(2)página de manual de 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.Me imagino (pero no lo sé con certeza) que este es el caso de otros sabores modernos de Unix.