Cuando un proceso crea un proceso secundario usando fork()
, entonces, ¿cuáles son las cosas del proceso principal que se comparten con el proceso secundario? como espacio de direcciones, memoria, señal, etc.
Nota: He revisado el manual de la bifurcación. Todavía necesito más información al respecto. También lo tengo en Google. Pero no necesito tener una idea completa al respecto. Por favor, que alguien me explique profundamente cómo funciona la bifurcación.
De Programación Avanzada en UNIX por W. Richard Stevens
El hijo es una copia del padre. Por ejemplo, el hijo obtiene una copia del espacio de datos, el montón y la pila del padre. Tenga en cuenta que esta es una copia para el niño; el padre y el niño no comparten estas porciones de memoria
una característica de la bifurcación es que todos los descriptores de archivo que están abiertos en el padre se duplican en el hijo.
Hay muchas otras propiedades del padre que son heredadas por el hijo:
1. real user ID, real group ID, effective user ID, effective group ID 2. supplementary group IDs 3. process group ID 4. session ID 5. controlling terminal 6. set-user-ID flag and set-group-ID flag 7. current working directory 8. root directory 9. file mode creation mask 10. signal mask and dispositions 11. the close-on-exec flag for any open file descriptors 12. environment 13. attached shared memory segments 14. resource limits 15. Memory mappings
Las diferencias entre padre e hijo son
1. the return value from fork 2. the process IDs are different 3. the two processes have different parent process IDs—the parent process ID of the child is the parent; the parent process ID of the parent doesn't change 4. the child's values for tms_utime, tms_stime, tms_cutime, and tms_ustime are set to 0 5. file locks set by the parent are not inherited by the child 6. pending alarms are cleared for the child 7. the set of pending signals for the child is set to the empty set
Cualquier referencia a Stevens es normalmente una buena referencia en mi libro. Sin embargo, una cosa que Stevens no hace es dar respuestas específicas de Linux, y la llamada al sistema de clone
no existía cuando Stevens escribió su libro.
Dado que ha etiquetado este Linux, supongo que desea la respuesta específica de Linux, que encontrará con man clone
. Esto le brinda la lista completa de cosas que podrían o no compartirse con fork()
, ya que fork()
se implementa usando clone()
. De memoria, fork()
usa clone()
sin pasar banderas (es decir, un 0
). La página de manual de clone()
le dirá exactamente lo que hace y lo que no copia.
Hay una buena explicación aquí: https://unix.stackexchange.com/questions/87551/which-file-in-kernel-specifies-fork-vfork-to-use-sys-clone-system-call