обход task_struct-> дочерних элементов в ядре Linux

StackOverflow https://stackoverflow.com/questions/1446239

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

list_entry(p, struct task_struct, sibling);

Нет

list_entry(p, struct task_struct, children);

Ho и еще, вам следует заблокировать tasklist_lock, когда вы просматриваете список детей.

Другие советы

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

tsk = current;

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top