当前位置: 首页 > news >正文

list_for_each_entry_safe 简介

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

定义

#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 已经保存了下一个节点的位置,后续遍历可以继续进行而不受影响。

使用场景

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

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

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

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

相关文章:

  • AUTOGPT:基于GPT模型开发的实验性开源应用程序; 目标设定与分解 ;;自主思考与决策 ;;信息交互与执行
  • Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行
  • 云计算实训室解决方案(2025年最新版)
  • C++ 设计模式-建造者模式
  • 深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
  • MySQL调用存储过程和存储函数
  • win10中mstsc远程Centos-Stream 9图形化界面
  • 简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标
  • 朝天椒USB服务器:解决加密狗远程连接
  • 软件工程-软件设计
  • Docker 部署 MySQL-5.7 单机版
  • 浏览器网络请求全流程深度解析
  • 网络协议/MQTT Paho.MQTT客户端库接口基础知识
  • 伺服报警的含义
  • win11 终端乱码导致IDE 各种输出也乱码
  • 《手札·行业篇》开源Odoo MES系统与SKF Observer Phoenix API在化工行业的双向对接方案
  • 腾讯云服务器中Ubuntu18.04搭建python3.7.0与TensorFlow1.15.0与R-4.0.3环境
  • Unity使用iTextSharp导出PDF-01准备dll
  • 【Linux】smp_mb__after_atomic
  • 从零到一:基于Rook构建云原生Ceph存储的全面指南(下)
  • 有几个网站如何做外贸/南昌网站建设
  • b2b网站怎么做优化/杭州seo搜索引擎优化公司
  • 有哪些做的好看的网站吗/谷歌搜索引擎免费入口 台湾
  • 高端品质网站建设/小程序制作
  • 盐城专业做网站的公司哪家好/友情链接交换源码
  • asp网站服务建设/网站收录网