Чей адрес должен хранить узел связанного списка: другой узел или структура данных, имеющая узел в качестве поля? - PullRequest
0 голосов
/ 17 сентября 2018

С Понимание ядра Linux :

ядро ​​Linux определяет структуру данных list_head, единственные поля next и prev которой представляют прямой и обратный указатели универсального двусвязного указателяэлемент списка соответственно.Однако важно отметить, что указатели в поле list_head хранят адреса других полей list_head , а не адреса всех структур данных, в которые включена структура list_head ;см. Рисунок 3-3 (a).

enter image description here

Почему указатели в поле list_head хранят адреса других полей list_head, а неадреса целых структур данных, в которые включена структура list_head?

Учитывая указатель на объект list_head, как я могу получить объект структуры данных (такой как «структура данных 1»), которая содержит объект list_head?Например, Как я могу получить дескриптор процесса из PID в ядре Linux?

Если бы он был на языке OO, то поля list_head, вероятно, были бы частными в данныхструктуры, в которые включена структура list_head?Так что более разумно, чтобы указатели в поле list_head хранили адреса целых структур данных, в которые включена структура list_head, чем адреса других полей list_head?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Почему указатели в поле list_head хранят адреса других поля list_head, а не адреса целых данных структуры, в которые включена структура list_head?

Потому что это логически правильно и проще в реализации. Вам не нужно знать тип, чтобы перебрать список. Также заголовок списка не встроен ни в одну структуру. На что он должен указывать, когда список пуст?

Учитывая указатель на объект list_head, как я могу получить объект структура данных (например, «структура данных 1»), которая содержит объект list_head?

Использование макроса container_of .

0 голосов
/ 17 сентября 2018

list_head сохраняет указатель на следующий / предыдущий список узлов. Одна структура данных может быть помещена в более чем один список с использованием более одного list_head элементов в нем. Код обработки «знает», какой из этих элементов помещен в данный список, и может восстановить указатель на структуру данных из указателя на узел, используя list_entry.

...