Путаница в отношении дочерних элементов list_head ядра Linux

#linux #process #kernel

#linux #процесс #ядро

Вопрос:

Я хочу обойти все процессы и попытаться показать pid, ppid, pid первых дочерних элементов, а также pid следующего родственного элемента каждого процесса. Похоже, что некоторые дочерние pid, показанные в моем результате теста, неверны.

введите описание изображения здесь

Например, процесс 3,4,5, …,16,17, .. все дочерние элементы процесса 2. Но из данных также видно, что процесс 4,5,14,18 .. их первый дочерний элемент относится к процессу 16!

Мой код прилагается здесь:

 struct prinfo p;

p.state = t->state;     /* get state */
p.pid = t->pid;     /* get pid */
p.parent_pid = t->parent->pid; /* get parent pid */

struct list_head *chd;  /* get first child_task */
chd = amp;(t->children);
struct task_struct *child_task;
child_task = list_entry(chd->next, struct task_struct, sibling);
p.first_child_pid = child_task->pid; 

struct list_head *sbl; /* get next sibling_task */
sbl = amp;(t->sibling);
struct task_struct *sibling_task;
sibling_task = list_entry(sbl->next, struct task_struct, sibling);
p.next_sibling_pid = sibling_task->pid; 

p.uid = t->cred->uid;  /* get uid */
  

Кто-нибудь может мне здесь помочь?

Комментарии:

1. Перед его использованием вы должны проверить, не childred является ли list пустым ( list_empty(chd) ) . Попытка разыменования элементов пустого списка приводит к неопределенному поведению , поэтому он может показывать что угодно (или просто crach).

2. Да, я обнаружил, что это именно та проблема! Спасибо 🙂