Es para simplificar la interfaz. La alternativa fork
y exec
sería algo así como la función CreateProcess de Windows . Observe cuántos parámetros CreateProcess
tiene, 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, CreateProcess
no tiene suficientes parámetros, por lo que Microsoft tuvo que agregar CreateProcessAsUser y CreateProcessWithLogonW .
Con el fork/exec
modelo, 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, fork
no tiene parámetros, y execve
solo tiene 3: el programa a ejecutar, la línea de comando para darle y su entorno. (Hay otras exec
funciones, pero son solo envoltorios execve
proporcionados 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 fork
y exec
.
Como se mencionó anteriormente, la mayoría de los Unix modernos usan copia en escritura, por lo fork
que 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.