Sua confusão decorre da mistura de duas coisas: (1) manter os descritores de processo organizados e (2) o relacionamento pai / filho.
Você não precisa do relacionamento pai / filho para decidir qual processo será executado em seguida ou (em geral) para qual processo entregar um sinal. Então, o Linux task_struct
(que eu encontrei em linux/sched.h
para a fonte do kernel 3.11.5) tem:
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 */
Você está correto, existe uma estrutura de árvore para o relacionamento filho / pai, mas ela parece estar oculta em outra lista e um ponteiro para o pai.
A famosa lista duplamente vinculada não é óbvia na definição da estruturastruct task_struct
de 3.11.5%. Se eu ler o código corretamente, o elemento de estrutura não comentado struct list_head tasks;
é a lista duplamente vinculada de "organização", mas posso estar errado.