Um Daten als verknüpfte Liste mit struct list_head
zu organisieren Sie müssen list root deklarieren und Listeneintrag deklarieren zur Verknüpfung. Sowohl Stamm- als auch untergeordnete Einträge sind vom gleichen Typ (struct list_head
). children
Eingabe von struct task_struct
Eintrag ist ein root
. sibling
Eingabe von struct task_struct
ist ein list entry
. Um die Unterschiede zu sehen, müssen Sie den Code lesen, wobei children
und sibling
werden verwendet. Verwendung von list_for_each
für children
bedeutet was children
ist ein root
. Verwendung von list_entry
für sibling
bedeutet was sibling
ist ein list entry
.
Hier können Sie mehr über Linux-Kernel-Listen lesen.
Frage :Was ist der Grund, warum wir hier "Geschwister" übergeben, was schließlich eine andere Liste mit unterschiedlichem Offset ist?
Antwort:
Wenn die Liste auf diese Weise erstellt wurde:
list_add(&subtask->sibling, ¤t->children);
Als
list_for_each(list, ¤t->children)
Initialisiert Listenzeiger auf sibling
, also müssen Sie subling
verwenden als Parameter für list_entry. So so Linux-Kernel listet die API auf, die entwickelt wurde.
Wurde die Liste jedoch in einer anderen (falschen ) Weise:
list_add(&subtask->children, ¤t->sibling);
Dann müssen Sie die Liste so iterieren (falsch ) Weise:
list_for_each(list, ¤t->sibling)
Und jetzt müssen Sie children
verwenden als Parameter für list_entry
.
Hoffe, das hilft.
Es folgt die bildliche Darstellung, die jemandem in Zukunft helfen könnte. Das obere Kästchen stellt einen Elternteil dar, und die beiden unteren Kästchen sind seine Kinder
Hier ist ein Bild zusätzlich zu den vorherigen Antworten. Derselbe Prozess kann sowohl ein Elternteil als auch ein Kind sein (als Eltern1 auf dem Bild), und wir müssen zwischen diesen beiden Rollen unterscheiden.
Intuitiv, wenn children
von Parent0 würde auf children
zeigen von Parent1, dann Parent0.children.next->next
(grüner Kreis auf dem Bild), was mit Parent1.children.next
identisch ist , würde auf ein untergeordnetes Element von Parent1 statt auf ein nächstes untergeordnetes Element von Parent0 verweisen.