GNU/Linux >> Linux Esercitazione >  >> Linux

perché l'elenco di fratelli viene utilizzato per ottenere task_struct durante il recupero dei figli di un processo

Per organizzare i dati come lista collegata usando struct list_head devi dichiarare list root e dichiarare la voce dell'elenco per il collegamento. Entrambe le voci radice e figlio sono dello stesso tipo (struct list_head ). children voce di struct task_struct la voce è un root . sibling voce di struct task_struct è un list entry . Per vedere le differenze, devi leggere il codice, dove children e sibling sono usati. Utilizzo di list_for_each per children significa cosa children è un root . Utilizzo di list_entry per sibling significa cosa sibling è un list entry .

Puoi leggere di più sugli elenchi dei kernel Linux qui.

Domanda :Qual è il motivo per cui stiamo passando "sibling" qui che alla fine un elenco diverso con offset diverso?

Risposta:

Se l'elenco è stato creato in questo modo:

list_add(&subtask->sibling, &current->children);

Di

list_for_each(list, &current->children)

Inizializzerà i puntatori di elenco a sibling , quindi devi usare subling come parametro per list_entry. Ecco come il kernel Linux elenca le API progettate.

Ma, se l'elenco è stato creato in un altro (errato ) modo:

list_add(&subtask->children, &current->sibling);

Quindi devi iterare l'elenco in questo modo (sbagliato ) modo:

list_for_each(list, &current->sibling)

E ora devi usare children come parametro per list_entry .

Spero, questo aiuta.


Di seguito la rappresentazione pittorica che potrebbe aiutare qualcuno in futuro. La casella in alto rappresenta un genitore, e le due caselle in basso sono i suoi figli


Ecco un'immagine in aggiunta alle risposte precedenti. Lo stesso processo può essere sia genitore che figlio (come Genitore1 nell'immagine) e dobbiamo distinguere tra questi due ruoli.

Intuitivamente, se children di Parent0 punterebbe a children di Parent1, quindi Parent0.children.next->next (cerchio verde sull'immagine), che è lo stesso di Parent1.children.next , indicherebbe un figlio di Parent1 invece di un figlio successivo di Parent0.


Linux
  1. Grep:perché le parentesi nel modello Grep rimuovono il processo Grep dai risultati di Ps?

  2. Linux:perché gli utenti Linux non utilizzano una chiamata di sistema per ottenere l'ora corrente?

  3. Linux:come ottenere l'ora dell'orologio da parete di un processo in esecuzione?

  4. Quale comando viene utilizzato per ordinare l'elenco di file/cartelle in base all'ora?

  5. Perché xargs -L produce il formato corretto, mentre xargs -n no?

Come ottenere l'ora di inizio di un processo Linux di lunga durata?

Come faccio a far funzionare in background il mio server web Golang?

Come ottenere il codice di uscita del processo generato nello script di shell atteso?

Come ottenere l'elenco delle immagini figlie dipendenti in Docker?

Come ottenere il pid di un processo e invocare kill -9 su di esso nello script della shell?

come ottenere un elenco dei client wifi connessi in OpenWrt 10.03?