GNU/Linux >> Tutoriels Linux >  >> Linux

pourquoi la liste des frères et sœurs est utilisée pour obtenir le task_struct lors de la récupération des enfants d'un processus

Afin d'organiser les données sous forme de liste liée à l'aide de struct list_head vous devez déclarer la racine de la liste et déclarer entrée de liste pour l'attelage. Les entrées racine et enfant sont du même type (struct list_head ). children saisie de struct task_struct l'entrée est un root . sibling saisie de struct task_struct est un list entry . Pour voir les différences, vous devez lire le code, où children et sibling sont utilisés. Utilisation de list_for_each pour children signifie quoi children est un root . Utilisation de list_entry pour sibling signifie quoi sibling est un list entry .

Vous pouvez en savoir plus sur les listes de noyau Linux ici.

Question :Quelle est la raison pour laquelle nous passons "frère" ici qui finit par une liste différente avec un décalage différent ?

Réponse :

Si la liste a été créée de cette façon :

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

Que

list_for_each(list, &current->children)

Initialisera les pointeurs de liste à sibling , vous devez donc utiliser subling comme paramètre de list_entry. C'est comment le noyau Linux répertorie l'API conçue.

Mais, si la liste a été créée dans un autre (faux ) manière :

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

Que vous devez itérer la liste ceci (faux ) manière :

list_for_each(list, &current->sibling)

Et maintenant, vous devez utiliser children comme paramètre pour list_entry .

J'espère que cela aide.


Voici la représentation picturale qui pourrait aider quelqu'un à l'avenir. La case du haut représente un parent et les deux cases du bas sont ses enfants


Voici une image en plus des réponses précédentes. Le même processus peut être à la fois un parent et un enfant (comme Parent1 sur l'image), et nous devons faire la distinction entre ces deux rôles.

Intuitivement, si children de Parent0 pointerait vers children de Parent1, puis Parent0.children.next->next (cercle vert sur l'image), qui équivaut à Parent1.children.next , pointerait vers un enfant de Parent1 au lieu d'un enfant suivant de Parent0.


Linux
  1. Pourquoi `while Ifs=Read` est-il utilisé si souvent, au lieu de `ifs=; Pendant la lecture..` ?

  2. Pourquoi le mécanisme de création de processus par défaut est-il un fork ?

  3. Quelle commande est utilisée pour trier la liste des fichiers/dossiers par heure ?

  4. Pourquoi xargs -L produit-il le bon format, alors que xargs -n ne le fait pas ?

  5. Comment obtenir l'ID de processus pour tuer un processus nohup ?

Comment puis-je faire fonctionner mon serveur Web Golang en arrière-plan ?

Comment obtenir le code de sortie du processus généré dans le script shell attendu ?

Comment obtenir la liste des images enfants dépendantes dans Docker ?

Pourquoi la bifurcation de mon processus entraîne-t-elle la lecture infinie du fichier

Comment puis-je obtenir l'heure de l'horloge murale d'un processus en cours d'exécution ?

Comment obtenir le pid d'un processus et invoquer kill -9 dessus dans le script shell ?