Linux内核通用队列的使用笔记(读linux内核设计与实现)

Linux内核通用队列实现 Kfifo
位置:kernel/kififo.c

使用需要包含头文件#include <kernel/kififo>

1、创建队列(动态创建)
int kfifo_alloc(struct kififo *fifo , unsigned int size , gfp_t gfp_mask);
该函数会创建并初始化一个大小为size的fifo,内核使用gfp_mask标识分配队列。
成功返回0
ep : 
struct kfifo fifo ; 
int ret ; 
//创建一个大小为PAGE_SIZE的队列,由内核进行内存分配
ret = kfifo_allo(&kifo , PAGE_SIZE , GFP_KERNEL);
if(ret)
return ret ;
自己分配缓冲,可以调用:
void kfifo_init(struct kfifo *kfifo ,void *buffer , unsigned int size);
创建并初始化一个kfifo对象,它将使由buffer指向的size字节大小的内存
对于以上两个函数,size必须是2的幂。
静态声明:
DECLARE_KFIFO(name , size);
INIT_KFIFO(name);
2、堆入队列数据
unsigned int kfifo_in(struct kfifo *fifo , const void *from , unsigned int len);
该函数将from指针所指的len字节的数据拷贝到fifo所指向的队列中,成功返回数据字节大小。
3、摘取队列数据
unsigned int kfifo_out_peek(struct kfifo *fifo , void *to  , unsigned int len , unsigned offset);;
与kfifo_out类似,如果offset为0,则读队列头,参数offset指向队列中的索引位置。
4、获取队列长度
//返回存储kfifo队列的空间的总体大小
static inline unsigned int kififo_size(struct kfifo *fifo);
//返回队列中已堆入数据的大小
static inline unsigned int kfifo_len(struct kfifo *fifo);
//想得到kfifo队列中还有多少可用空间
static inline unsigned int kfifo_avail(struct kififo *fifo);
//判断队列是否为空,返回非0值,返回0则相反
static inline int kfifo_is_empty(struct kfifo *fifo);
//判断队列是否为满,返回非0值,返回0则相反
static inline int kfifo_is_full(struct kfifo *fifo);
5、重置和撤销队列
//抛弃所有队列中的内容,调用kfifo_reset();
static inline void kfifo_reset(struct kfifo *fifo);
//撤销一个还是用kfifo_alloc()分配的队列,调用kfifo_free();

使用举例:

unsigned int i ;
	//将0,31压如名为fifo的kfifo中
	for(i = 0 ; i < 32 ; i++)
		kfifo_in(fifo , &i , sizeof(i));
	unsigned int val ;
	int ret ;
	ret = kfifo_out_peek(fifo , &val , sizeof(val) , 0);
	if(ret != sizeof(val))
		return -EINVAL ;
	printk(KERN_INFO"%u\n",val);//应该输出0
	//摘取并打印kfifo中的所有元素,可以调用kfifo_out();
	//当队列中还有数据时,按顺序从0到31打印出来
	while(kfifo_avail(fifo)){
		unsigned  int ret ;
		int ret ;
		ret = kfifo_out(fifo,&val , sizeof(val));
		if(ret != sizeof(val))
			return -EINVAL ;
		printk(KERN_INFO"%u\n",val);
	}
时间: 2024-08-10 16:20:52

Linux内核通用队列的使用笔记(读linux内核设计与实现)的相关文章

20150514我读《深入理解linux内核》之虚拟文件系统笔记

20150514我读<深入理解linux内核>之虚拟文件系统笔记 2015-05-14 Lover雪儿 虚拟文件系统所隐含的思想就是把很多不同种类的文件系统的共同信息放入内核,其中有一个字段或者函数来支持Linux所支持的所有实际文件系统所提供的任何操作.对所调用的每个读.写或者其他函数,内核都能把他们替换成支持本地Linux文件系统.NTFS文件系统,或者文件所在的任何其他文件系统的实际函数. 虚拟文件系统可以称为虚拟文件系统转换,是一个内核软件层,用来处理与Unix标准文件系统相关的所有系

读书笔记2013-2 Linux内核设计与实现A

<Linux内核设计与实现> 简介 这本书不是想Linux源码剖析那样一行行分析Linux源代码的书,而是从Linux历史,Linux哲学,Linux设计原理和原则,计算机硬件相关知识,编译安装内核实战等多方面多角度讲述和Linux相关的方方面面.从中学到的更多的不单内核的源代码,而是Linux的哲学.建议所有从事Linux相关工作的猿都要读一下,读完之后,很多东西都变得容易理解,知其然,知其所以然.如果没有读过<深入理解计算机>类似的图书,建议和<深入理解计算机>一起

《鸟哥的Linux私房菜》读书笔记:Linux内核编译和管理

1.内核简介与获取内核源代码 1.1 什么是内核 kernel:内核(kernel)是整个操作系统的最底层,他负责了整个硬件的驱动,以及提供各种系统所需的内核功能,包含防火墙机制.是否支持LVM或Quota等文件系统.若你的内核不能识别某个最新的硬件,那该硬件也就无法被驱动,你当然也就无法使用该硬件.其实内核就是系统上面的一个档案而已, 这个档案包含了驱动主机各项硬件的侦测程序和驱动模块.内核档案一般放在/boot/vmlinuz目录下 内核模块(Kernel module)的用途:将一些不常用

【linux_笔记】Linux常用命令

笔记内容均为观看马哥的Linux培训视频教程所得,经本人整理后发布. 知识回顾:    GUI:Graphic User Interface -- 图形用户界面        Windows(Windows桌面)        X-Window(Linux桌面)             Gnome            KDE            Xfce    CLI:Command Line Interface -- 命令行界面        sh(最初的)        bash    

I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)

1.I/O重定向的概念与原因 及 标准输入.输出的标准错误的定义 所以的Unix I/O重定向都基于标准数据流的原理.三个数据了分别如下: 1)标准输入--需要处理的数据流 2)标准输出--结果数据流 3)标准错误输出--错误消息流 概念:所以的Unix工具都使用文件描述符0.1和2.标准输入文件的描述符是0,标准输出的文件描述符是1,而标准错误输出的文件描述符则是2.Unix假设文件描述符0.1.2已经被打开,可以分别进行读写操作. 通常通过shell命令行运行Unix系统工具时,stdin.

系统调用操作文件——《Unix/Linux编程实践教程》读书笔记

1.who命令通过读系统日志的内容显示当前已经登录的用户. 2.Unix系统把数据存放在文件中,可以通过以下系统调用操作文件: open(filename, how) creat(filename, mode) read(fd, buffer, amt) write(fd, buffer, amt) lseek(fd, distance, base) close(fd) 3.进程对文件的读/写都要通过文件描述符,文件描述符表示文件和进程之间的连接. 4.每次系统调用都会导致用户模式和内核模式的切

linux中proc文件系统 -- ldd3读书笔记

1./proc 文件系统概述 /proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统./proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生文件的内容.我们已经见到了很多这样的文件,例如,/proc/modules 总是返回当前内核中加载的模块. /proc 广泛的应用在 linux 文件系统中,现代 linux 发行版上的许多应用程序,例如 ps ,top 和 uptime 都从 /proc 获取他们所需要的信息.一些驱动程序也通过

学习笔记-- 2014-07-07 Linux常用命令

2014-07-07 Linux常用命令 在Linuxtoy.org上看一些文章收集一些常用命令==================一.ps.kill 使用备查二.Ubuntu 提示三则三.最小化安装 Ubuntu四.Linux Mint设置时间 一到三来看linuxtoy.org网站 ===================一.ps.kill 使用备查 ps-查看当前正在运行的进程,示例:$ ps     kill {PID}-通过 PID 来停止任意进程,示例:$ kill 1012    

【linux_笔记】Linux基础常识_1

笔记内容均为观看马哥的Linux培训视频教程所得,经本人整理后发布. 操作系统的稳定性: 操作系统本身是一个程序,他的指令和数据和其它应用程序存储在内存中,如果一个恶意的应用            程序,能够直接访问内核的话,能够直接跟内核交互,能够直接修改内核中的某些数据的话,这就        意味着系统的稳定性将无从得到保证,所以必须要有一种机制能够将应用程序和内核隔离开来,通        常情况下,比如说intel这一类的平台上他会提供所谓的保护机制,一般我们的cpu有4个级别,是同