обход task_struct-> дочерних элементов в ядре Linux
-
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);
назначая указатель задачи, а не копируя всю структуру задачи.