linux内核源码“双向链表list_head”

摘要:linux内核源码真是好东东,是众多高手思维的结晶,在linux 源代码中有个头文件为list.h 。很多linux 下的源代码都会使用这个头文件,它里面定义了一个结构,
以及定义了和其相关的一组函数,这个结构是这样的:

structlist_head{

structlist_head *next, *prev;

};

如果您之前学过双向链表,那么当你看到这个结构的时候,会觉得似曾相识。岂止似曾相识,如果你看过Fio的源码,你会觉得它用的如此广泛,下面我们通过一个实例演示如何使用

一、编写代码

[[email protected] cstudy]# cat double_list.c

#include<stdio.h>

#include<stdlib.h>

#include "list.h"

struct int_node

{

/*视情况,增加*/

int val;

int num;

/************/

struct list_head list;

};

int main()

{

struct list_head head,*plist;

struct int_node a,b,c;

a.val = 1;

a.num = 1;

b.val = 2;

b.num = 2;

c.val = 3;

c.num = 3;

INIT_LIST_HEAD(&head);            //初始化链表头

list_add_tail(&a.list,&head);          //添加节点

list_add_tail(&b.list,&head);

list_add_tail(&c.list,&head);

printf("************遍历链表,打印结果**************\n");

list_for_each(plist,&head)     //遍历链表,打印结果

{

struct int_node *node = list_entry(plist,struct int_node,list);  
//然后取得数据项,因此一般来说和list_for_each配合使用

printf("val = %d, num = %d\n", node->val, node->num);

}//print 1 1 2 2 3 3

printf("************删除节点b,重新遍历链表,打印结果*\n");

list_del(&b.list);            //删除节点b

list_for_each(plist,&head)         //重新遍历链表,打印结果

{

struct int_node *node = list_entry(plist,struct int_node,list);

printf("val = %d, num = %d\n", node->val, node->num);

}//print 1 1 3 3

printf("************打印链表head1******************\n");

struct int_node d,e;

struct list_head head1;

d.val = 4;

d.num = 4;

e.val = 5;

e.num = 5;

INIT_LIST_HEAD(&head1);            //重新建立链表,表头为head1

list_add_tail(&d.list,&head1);

list_add_tail(&e.list,&head1);

list_for_each(plist,&head1)

{

struct int_node *node = list_entry(plist,struct int_node,list);

printf("val = %d, num = %d\n", node->val, node->num);

}

printf("*******************************************\n");

if(!list_empty(&head))          //判断链表是否为空

{

printf("the list is not empty!\n");

}

return 0;

}

时间: 2024-10-11 12:24:49

linux内核源码“双向链表list_head”的相关文章

linux内核源码“双向链表list_head”续

上篇博文<linux内核源码"双向链表list_head">中以一个实例介绍了list_head双向链表的用法,只有实例的代码,并没有list_head链表的代码,考虑到各位好学博友的强烈愿望,今天把list_head的代码即list.h头文件粘贴到此,供各位好学博友使用. 一.list.h头文件源码 [[email protected] cstudy]# cat list.h             #list.h头文件 #ifndef _LINUX_LIST_H #de

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html 在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup.在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工作,详解

Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】

原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938390.html 在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段, 下面我就顺这代码逐个函数的解释,但是这里并不会过于深入

Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938393.html 在分析start_kernel函数的时候,其中有构架相关的初始化函数setup_arch. 此函数根据构架而异,对于ARM构架的详细分析如下: void __init setup_arch(char **cmdlin

Linux内核源码分析方法

  一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一

Linux内核源码学习之 数据结构

本篇记录在学习Linux内核源码过程中对一些知道但不熟悉不会用的数据结构进行记录. union 是在学习进程复制函数do_fork中遇到的: <sched.h> union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }; struct  thread_info和stack被声明为union 共享空间 "联合"是一种特殊的类,也是一

ARMv8 Linux内核源码分析:__flush_dcache_all()

1.1 /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY(__flush_dcache_all) //保证之前的访存指令的顺序 dsb sy //读cache level id register mrs x0, clidr_el1           // read clidr //取bits[26:24](Level of Coherency f

linux内核源码注解

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin