fork()
crea un nuevo proceso copiando el descriptor del proceso. Por lo tanto, los dos procesos comparten (al menos inicialmente) algunos datos, pero tan pronto como un proceso comienza a cambiar El mecanismo de copia en escritura se asegura de que el cambio se localice solo en el proceso que realmente lo realizó. Es el mecanismo estándar para generar procesos en UNIX.
Por supuesto, esto crea una relación padre-hijo bastante natural entre los procesos, pero esto es independiente de la representación interna en el núcleo. Los descriptores de procesos se pueden implementar como una lista enlazada, un árbol, una tabla hash o cualquier otra estructura (más o menos) adecuada. Todo lo que uno realmente necesita es colocarlo en el descriptor del proceso del kernel que apunte al proceso principal (y posiblemente también a los procesos secundarios). Si se usa o no como parte clave de la estructura es una decisión de diseño. Una de las muchas cosas que entran en juego al decidir tal cosa es, por ejemplo, lo que sucede una vez que finaliza el proceso principal:en UNIX, el init
proceso adopta procesos huérfanos (con todos sus procesos secundarios).
Su confusión proviene de mezclar dos cosas:(1) mantener organizados los descriptores del proceso y (2) la relación padre/hijo.
No necesita la relación padre/hijo para decidir qué proceso ejecutar a continuación o (en general) a qué proceso enviar una señal. Entonces, Linux task_struct
(que encontré en linux/sched.h
para la fuente del kernel 3.11.5) tiene:
struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
/*
* children/sibling forms the list of my natural children
*/
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parent's children list */
Tienes razón, existe una estructura de árbol para la relación padre/hijo, pero parece estar oculta en otra lista y apunta al padre.
La famosa lista de enlaces dobles no es obvia en la versión 3.11.5 struct task_struct
definición de estructura. Si leo el código correctamente, el elemento de estructura no comentado struct list_head tasks;
es la lista "organizadora" con doble enlace, pero podría estar equivocado.