GNU/Linux >> LINUX-Kenntnisse >  >> Linux

warum die Geschwisterliste verwendet wird, um die task_struct zu erhalten, während die Kinder eines Prozesses abgerufen werden

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, &current->children);

Als

list_for_each(list, &current->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, &current->sibling);

Dann müssen Sie die Liste so iterieren (falsch ) Weise:

list_for_each(list, &current->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.


Linux
  1. Warum wird `while Ifs=Read` so oft verwendet, anstatt `ifs=; Während Read..`?

  2. Warum friert der PC ein, während ich eine Datei auf einen Pendrive kopiere?

  3. Warum ist der Standardprozesserstellungsmechanismus Fork?

  4. Welcher Befehl wird verwendet, um die Liste der Dateien/Ordner nach Zeit zu sortieren?

  5. Warum liefert xargs -L das richtige Format und xargs -n nicht?

Linux – Wie erhalte ich die Uhrzeit eines laufenden Prozesses?

Wie erhalte ich die Startzeit eines lang andauernden Linux-Prozesses?

Wie erhalte ich die Liste der abhängigen untergeordneten Bilder in Docker?

Warum führt das Forking meines Prozesses dazu, dass die Datei unendlich gelesen wird?

Wie kann ich die Uhrzeit eines laufenden Prozesses abrufen?

Wie erhalte ich die PID eines Prozesses und rufe im Shell-Skript kill -9 darauf auf?