• 【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_list的情况下,如何打印出所有input_handler对象的name成员?

    方法一

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

    struct list_head *pos;    // 接收遍历到的当前节点
    struct list_head *tmp;    // 临时变量
    list_for_each_safe(pos, tmp, &input_handler_list);
    
    • 1
    • 2
    • 3

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

    struct input_handler *item;
    item = list_entry(pos, struct input_handler, node);
    
    • 1
    • 2

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

    pr_info("handler name: %s\n", item->name);
    
    • 1

    方法二

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

    struct input_handler *item;
    list_for_each_entry(item, &input_handler_list, node) {
    		pr_info("handler name: %s\n", item->name);
    }
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    python大数据毕业设计选题题目大全
    【微信小程序】无纸化会议OA系统之首页搭建
    Aptos 域名服务 (ANS) 上线主网
    【Vue】了解这些类和样式绑定就够了!
    .NET Core 读取配置技巧 - IOptions<TOptions> 接口
    如何寻找Springboot自动装配的实现
    LeetCode - 547 省份数量
    拓扑排序求最长路
    PR-视频加介绍背景
    Linux开发工具之编译器gcc/g++
  • 原文地址:https://blog.csdn.net/rentong123/article/details/132228762