обход задачи__-> детей в ядре Linux - PullRequest
4 голосов
/ 18 сентября 2009

Я пытаюсь просмотреть дочерние элементы task_struct в ядре linux и получить информацию от дочерних элементов. У меня проблемы со всей информацией, поэтому давайте для простоты оставим ее наготове.

Это релевантная часть моего кода.

struct list_head * p;
struct task_struct ts, *tsk;
pid_t tmp_pid;
INIT_LIST_HEAD(&ts.children);

current = tsk;

list_for_each(p, &(tsk->children)){
     ts = *list_entry(p, struct task_struct, children);
     tmp_pid = ts.pid;
     printk("the pid is %d\n", tmp_pid);
}

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

Это должно распечатать все дочерние PID, вместо этого я всегда получаю одно и то же число -17 .... оно порядка 10 ^ 9 или 10 ^ 11.

Может кто-нибудь помочь мне здесь? компиляция занимает около 30 минут, так что пробовать журнал разных вещей на самом деле не вариант.

Ответы [ 2 ]

7 голосов
/ 22 сентября 2009

Вы должны использовать

list_entry(p, struct task_struct, sibling);

Не

list_entry(p, struct task_struct, children);

Но, кроме того, вы должны заблокировать tasklist_lock, когда проходите через детей.

0 голосов
/ 18 сентября 2009

Назначение tsk в неправильном направлении. текущий содержит, ну, текущее задание; чтобы инициализировать tsk, вам нужно написать

tsk = current;

FWIW, вам следует избегать копирования структур. Так что в цикле, сделайте

tsk = list_entry(p, struct task_struct, children);

назначая указатель задачи, а не копируя всю структуру задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...