linux内核链表

2012年5月11日  星期五
 
 今天仔细看了下linux内核链表的结构,将遍历链表弄清楚了。
 在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。遍历链表的主要作用是获取数据结构并且进行期望的操作。
 
list_entry(ptr,type,member)其中ptr是指向该数据结构中list_head成员的指针,也就是存储在链表中的地址值,type是数据项的类型,member则是数据项类型定义中list_head成员的变量名,而返回值既是数据结构的指针。

#define list_for_each(pos, head) \
 for (pos = (head)->next, prefetch(pos->next); pos != (head); \
         pos = pos->next, prefetch(pos->next))
上面定义中的prefetch可以无视,提升速度用的。可以看出list_for_each就是遍历整个链表的,他是和list_entry配合使用的,比如:
  ……
struct list_head *i;
……
 list_for_each(i, &nf_sockopts) {
  struct nf_sockopt_ops *ops = list_entry(i, struct nf_sockopt_ops, list);

  ……
 }
 
而以上两者的结合就产生了 list_for_each_entry(pos, head, member) 这里的pos是数据结构指针类型,而不是(struct list_head *),所以返回的数据结构指针直接赋值给了pos,比如下面这个例子
  list_for_each_entry(adapter, &adapters,     list) {  
                     //调用探测函数
                     //从这里可以看出,这个函数的作用是探测驱动属于哪一个适配器的
                     driver->attach_adapter(adapter);
              }

你可能感兴趣的:(linux内核链表)