list_for_each与list_for_each_entry具体解释
一、list_for_each
1.list_for_each原型
#define list_for_each(pos, head) \
for (pos = (head)->next, prefetch(pos->next); pos != (head); \
pos = pos->next, prefetch(pos->next))
它实际上是一个 for 循环。利用传入的pos 作为循环变量,从表头 head開始,逐项向后(next方向)移动 pos ,直至又回到 head (prefetch() 能够不考虑。用于预取以提高遍历速度)。
注意:此宏必要把list_head放在数据结构第一项成员,至此。它的地址也就是结构变量的地址。
2.用法(以訪问当前进程的子进程为例):
struct list_head {
struct list_head *next, *prev;
};
在struct task_struct 中有例如以下定义:
struct list_head children;
所以
struct task_struct *task;
struct list_head *list;
list_for_each(list,¤t->chilidren) {
task = list_entry(list, struct task_struct, sibling);/*task指向当前的某个子进程*/
}
当中用到了函数list_entry():
这个函数的作用在图1中表示就是能够通过已知的指向member子项的指针,获得整个结构体的指针(地址)
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
二、list_for_each_entry:
在Linux内核源代码中,常常要对链表进行操作。当中一个非常重要的宏是list_for_each_entry:
意思大体例如以下:
如果仅仅有两个结点,则第一个member代表head,
list_for_each_entry的作用就是循环遍历每个pos中的member子项。
图1:
pos: pos:
___________ ____________
| |
| |
| |
| |
| ........... | | ................
|
| |
list_for_each与list_for_each_entry具体解释的更多相关文章
- Linux内核分析--内核中的数据结构双向链表续【转】
在解释完内核中的链表基本知识以后,下面解释链表的重要接口操作: 1. 声明和初始化 实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_H ...
- linux内核数据结构学习总结
目录 . 进程相关数据结构 ) struct task_struct ) struct cred ) struct pid_link ) struct pid ) struct signal_stru ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- linux内核链表分析
一.常用的链表和内核链表的区别 1.1 常规链表结构 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- linux 内核分析之list_head
转自:http://www.cnblogs.com/riky/archive/2006/12/28/606242.html 一.链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一 ...
- linux内核中的链表
1.内核中的链表 linux内核链表与众不同,他不是把将数据结构塞入链表,而是将链表节点塞入数据,在2.1内核中引入了官方链表,从此内核中所有的链表使用都采用此链表,千万不要在重复造车轮子了!链表实现 ...
- linux2.6内核链表
一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链 ...
- Linux 内核链表的使用及深入分析【转】
转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...
随机推荐
- linux 服务器部署的web项目存入数据库的时间不正确
在linux获取当前时间 date 获取的时间是正常的 ----- java写了个测试类 public class TestDate { public static void main(String[ ...
- supervisor管理ELK进程
1.配置supervisor #更新epel yum install epel-release yum install python-pip pip install supervisor -p /et ...
- duilib : 滑动显示的窗口实现以及 悬浮窗 (转载)
1. vc 判断窗口是否显示 BOOL IsWindowVisible(HWND hWnd); 2.悬浮窗 http://blog.csdn.net/lincyang/article/details ...
- target='_blank' 安全漏洞
有关 target="_blank" 的安全缺陷 可能大家在写网页的时候经常给超链接加个属性 target="_blank",意思就是在浏览器新的窗口打开此超链 ...
- Linux硬盘扩容(非LVM)
环境说明: 虚拟机:Centos6 [root@elements ~]# cat /etc/redhat-release CentOS release 6.10 (Final) [root@eleme ...
- sql server timeout
SqlConnection.ConnectionTimeout https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sq ...
- 【Java----判断字符串是否乱码】
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChineseUtill { private ...
- 【Dubbo基础】dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- 解决 Faster R-CNN 图片中框不在一张图片上显示的问题
目录 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 如何解决这个问题? 参考issues 解决 Faster R-CNN 图片中框不在一张图片上显示的问题 发现问题 在使 ...
- NOI导刊2009 提高一
zzh大佬给我说导刊的题全是普及难度,然而我..觉得有两道题是提高的 LocalMaxima 题目解析 对于\(i\)这个数,它要想成为LocalMaxima,比它大的要全部放到最后去,比它小的想怎么 ...