2009-09-18 3 views
3

Я пытаюсь пересечь дочерние объекты task_struct в ядре linux и получать информацию от детей. У меня возникли проблемы со всей информацией, поэтому давайте просто держим его за получение pid для простоты.traversing task_struct-> children in linux kernel

Это часть моего кода.

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 минут, поэтому попытка журнала разных вещей на самом деле не является вариантом.

+0

Вы должны действительно изменить свой вопрос, чтобы опубликовать реальный образец кода, который демонстрирует проблему, а не реконструкцию. – caf

ответ

7

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

list_entry(p, struct task_struct, sibling); 

Не

list_entry(p, struct task_struct, children); 

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

+2

Вы должны использовать list_for_each_entry(). – mpe

0

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

tsk = current; 

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

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

oh whoops - игнорировать обратное текущее/tsk назначение. В моем реальном коде, который является коротким. – devin

+0

Итак, это означает, что ваша проблема все еще не решена? – DigitalRoss

+0

Да, я еще не понял. – devin