#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. Да, я обнаружил, что это именно та проблема! Спасибо 🙂