Linux核心list head學習(二)

2021-07-24 14:25:12 字數 1973 閱讀 6997

前一篇文章討論了list_head 結構的基本結構和實現原理,本文主要介紹一下例項**。

自己如果想在應用程式中使用list_head 的相應操作(當然應該沒人使用了,c++ stl提供了list 用起來貌似更方便), 在應用程式中需要包含自己的 "list.h" 標頭檔案:

/*

注:這個list.h 是為了配合示例程式而建的,內容來自:linux/include/linux/list.h 和相關檔案

*/#ifndef _linux_list_h

#define _linux_list_h

struct

list_head ;

#define list_head_init(name)

#define offsetof(type, member) ((size_t) &((type *)0)->member)

#define container_of(ptr, type, member) ()

static inline void init_list_head(struct list_head *list)

static inline void __list_add(struct list_head *new

, struct list_head *prev,

struct list_head *next)

static inline void list_add(struct list_head *new, struct list_head *head)

static inline void __list_del(struct list_head * prev, struct list_head *next)

static inline void list_del(struct list_head *entry)

#define prefetch(x) __builtin_prefetch(x)

//注:這裡prefetch 是gcc的乙個優化,也可以不要

#define list_for_each(pos, head) \

for (pos = (head)->next; prefetch(pos->next), pos !=(head); \

pos = pos->next)

#define list_entry(ptr, type, member) \container_of(ptr, type, member)

#endif

寫了乙個簡單的應用程式:

#include "

list.h

"#include

#include

#define max_name_len 32

#define max_id_len 10typedef

struct

stud

num_n_stu;

int main(void

) list_del(&stu_1.list);

return0;

}

在linux核心中可以使用這個以類似驅動模組的形式載入到核心:(這裡就不用使用自定義的list.h了)

#include #include 

#include

module_license(

"gpl");

#define max_name_len 32

#define max_id_len 10typedef

struct

stud

num_n_stu;

static

int my_main(void

)

list_del(&stu_1.list);

return0;

}static

void my_exit(void

)module_init(my_main);

module_exit(my_exit);

Linux 核心list head 學習

在linux核心中,提供了乙個用來建立雙向迴圈鍊錶的結構 list head。雖然linux核心是用c語言寫的,但是list head的引入,使得核心資料結構也可以擁有物件導向的特性,通過使用操作list head 的通用介面很容易實現 的重用,有點類似於c 的繼承機制 希望有機會寫篇文章研究一下c...

Linux 核心list head 學習

在linux核心中,提供了乙個用來建立雙向迴圈鍊錶的結構 list head。雖然linux核心是用c語言寫的,但是list head的引入,使得核心資料結構也可以擁有物件導向的特性,通過使用操作list head 的通用介面很容易實現 的重用,有點類似於c 的繼承機制 希望有機會寫篇文章研究一下c...

Linux 核心list head 學習

linux 核心list head 學習 一 在linux 核心中,提供了乙個用來建立雙向迴圈鍊錶的結構 list head 雖然linux 核心是用 c語言寫的,但是 list head 的引入,使得核心資料結構也可以擁有物件導向的特性,通過使用操作 list head 的通用介面很容易實現 的重...