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);
	}

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

  1. Linux文件系统与inode、Block笔记

    Linux文件系统与inode.Block笔记 在Linux下一切都是文件,无论是设备还是接口,亦或是网卡等均被抽象成了文件,并且有相关的内核代码进行调度.然而,在一切都是文件的前提下,最需要进行探讨 ...

  2. Linux内核入门到放弃-网络-《深入Linux内核架构》笔记

    网络命名空间 struct net { atomic_t count; /* To decided when the network * namespace should be freed. */ a ...

  3. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

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

    读书笔记2013-2 Linux内核设计与实现A <Linux内核设计与实现> 简介 这本书不是想Linux源码剖析那样一行行分析Linux源代码的书,而是从Linux历史,Linux哲学 ...

  5. Linux内核学习笔记2——Linux内核源码结构

    一 内核组成部分 内核是一个操作系统的核心,主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络结构,进程间通信. 1.进程调度(SCHED) 控制进程对CPU的访问.当需要选择下一个进程运行时 ...

  6. 《Linux内核设计与实现》学习笔记之“Linux进程管理机制”

    一.进程(或者称为“任务”)简介 进程是OS最基本的抽象之一,通常进程包括“可执行程序代码”,“其他资源”(如:打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间,一个或多个执行线程等) 二. ...

  7. linux内核分析第四周学习笔记

    linux内核分析第四周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  8. Linux内核分析第二周学习笔记

    linux内核分析第二周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  9. linux内核分析第一周学习笔记

    linux内核分析第一周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

随机推荐

  1. GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败

    使用GDALWarp写了一个裁切图像的算法,在小内存的电脑没事,大内存的电脑就处理失败(32位也没问题),查看GDAL的日志发现下面的错误信息: Fri Apr 08 17:39:02 2016: G ...

  2. SpringMVC源码分析--文件上传

    SpringMVC提供了文件上传的功能,接下来我们就简单了解一下SpringMVC文件上传的开发及大致过程. 首先需要在springMVC的配置文件中配置文件上传解析器 <bean id=&qu ...

  3. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  4. 【NPR】非真实感渲染实验室

    写在前面 前几天在知乎看到一个问题--关于非实感图形学或者风格化渲染有哪些好的书或者paper,我刚好接触过一些就去里面回答了一下.答完以后突然想在Unity里搞一个这样的集锦,把一些简单的NPR论文 ...

  5. 剑指offer面试题3 二维数组中的查找 (java)

    注:java主要可以利用字符串的length方法求出长度解决这个问题带来方便 public class FindNum { public static void main(String[] args) ...

  6. Android之使用参数改变ProgressDialog的位置、大小、背景透明度、屏幕透明度

    废话不多说,这个改变ProgressDialog的一些配置属性和前面我讲的AlertDialog的设置参数方法一模一样,这里就为了更直观,直接贴实现代码吧: ProgressDialog mProgr ...

  7. there was no endpoint listening at net.pipe://localhost/PreviewProcessingService/ReportProcessing

    当你在开发reporting service报表时,进行报表的preview时报下图中的错误,以下方法可以让你直接跳过这个错误,继续查看报表的运行结果. 直接选择你需要运行查看的报表右击run就可以, ...

  8. Dynamics CRM 2015 Online Update1 UI界面的更新变化

    听说出  Dynamics CRM 2015 Online  Update1了,立马跑去申请了个30天试用版简单的看了下,UI上的变化还是让人耳目一新的,也可能是被CRM2013的UI蹂躏太久了没 ...

  9. springMVC 使用ajax 出现No serializer found for class异常

    转自  http://mxdba.iteye.com/blog/668155 google了一下,发现坛子里已经有人解答了 http://godfox.iteye.com/blog/646887 不过 ...

  10. Dynamics CRM 在报表中获取当前登陆用户的guid

    <span style="font-size:18px;">CRM提供函数,只需在报表中调用即可.</span> <pre class="s ...