El motivo de los dos pasos es la flexibilidad. Entre los dos pasos, puede modificar el contexto del proceso secundario que heredará el programa recién ejecutado.
Algunas cosas que usted puede cambiar son:
- descriptores de archivo de ID
- usuario/grupo
grupo y los identificadores de sesión
- Proceso
- directorio
- Los límites de recursos actuales
- Programación prioridad y afinidad
- Máscara de creación de archivos (Umask)
Si no dividir tenedor y exec y en su lugar había una sola llamada desovar sistema similar, tendría que tomar argumentos para cada uno de estos atributos de proceso si quería a establecer de manera diferente en un niño proceso. Por ejemplo, vea la lista de argumentos para CreateProcess en la API de Windows.
Con fork/exec, cambia los atributos de proceso heredables que desee en el elemento secundario antes de ejecutar el nuevo programa.
La configuración de los descriptores de archivos es una de las cosas más comunes para cambiar en el contexto del proceso de un niño. Si desea capturar la salida de un programa, normalmente creará una tubería en el padre con la llamada al sistema pipe (2), y después de la bifurcación (2) ing, cerrará el final de escritura en el proceso principal y cerrará el read end en el proceso hijo antes de llamar a execve (2). (También usará dup (2) para configurar el extremo hijo de la tubería para que sea el descriptor de archivo 1 (stdout)). Esto sería imposible o restrictivo en una sola llamada al sistema.
Realmente, no puedes hacer nada mal con fork(), ya que no tiene ningún argumento. ¿Puede ser más simple? – 0x6adb015
Umm, exec reemplaza todo el mm, no solo el "texto" ... vea /usr/src/linux/fs/exec.c y /usr/src/linux/fs/binfmt_elf.c – ephemient
Normalmente, el tenedor no clone el área de datos, pero márquelo como Copiar-Escribir-Escribir (COW) en su lugar. Si el padre o el niño intentaron cambiar los datos, la página se clonará y el padre y el niño terminarán con páginas diferentes. – camh