linux中的list.h(2)

Linux内核链表(list)移植到任意平台 linux内核链表在文件中,内核中实现的链表比较简洁,实用性很强,因此想把它单独移植出来使用。内核中的代码只能使用编译器编译,编译器编译是会报错的,主要是因为这个宏是gnuc特有的扩展,stdc中没有此扩展。本篇文章就是来解决这个问题的,移植得到一个在stdc下运行的list,方便其他平台使用。 修改并添加了以下宏,改完后可以在stdc下编译: 1、和。 2、,去除了的使用。 -3、删除所有使用的定义,将以下代码删除: 至此,移植完成。 四、使用方法 4.1、初始化链表 或 阅读详情

相关博文:
linux中的list.h(1) ——>内核链表简介,list_entry()方法。

依靠list_entry()方法,内核提供了创建/操作以及其他链表管理的各种例程,而所有这些方法都不需要知道list_head所嵌入对象的数据结构。

linux中的list.h(3) ——>内核链表的增加、删除、遍历

linux内核中链表的创建

linux内核中的双链表操作非常经典。为了加深对代码的理解,我将在用户态下对里面的内容进行一些实现。
注意list.h是在内核态中用的,在用户态直接#include <linux/list.h>是不行的。不过,虽然list.h是内核代码中的头文件,但我们可以把它移植到用户空间使用。

list_head结构体原型

struct list_head {
    struct list_head *next, *prev;
};

LIST_HEAD宏

/* 用两个宏来建立一个linux链表 */
#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
        struct list_head name = LIST_HEAD_INIT(name)

/* 用一个内联函数来建立一个linux链表 */      
static inline void INIT_LIST_HEAD(struct list_head *list)
{
        list->next = list;
        list->prev = list;
}

无论是用宏还是内联函数来建立一个linux链表,都是用同一个对象来初始化next和prev。
主要是宏定义的不好理解。
其实LIST_HEAD(exp_list)就相当于
struct list_head exp_list={&exp_list,&exp_list}就相当于

struct list_head exp_list;
exp_list.next=&exp_list;
exp_list.prev=&exp_list;

struct list_head exp_list={&exp_list,&exp_list}就是对结构体变量的初始化嘛。

struct student{
   int num;
   char name[10];
   int age;
}
struct student stu1={010,"Ian",21}; 

LIST_HEAD(exp_list);就是创建并初始化好的链表头部节点,其中next和prev指针都指向自身。不过,需要注意的是,该链表头部并非是使用链表结构体的宿主节点,而仅是链表节点本身。
这里写图片描述

list_test.h
这里写图片描述

list_test.c
这里写图片描述

结果:
这里写图片描述

定义一个链表

struct fox{
    unsigned long weight;
    bool is_cute;
    struct list_head list;
}

把一个现有的数据结构(这里是fox结构体)改造为链表。

struct fox *red_fox;
red_fox=(struct fox*)malloc(sizeof(struct fox));
red_fox->weight=6;
red_fox->is_cute=false;
INIT_LIST_HEAD(&red_fox->list);

链表头

对上述代码进行简单修改,我们的fox结构便可以被内核链表例程管理。但在可以使用这些例程前,我们需要一个链表的头指针,来指向整个链表。
我们的fox节点都是无差别的,每一个节点都包含list_head指针,于是我们可以从任何一个节点起遍历链表,看到所有节点。不过,我们仍然需要一个头指针索引到整个链表,而不是从一个链表节点触发。

定义并初始化一个名为fox_list的链表例程。
LIST_HEAD(fox_list)

PVFS2源代码分析之公有组件src/common/quicklist 用于PVFS2的双向循环链表 阅读详情

相关推荐

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 128

Linux中的list使用

1:使用说明 在linux下有一种常用的链表结构。当你需要很多相同结构体,并想把它们连接在一起。方便你增减或者逐个访问的时候,可以用这种结构。当然你也可以直接用链表指针,那么你就必须自己写,初始化链表,添加和删除,循环访问等函数。如果直接用list,就是直接把struct list_head放在你的结构体里。然后包含一个头文件list.h。就可以直接使用现成的链表操作的各种函数(创建, 增加, 删除和遍历)。z 2:常用函数 2.1 list_head struct list_head { stru

kayshi的博客 7155

Western blot (WB) 灰度分析进阶指南:ImageJ 高效定量技巧与实战优化

本文详细介绍了使用ImageJ进行Western blot灰度分析的进阶技巧,包括批量处理、背景校正和疑难条带处理等实战优化方法。通过自动化宏脚本和动态背景校正,显著提升分析效率和准确性,特别适合科研人员处理复杂WB数据。

weixin_42557830的博客 899

【Linux】Linux中链表数据结构详细说明及用法代码

然后,我们定义了几个操作单链表的函数:createNode用于创建新节点,insertAtEnd用于在链表末尾插入新节点,printList用于打印链表中的所有节点。在双向链表中,每个节点有两个指针域,一个指向前一个节点,一个指向后一个节点;在循环链表中,链表的最后一个节点的指针域指向链表的头节点,形成一个环。节点A的后继指针指向节点B。指针域可以为空,表示该节点是链表的末尾,或者指向另一个节点,表示该节点后面还有其他节点。双向链表中的每个节点包含两个指针域:一个指向前一个节点,一个指向后一个节点。

jiangchaobing_2017的博客 1508

全球、中国各省市县等行政区划(含十段线)shape及geosjon数据免费下载

免费下载全球、中国各省市县等行政区划(含十段线)shape及geosjon数据

mhf403445651的博客 3459

2026 AI Agent Harness Engineering 生态报告:开源工具链的现状与未来趋势

IEEE P2863-2025《通用人工智能自主代理技术架构与评估规范》于2025年11月正式发布,将AI Agent(通用人工智能自主代理)定义为:一种具备感知(Perception)、记忆(Memory)、推理(Reasoning)、规划(Planning)、行动(Action)五大核心能力闭环,能够在无显式指令覆盖全部环节的前提下,自主完成特定领域或开放领域复杂任务的智能实体。

AI 算法实战派 496

linux 内核list数据结构

list

weixin_43412488的博客 1594

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2621

Linux 中list.h使用实例和坑

​ list.h是Linux内核中,为了提供统一的链表操作,减少结构体的额外开支提供的链表操作。list.h中定义的链表了一个双向循环链表,和一个哈希表。内含实际例子 ​

monkeyzh123的专栏 3244

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

计算机组成原理(第三版)唐朔飞-第六章计算机的运算方法-课后习题(1-16)

weixin_45735391的博客 8万+

嵌入式系统开发笔记101:STM32CubeIDE安装过程中的2个错误及其解决方法

STM32CubeIDE在安装过程中,遇到了2个错误,本文阐述其解决方法。产生上述错误的原因,都在于中文。STM32CubeIDE不能很好的支持中文,所以在使用STM32CubeIDE进行项目设计的过程中,不要使用中文,包括项目所在的路径。

snmplink的博客 8552

浅谈linux内核中的list.h[2]

 链表的删除83/*84 * Delete a list entry by making the prev/next entries85 * point to each other.86 *87 * This is only for internal list manipulation where we know88 * the prev/next entries al

tedious的专栏 836

Codex 桌面端自定义模型列表为空 — 修复记录

摘要:Codex桌面端首次启动正常,但二次启动后出现中文界面且模型列表丢失。问题根源在于Electron的Chromium持久化状态损坏,导致UI渲染异常。解决方案包括:1) 将config.toml中的模型路径改为绝对路径;2) 删除损坏的状态文件.codex-global-state.json;3) 清除Chromium用户数据目录AppData\Roaming\Codex\web。验证显示修改后模型功能恢复正常,重装无效的原因是卸载未清除用户数据目录。

猿小白的博客 1153

linux 2.4内核中双向链表的实现/include/linux/list.h

概述:在linux 2.4内核中,于平台无关头文件/include/linux主要用于实现linux内核中的双线链表,对于很多内核中的功能都起到了很好的支撑作用,而且只有100多行,本文主要为你讲解这些函数的实现。       先浏览代码:   1 #ifndef _LINUX_LIST_H 2 #define _LINUX_LIST_H 3 4 #ifdef __KERNEL_

河西无名式 1551

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

list.h from linux-2.4

#ifndef _LIST_H_ #define _LIST_H_ /* simple (cyclic) doubly linked list borrowed from linux 2.4 */ struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(na...

Ackerman's Blog 116

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux内核中的通用链表list.h在windows下的移植实现

转自:https://blog.csdn.net/dijkstar/article/details/19249219 我这里用的是Linux2.4版本的,2.6版本的其实都一样,下面是修改后的list.h源文件,注意几点:① 注释掉了和Linux相关的字眼,如第四行、第六行等,添加了prefetch(w)两个函数的实现;② 因为是在C语言下实现(不是C++),VC6-VC2005-VC2010编...

yeyiliang的专栏 578

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux学习------分析list.h 之 函数部分

      在Linux中,最常见也是最经典的数据结构就是其中的双向链表,而对双向链表的各种操作都存储在list.h头文件中,最近仔细看了一下这个头文件,把我对它的理解记录下来,算是一个学习笔记吧。我看的是2.6.35.4版本的内核源代码,list.h在include/linux下存放,相对于一些其他的内核原文件来说,list.h算是比较小的了,而且只有700多行,主要是因为这个文件算是一个纯C文件,就是它是单纯的用C语言来对双向链表进行操作,看起来也比较容易。      在list.h中,定义了如下一个数

Mr.Right 3525

第四学 linux内核中最基本的数据组织方式——list.h分析(2)

7、遍历节点操作         这节我们介绍双连表的遍历。遍历是一个非常重要的概念,学过STL的童鞋们都知道,C++的容器的大量的算法都是建立在遍历这个概念基础之上的,比如查找元素,元素排序,等等。我只想说遍历很重要,相当重要,非常重要。废话有点多,我们直接看源码。         linux内核中定义了两个最基本的宏来遍历一个双连表,并且获取链表中某个节点的指针。以下是两个非常重要的基本宏

bcs_01的专栏 850

Linux循环链表删除节点,list.h双循环链表的实现,拷贝自Linux内核(2.6.20.1)

/** 描述:双循环链表的实现,拷贝自Linux内核(2.6.20.1)。*/#ifndef _LINUX_LIST_H#define _LINUX_LIST_H#ifdef __cplusplus /* 使C++程序也能用。 */extern "C" {#endif#if !defined(__cplusplus) && defined(WIN32)...

weixin_39705065的博客 234

YOLOv5/v7模型调优:手把手教你为自定义数据集添加解耦头(附PyTorch代码)

本文详细介绍了如何为YOLOv5/v7模型添加解耦头(de-coupled head)以提升自定义数据集的检测性能。通过分离分类和回归任务的处理路径,解耦头设计有效解决了传统耦合头的任务干扰问题,显著提高mAP指标。文章提供完整的PyTorch代码实现,包括模型结构修改、损失函数适配和训练调整,并分享工业场景下的优化技巧和性能对比数据。

weixin_33672400的博客 450

linux内核之链表操作解析

linux内核之链表操作解析 本文只是对linux内核中的链表进行分析。内核版本是linux-2.6.32.63。文件在:linux内核/linux-2.6.32.63/include/linux/list.h。本文对list.h文件进行简要分析,有必要的地方还会以图进行说明。 代码分析 链表结构体: 有前驱和后继,说明是双链表 struct list_head { st...

diansaopu0085的博客 260

error: field `list' has incomplete type的解决!:) [复制链接] 00

【yud】 本贴的目的是帮比我还菜的小鸟遇到这个问题好解决些,写完这个我 想在google或者baidu上搜partitions.h:61: error: field `list' has incomplete type 这样的关键字,应该能找到这贴了吧. 我今天在编译linux2.6.14.2的内核的时候,遇到了这个问题, 但是在google和baidu上找,都是提

lin111000713的专栏 1万+

【Linux内核源码分析】内核数据结构

该函数从链表中删除entry()元素,该操作并不会释放entry 或释放包含entry的数据结构体所占用的内存,只是仅仅将entry元素从链表中移走。依靠list_entry()方法,内核提供了创建、操作以及其他链表管理的各种方法,所有这些方法都不需要知道list_head锁嵌入对象的数据结构。这里的pos是一个包含list_head节点对象的指针,可将它看作是list_entry宏的返回值,head是一个指向头节点的指针。使用list_for_each()宏,该宏使用两个list_head类型的参数。

分享C/C++/Linux/网络/数据库/数据结构 527

双链表

实现了一个简单方便使用的双链表结构。是修改linux 2.6 kernel 中 list.h 得来的。 /** * macro.h - common macro define. * * Author:jta , 2008.6 * */#ifndef _MACRO_H_ #define _MACRO_H_ /* * common p

傲 441
上一篇: linux中的list.h(1)
下一篇: linux中的list.h(3)
_IanXiao
博客等级 码龄12年 84粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值