Ядро: как перебрать детей текущего процесса? - PullRequest
5 голосов
/ 21 ноября 2011

В Linux Kernel Development, 3-е издание, этот код был дан для обхода дочерних элементов текущего процесса.

list_for_each(list, &current->children) {
    task = list_entry(list, struct task_struct, sibling);
    /* task now points to one of current’s children */
}

«Брат и сестра» в этой идиоме выглядят неуместно. Какова его цель?

Ответы [ 3 ]

8 голосов
/ 21 ноября 2011

sibling - это имя структуры list_head в struct task_struct, которая соответствует списку дочерних элементов родителя.

То есть в этом цикле list всегда указывает на член siblingstruct task_struct или children члена родительского элемента.

1 голос
/ 21 ноября 2011

sibling - это поле в task_struct.

0 голосов
/ 15 марта 2015

Вот как я понял это:

Списки всегда указывают на sibling член,

1) При переборе списка children мы пересекаем sibling членов текущегодочерние элементы задачи

2) Итерация списка sibling приведет к обходу sibling членов дочерних элементов родителя (или братьев и сестер текущей задачи)

Использование элемента sibling для добавления в список родителей обеспечиваетсписки - родительский список children и текущий список задач sibling - обновляются одним и тем же членом.

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