【linux内核中的双向链表-02】list_for_each_safe

在前面的文章《linux内核中的双向链表-01》中描述了双向链表的定义以及常用API,其中有个非常重要的宏定义:list_entry(ptr, type, member)。它可以在已知结构体成员地址的情况下,还原出结构体的首地址。

input子系统的事件处理层对应的内核对象为:struct input_handler,input_handler的node成员串在一起,组成了双向链表,表头节点为:input_handler_list。如下图所示:

思考一个问题:在已知input_handler_list的情况下,如何打印出所有input_handler对象的name成员?

方法一

第一步,遍历以input_handler_list为头节点的双向链表,则每一个节点都是struct list_head node结构,我们定义一个变量pos来接收。遍历双向链表可以使用内核API:list_for_each_safe()。则:

c 复制代码
struct list_head *pos;    // 接收遍历到的当前节点
struct list_head *tmp;    // 临时变量
list_for_each_safe(pos, tmp, &input_handler_list);

第二步,根据获取到的struct list_head node成员,求出其所在的input_handler结构体的首地址,并定义一个变量item来接收。通过成员地址求所在结构体首地址的内核API:list_entry()。则:

c 复制代码
struct input_handler *item;
item = list_entry(pos, struct input_handler, node);

第三步,打印各个input_handler对象的name属性:

c 复制代码
pr_info("handler name: %s\n", item->name);

方法二

直接使用内核API:list_for_each_entry(),其等效于先使用list_for_each_safe()获得各个结构体成员,再使用list_entry()获取各个结构体首地址。

c 复制代码
struct input_handler *item;
list_for_each_entry(item, &input_handler_list, node) {
		pr_info("handler name: %s\n", item->name);
}
相关推荐
音程2 分钟前
使用Python的subprocess执行另外一个python文件(应用之一是Pytorch中如何让多个不同的模型同时/并行进行训练)
linux·服务器·python
stxinu14 分钟前
调试LTE模块碰到的4字节对齐问题
linux·kernel·4字节对齐
你有带摩拉吗?20 分钟前
把任务管理器里面的vmware usb arbitrition停了,虚拟机一直识别不到手机设备了
linux·运维·服务器
秋风起,再归来~28 分钟前
【Linux庖丁解牛】—Linux基本指令(上)!
linux·指令
钡铼技术物联网关1 小时前
智能新突破:AIOT 边缘计算网关让老旧水电表图像识别
linux·运维·服务器·arm开发·ai·自动化
A ?Charis5 小时前
Cilium + ebpf 系列文章-什么是ebpf?(一)
linux
2301_783856005 小时前
Linux Kernel Makefiles 编译标志详解
linux·运维·服务器
l1o3v1e4ding7 小时前
解决【WVP服务+ZLMediaKit媒体服务】加入海康摄像头后,能发现设备,播放/点播失败,提示推流超时!
java·linux·音视频·实时音视频·视频编解码
Yz98768 小时前
使用sqoop报错
大数据·linux·数据库·hadoop·apache·big data·sqoop
Saindy58289 小时前
Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题
linux·交互·复制·覆盖·cp -f