linux 内核 中链表list

这个结构从list.h 移到了types.h, 可见内核对循环链表的重视

include/linux/types.h中定义

struct list_head {
        struct list_head *next, *prev;
};

 

include/linux/list.h 中的宏

 

初始化 一个叫name的链表节点

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
        struct list_head name = LIST_HEAD_INIT(name)

eg:

 

typdef struct  list_tag {

  struct list_head _list;

  int element;

  int other;

} xxx_list_t;

 

int main( void )

{

  xxx_list_t l = {

    ._list = LIST_HEAD_INIT( l._list ),

    .element = 1,

    .other = 2,

  };

}

 

 #define INIT_LIST_HEAD(ptr) do { \
 (ptr)->next = (ptr); (ptr)->prev = (ptr); \
 }

变成了

 static inline void INIT_LIST_HEAD(struct list_head *list)
 {  
   list->next = list;
   list->prev = list;
 }

 

不知还在哪里使用:

 #define LIST_HEAD(name) \ 
          struct list_head name = LIST_HEAD_INIT(name) 
定义一个头, 没有其他数据部分
xxxx_head
  next ------------------------>
  prev ------------------------>



#define list_entry(ptr, type, member) \ 
         container_of(ptr, type, member)
的作用是:

返回指针
---->struct {

   ptr----> list
    ...
}

即根据ptr 是那个结构struct 中的 那个成员可以得出这个包含它的结构体指针
这其中使用到了 typeof (根据一个变量返回一个 ‘类型‘)


 

 

 

 

linux 内核 中链表list,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。