fork()
vytvoří nový proces zkopírováním deskriptoru procesu. Tyto dva procesy tedy sdílejí (alespoň zpočátku) některá data, ale jakmile se jeden proces začne měnit mechanismus kopírování při zápisu zajišťuje, že změna je lokalizována pouze do procesu, který ji skutečně provedl. Je to standardní mechanismus pro vytváření procesů v systému UNIX.
To samozřejmě vytváří poměrně přirozený vztah rodiče-děti mezi procesy, ale to je nezávislé na vnitřní reprezentaci v jádře. Procesní deskriptory mohou být implementovány jako propojený seznam, strom, hashovací tabulka nebo jakákoli jiná (více či méně) vhodná struktura. Vše, co skutečně potřebujeme, je umístit do deskriptoru procesu jádra, který ukazuje na nadřazený proces (a možná také podřízené procesy). Zda je nebo není použit jako klíčová součást konstrukce, je rozhodnutí návrhu. Jednou z mnoha věcí, které přicházejí do hry při rozhodování o takové věci, je například to, co se stane, jakmile se ukončí nadřazený proces - na UNIXu init
proces přebírá osiřelé procesy (se všemi jejich podřízenými procesy).
Váš zmatek pramení z míchání dvou věcí:(1) udržování organizace deskriptorů procesu a (2) vztahu rodič/dítě.
Nepotřebujete vztah rodič/dítě, abyste se rozhodli, který proces spustit jako další, nebo (obecně), kterému procesu doručit signál. Takže Linux task_struct
(který jsem našel v linux/sched.h
pro zdroj jádra 3.11.5) má:
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 */
Máte pravdu, stromová struktura pro vztah dítě/rodič existuje, ale zdá se, že je skrytá v jiném seznamu a je ukazatelem na rodiče.
Slavný seznam dvojitých odkazů není v 3.11.5 struct task_struct
zřejmý definice struktury. Pokud jsem kód přečetl správně, nekomentovaný prvek struktury struct list_head tasks;
je "organizující" dvojitě propojený seznam, ale mohu se mýlit.