首页 > 代码库 > 练习一下linux中的list函数。

练习一下linux中的list函数。

所有的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  10 static inline void INIT_LIST_HEAD(struct list_head *list) 11 { 12  list->next = list; 13  list->prev = list; 14 } 15  16 static inline void __list_add(struct list_head *new, 17          struct list_head *prev, 18          struct list_head *next) //ËüÖ»Êǽ«newÌí¼Óµ½prevºÍnextÖ®¼ä 19 { 20  next->prev = new; 21  new->next = next; 22  new->prev = prev; 23  prev->next = new; 24 } 25  26 static inline void list_add_tail(struct list_head *new, struct list_head *head) 27 { 28  __list_add(new, head->prev, head); 29 } 30  31 static inline int list_empty(const struct list_head *head) 32 { 33  return head->next == head; 34 } 35  36  37 #undef offsetof 38 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 39  40 /** 41  *  * container_of - cast a member of a structure out to the containing structure 42  *   * @ptr:        the pointer to the member. 43  *    * @type:       the type of the container struct this is embedded in. 44  *     * @member:     the name of the member within the struct. 45  *      * 46  *       */ 47 #define container_of(ptr, type, member) ({                       48         const typeof( ((type *)0)->member ) *__mptr = (ptr);     49         (type *)( (char *)__mptr - offsetof(type,member) );}) 50  51  52 #define list_entry(ptr, type, member)  53         container_of(ptr, type, member) 54  55  56 /** 57  *  * list_for_each_entry  -       iterate over list of given type 58  *   * @pos:        the type * to use as a loop cursor. 59  *    * @head:       the head for your list. 60  *     * @member:     the name of the list_struct within the struct. 61  *      */ 62 #define list_for_each_entry(pos, head, member)                           63         for (pos = list_entry((head)->next, typeof(*pos), member);       64              &pos->member != (head);     65              pos = list_entry(pos->member.next, typeof(*pos), member)) 66  67 #define list_for_each(pos, head)  68         for (pos = (head)->next; pos != (head); pos = pos->next) 69  70  71 struct devlist { 72         struct list_head        list; 73         char * name; 74 }; 75  76 struct devlist dev0 = { 77         .list = LIST_HEAD_INIT(dev0.list), 78         .name = NULL, 79 }; 80  81 void main(void) { 82     struct list_head *l; 83     struct devlist * pdev = NULL;  84     int empty = list_empty(&dev0.list); 85     if(empty) 86         printf("the device list is empty!\n");  87     struct devlist dev1;  88     dev1.name = "device1"; 89     list_add_tail(&dev1.list, &dev0.list); 90     struct devlist dev2 = {{}, "device2"}; 91     // dev2.name = "device2"; 92     list_add_tail(&dev2.list, &dev0.list); 93  94     empty = list_empty(&dev0.list); 95     if(!empty) 96         printf("the device list is not empty!\n");  97       98     list_for_each(l, &dev0.list) { 99             pdev = list_entry(l, struct devlist, list);100             printf("the device name is %s\n", pdev->name); 101     }102 }

 

输出结果:

1 $ gcc -o list list.c2 $ ./list 3 the device list is empty!4 the device list is not empty!5 the device name is device16 the device name is device2

 

练习一下linux中的list函数。