Skip to content
Yue Du edited this page Oct 16, 2015 · 1 revision

Hi,

slides 内容贴在 wiki 上了 [0],pdf 文件传到 groups 里了 [1].

关于 list_for_each 没有访问链表头的问题,确实是这样的,第一个成员没有存 储内容。有的链表好像是用 LIST_HEAD 来声明链表头的,这样就不会浪费空间 了。[2]

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

扩展阅读: [2](里边还也讲了 list_entry, container_of), [3] 关于 size_t

[0]. http://beihang-osc.org/index.php?title=2010_%E5%B9%B4_4_%E6%9C% 88\_16_%E5%8F%B7%E6%B4%BB%E5%8A%A8 [已经无效]_

[1]. https://beihang-open-source-club.googlegroups.com/web/2010-04-16--lis... 复制到了这里

[2] http://kernelnewbies.org/FAQ/LinkedLists

[3] http://www.google.com/url?sa=D&q=http://stackoverflow.com/questions/2599974/why-are-function-parameters-of-type-size-t&usg=AFQjCNGxMw9wS9lvwC9bYfI6QWwmDVJnBg

链表的表头确实是跟节点不一样的,上边 2 有这样一个例子:

struct mystruct first;
struct mystruct second;

/* 可以看到节点 first/second 都是用于记录数据的 struct mystruct */
/* 而表头,mylinkedlist, 只是一个简单的 struct list_head, 不记录数据 */

LIST_HEAD(mylinkedlist) ;

list_add ( &first.mylist , &mylinkedlist ) ;
list_add ( &second.mylist , &mylinkedlist ) ;

----------------
在 DRM 驱动里边有这样一个例子,

struct drm_device {
        struct list_head filelist;

}

struct drm_file {
        struct list_head lhead;

}

static int drm_open_helper(struct drm_device * dev)
{
        struct drm_file *priv;

        list_add(&priv->lhead, &dev->filelist);

}

struct drm_device 是链表表头,记录关于设备的整体的信息。而这个链表里包含 的普通节点是另外一个类型,struct drm_file。

所以,for_each 中忽略了链表头,是合乎情理的。

Clone this wiki locally