当前位置: 技术问答>linux和unix
函数中的函数?
来源: 互联网 发布时间:2016-04-11
本文导语: static struct scull_dev *scull_c_lookfor_device(uid_t key) { struct scull_listitem *lptr; list_for_each_entry(lptr, &scull_c_list, list) { if (lptr->key == key) return &(lptr->device); } /* not found */ lptr = kmalloc(sizeof(struct scull_listitem), GFP_KERNEL); if...
这个是 设备驱动开发 第三版 其中 实现 虚拟设备拷贝的其中一段代码~~
static struct scull_dev *scull_c_lookfor_device(uid_t key)
{
struct scull_listitem *lptr;
list_for_each_entry(lptr, &scull_c_list, list) {
if (lptr->key == key)
return &(lptr->device);
}
/* not found */
lptr = kmalloc(sizeof(struct scull_listitem), GFP_KERNEL);
if (!lptr)
return NULL;
/* initialize the device */
memset(lptr, 0, sizeof(struct scull_listitem));
lptr->key = key;
scull_trim(&(lptr->device)); /* initialize it */
init_MUTEX(&(lptr->device.sem));
/* place it in the list */
list_add(&lptr->list, &scull_c_list);
return &(lptr->device);
}
/*
list_for_each_entry 这一句怎么理解 ?
函数?宏?
|
直接看这本书(LDD3)的 " 11.5. Linked Lists "
Linux的链表有它的巧妙之处,你可以看到list_head结构里没有包含任何私有数据类型。
而是通过在某个用户的struct里包含 struct list_head变量,然后通过container_of
来找到list上的用户的struct。
#define list_entry(ptr, type, member)
container_of(ptr, type, member)
而container_of的实现利用编译器的特性。
你可以参考这里。
http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html
Linux的链表有它的巧妙之处,你可以看到list_head结构里没有包含任何私有数据类型。
而是通过在某个用户的struct里包含 struct list_head变量,然后通过container_of
来找到list上的用户的struct。
#define list_entry(ptr, type, member)
container_of(ptr, type, member)
而container_of的实现利用编译器的特性。
你可以参考这里。
http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。