list_for_each_entry_safe 简介

list_for_each_entry_safe 是 Linux 内核中用于遍历链表的一个宏,特别适用于在遍历过程中可能需要删除链表节点的场景。它的设计保证了在删除当前节点时,不会影响后续节点的访问,从而实现安全的遍历。

定义

c 复制代码
#define list_for_each_entry_safe(pos, n, head, member) \
    for (pos = list_entry((head)->next, typeof(*pos), member), \
         n = list_entry(pos->member.next, typeof(*pos), member); \
         &pos->member != (head); \
         pos = n, n = list_entry(n->member.next, typeof(*n), member))

参数说明

  1. pos: 当前遍历到的链表节点对应的结构体指针。
  2. n: 临时指针,用于保存下一个节点的位置。
  3. head: 链表头节点的地址。
  4. member: 链表节点在结构体中的成员名。

工作原理

  • list_for_each_entry_safe 在每次循环中,使用 n 保存当前节点的下一个节点地址。
  • 即使在循环中删除了当前节点(由 pos 指向),由于 n 已经保存了下一个节点的位置,后续遍历可以继续进行而不受影响。

使用场景

主要用于需要在遍历链表的同时删除链表节点的场景。例如:

示例代码:遍历并删除链表节点

c 复制代码
struct my_list {
    int data;
    struct list_head list;
};

struct my_list *pos, *tmp;

// 遍历并删除链表中的所有节点
list_for_each_entry_safe(pos, tmp, &head, list) {
    printk(KERN_INFO "Data: %d\n", pos->data);
    list_del(&pos->list); // 从链表中删除当前节点
    kfree(pos);           // 释放内存
}

示例代码:只遍历链表

如果只是遍历而不删除,可以使用 list_for_each_entry

c 复制代码
struct my_list *pos;

// 遍历链表
list_for_each_entry(pos, &head, list) {
    printk(KERN_INFO "Data: %d\n", pos->data);
}

list_for_each_entry 的区别

  • list_for_each_entry: 用于普通遍历,不支持安全删除操作。
  • list_for_each_entry_safe: 在遍历过程中允许安全地删除当前节点。

总结

list_for_each_entry_safe 是 Linux 内核中处理双向链表的一种高级工具,适合需要在遍历过程中修改或删除链表元素的场景。它通过额外的临时指针确保操作安全,不会破坏链表结构[1][2][3].

Citations:

1\] https://developer.aliyun.com/article/375545 \[2\] https://blog.csdn.net/Wang20122013/article/details/112307416 \[3\] http://www.korantli.com.cn/linux/nei-he-lian-biao/ \[4\] https://www.cnblogs.com/yangguang-it/p/11667772.html \[5\] https://blog.csdn.net/weixin_42645653/article/details/126560076 \[6\] https://www.cnblogs.com/zhoug2020/p/4972923.html \[7\] https://www.51cto.com/article/695735.html \[8\] https://juejin.cn/post/7091220406312370213

相关推荐
专注VB编程开发20年4 分钟前
.NET组件读取压缩包中的内存数据电子表格XLSX文件和图片,不需要解压
linux·服务器·windows·c#·.net·excel·zip
XMZH0304241 分钟前
数据结构:链式队列尝试;0826
数据结构·链表·队列·链式队列
振鹏Dong44 分钟前
Redis核心机制解析:数据结构、线程模型与内存管理策略
数据结构·数据库·redis
SJjiemo1 小时前
FileMenu Tools for Win:突破 Windows 文件管理困境的利器
windows
岁月栖迟7 小时前
leetcode 49. 字母异位词分组
windows·算法·leetcode
7hhhhhhh8 小时前
自学嵌入式第二十六天:数据结构-哈希表、内核链表
数据结构·链表·散列表
3壹11 小时前
单链表:数据结构中的高效指针艺术
c语言·开发语言·数据结构
耳总是一颗苹果13 小时前
排序---插入排序
数据结构·算法·排序算法
YLCHUP13 小时前
【联通分量】题解:P13823 「Diligent-OI R2 C」所谓伊人_连通分量_最短路_01bfs_图论_C++算法竞赛
c语言·数据结构·c++·算法·图论·广度优先·图搜索算法
晴空闲雲14 小时前
数据结构与算法-字符串、数组和广义表(String Array List)
数据结构·算法