Teilen eines Codebeispiels zur Kernel-verknüpften Liste in Linux

黄舟
Freigeben: 2017-08-08 11:48:54
Original
1660 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich relevante Informationen zur detaillierten Erläuterung von Beispielen für verknüpfte Kernellisten unter Linux vorgestellt. In verknüpften Listen sind im Allgemeinen Initialisierung, Einfügen, Löschen, Anzeigen, Freigeben von verknüpften Listen und Knotensuche erforderlich Zur folgenden ausführlichen Erläuterung der Kernel-Linked-List-Beispiele im Linux-Betrieb werde ich im Folgenden eine kurze Einführung in diese Vorgänge geben. Aufgrund meiner mangelnden Kenntnisse kann es sein, dass ich einige Dinge nicht tief genug verstehe, was zu bestimmten Fehlern führen kann an andere Blogger.

A. Mehrere Hauptfunktionen in der verknüpften Liste des Linux-Kernels (der Quellcode im Kernel wird unten angezeigt, damit jeder ihn analysieren kann)

1) Initialisierung:

2) Schwanzeinführung:


#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)  // ptr为struct list_head,其中包括两个指针next和prev,这里已经可以看出内核链表是双向循环链表
Nach dem Login kopieren
3) Kopfeinführungsfunktion


static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
} //尾部插入,传入的参数是新节点中的两个指针和头结点中的两个指针
Nach dem Login kopieren
4) Funktion „Knoten löschen“


static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
} //头插入函数,传入的参数是新节点中的两个指针和头结点中的两个指针
Nach dem Login kopieren
5) Anzeigefunktion (wenn Sie die Informationen in der verknüpften Liste ausdrucken möchten, Sie müssen es selbst als Druckfunktion schreiben, z. B. printf, da dies tatsächlich eine Durchlauffunktion ist und keine Anzeigefunktion hat)


static inline void list_del(struct list_head *entry)  //传入要删除节点中的指针域
{
__list_del(entry->prev, entry->next);//两个参数分别为所删除节点前一个节点和后一个节点
entry->next = (void *) 0;//删除节点后置为空
entry->prev = (void *) 0;
}
Nach dem Login kopieren
6) Löschen Sie die verknüpfte Liste


#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))

/* 这个函数用于遍历链表
pos为节点指针,
head是头结点中的两个指针的地址
member为各节点中的指针域
*/
Nach dem Login kopieren
7) Knoten finden (dies ist auch die Traversalfunktion im Kernel)


#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)

//这里面的pos和n都是list_head指针,n指针是用于在删除时不让链表断链
Nach dem Login kopieren

B. Weiter Ein Code, der Ihnen zeigt, wie Sie ihn verwenden


#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonTeilen eines Codebeispiels zur Kernel-verknüpften Liste in Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage