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,这里已经可以看出内核链表是双向循环链表
static inline void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } //尾部插入,传入的参数是新节点中的两个指针和头结点中的两个指针
static inline void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } //头插入函数,传入的参数是新节点中的两个指针和头结点中的两个指针
static inline void list_del(struct list_head *entry) //传入要删除节点中的指针域 { __list_del(entry->prev, entry->next);//两个参数分别为所删除节点前一个节点和后一个节点 entry->next = (void *) 0;//删除节点后置为空 entry->prev = (void *) 0; }
#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为各节点中的指针域 */
#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指针是用于在删除时不让链表断链
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))
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!