Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add、list_add_tail、list_del、list_entry、list_for_each等。 在内核源码中,list_head结构体的定义在文件source_code/include/linux/types.h文件中,结构体定义如下:
就是将pos指针往前移动offset位置,即是本来pos是struct list_head类型,它即是list。即是把 pos指针往struct person结构的头地址位置移动过去,如上图的pos和虚箭头。 当pos移到struct person结构头后就转 成(struct person *)指针,这样就可以得到struct person *变量了。
structlist_head my_list = {&my_list, &my_list}; 正常的链表都是为了遍历结构体中其它有意义的字段而创建的,但是上面定义的my_list中只有prev和next指针,因此没有实际意义的字段数据,所以,需要创建一个宿主结构,然后在此结构中嵌套my_list字段,宿主结构中又有其它的字段,例如: structmy_task_lsit {intval;...
使用container_of()宏,我们定义一个简单的函数便可返回包含list_head的父类型结构体 依靠list_entry()方法,内核提供了创建、操作以及其他链表管理的各种例程——所有这些方法都不需要知道list_head所嵌入对象的数据结构 以下代码来自于Linux 2.6.22/include/linux/list.h /** * list_entry - get ...
struct list_head *prev, *next; }; ``` 其中,prev和next分别指向前一个和后一个元素的list_head结构体。通过这样的链表结构,可以轻松地在链表中插入、删除、遍历元素,实现各种数据结构和算法。在红帽公司的Linux发行版中,struct list_head被广泛应用于各种场景,如进程管理、网络协议栈、文件系统等方面。
task_struct 结构体包含了许多字段,其中一些重要的字段包括: volatile long state: 进程状态,如运行、就绪、等待等。 struct thread_info *thread_info: 线程信息。 pid_tpid: 进程ID。 struct task_struct *parent: 指向父进程的指针。 struct list_head children: 子进程链表头部。
由于struct list_head是一个通用的数据结构,因此在Linux内核中,其可以被用来实现各种不同的链表结构,而不需要重新定义一个新的链表结构。这样不仅方便了内核的扩展,也提高了代码的可读性和可维护性。 结语 在Linux内核中,struct list_head是一个非常重要的数据结构,它不仅实现了双向链表,而且提高了内核效率,方便了内...
" 虚拟内存区域 “vm_area_struct结构体实例 所” 关联 " 的anon_vma实例 , 会与" 父进程 " 的anon_vma实例 串联起来 , 组成一个 链表 ; struct list_head anon_vma_chain成员 就是该anon_vma实例 组成的 链表 ; 代码语言:javascript 代码运行次数:0 ...
structlist_headtsq_node;/* anchor in tsq_tasklet.head list */ unsignedlongtsq_flags; /* Data for direct copy to user cp 数据到用户进程的控制块 有用户缓存以及其长度 prequeue 队列 其内存*/ struct{ structsk_buff_headprequeue//tcp段 缓冲到此队列 知道进程主动读取才真正的处理; ...
C语言struct结构体介绍 目录 struct struct的嵌套 实验 struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 下面是struct自定义数据类型的一个例子。 structtag{ member-list member-list member-list...