所有的list函数见 include/linux/list.h
自己从 include/linux/list.h 拷贝了一些函数到自己的list.c中, 然后练习了一下。
没有别的目的,就是想熟练一下。毕竟linux内核代码中试用了大量的list函数。
list的函数太方便使用了。
文件:list.c
1 #include <stdio.h> 2 // #include <linux/list.h> 3 4 struct list_head { 5 struct list_head *next, *prev; 6 }; 7 8 #define LIST_HEAD_INIT(name) { &(name), &(name) } 9 #define LIST_HEAD(name) 10 struct list_head name = LIST_HEAD_INIT(name) 11 12 static inline void INIT_LIST_HEAD(struct list_head *list) 13 { 14 list->next = list; 15 list->prev = list; 16 } 17 18 static inline void __list_add(struct list_head *new, 19 struct list_head *prev, 20 struct list_head *next) //ËüÖ»Êǽ«newÌí¼Óµ½prevºÍnextÖ®¼ä 21 { 22 next->prev = new; 23 new->next = next; 24 new->prev = prev; 25 prev->next = new; 26 } 27 28 static inline void list_add_tail(struct list_head *new, struct list_head *head) 29 { 30 __list_add(new, head->prev, head); 31 } 32 33 static inline int list_empty(const struct list_head *head) 34 { 35 return head->next == head; 36 } 37 38 39 #undef offsetof 40 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 41 42 /** 43 * * container_of - cast a member of a structure out to the containing structure 44 * * @ptr: the pointer to the member. 45 * * @type: the type of the container struct this is embedded in. 46 * * @member: the name of the member within the struct. 47 * * 48 * */ 49 #define container_of(ptr, type, member) ({ 50 const typeof( ((type *)0)->member ) *__mptr = (ptr); 51 (type *)( (char *)__mptr - offsetof(type,member) );}) 52 53 54 #define list_entry(ptr, type, member) 55 container_of(ptr, type, member) 56 57 58 /** 59 * * list_for_each_entry - iterate over list of given type 60 * * @pos: the type * to use as a loop cursor. 61 * * @head: the head for your list. 62 * * @member: the name of the list_struct within the struct. 63 * */ 64 #define list_for_each_entry(pos, head, member) 65 for (pos = list_entry((head)->next, typeof(*pos), member); 66 &pos->member != (head); 67 pos = list_entry(pos->member.next, typeof(*pos), member)) 68 69 #define list_for_each(pos, head) 70 for (pos = (head)->next; pos != (head); pos = pos->next) 71 72 73 struct devlist { 74 struct list_head list; 75 char * name; 76 }; 77 78 struct devlist dev0 = { 79 .list = LIST_HEAD_INIT(dev0.list), 80 .name = NULL, 81 }; 82 83 /* static initiate head list*/ 84 // LIST_HEAD(hl); 85 struct list_head hl = LIST_HEAD_INIT(hl); 86 87 void main(void) { 88 /* dynamic initiate head list. */ 89 INIT_LIST_HEAD(&hl); 90 struct list_head *l; 91 struct devlist * pdev = NULL; 92 int empty = list_empty(&hl); 93 if(empty) 94 printf("the device list is empty! "); 95 struct devlist dev1; 96 dev1.name = "device1"; 97 list_add_tail(&dev1.list, &hl); 98 struct devlist edev1 = {{}, "entry device1"}; 99 list_add_tail(&edev1.list, &dev0.list); 100 struct devlist dev2 = {{}, "device2"}; 101 list_add_tail(&dev2.list, &hl); 102 struct devlist edev2 = {{}, "entry device2"}; 103 list_add_tail(&edev2.list, &dev0.list); 104 105 empty = list_empty(&hl); 106 if(!empty) 107 printf("the device list is not empty! "); 108 109 list_for_each_entry(pdev, &dev0.list, list){ 110 printf("the device name is %s ", pdev->name); 111 } 112 113 list_for_each(l, &hl) { 114 // for (l = (&hl)->next; l != (&hl); l = l->next){ 115 // printf("l is: %p, head is: %p ", l, &hl); 116 pdev = list_entry(l, typeof(dev0), list); 117 printf("the device name is %s ", pdev->name); 118 } 119 }
输出结果:
1 $ ./list 2 the device list is empty! 3 the device list is not empty! 4 the device name is entry device1 5 the device name is entry device2 6 the device name is device1 7 the device name is device2