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. 关于 linux中TCP数据包(SKB)序列号的小笔记

    关于  SKB序列号的小笔记 为了修改TCP协议,现在遇到了要改动tcp分组的序列号,但是只是在tcp_sendmsg函数中找到了SKB的end_seq  一直没有找到seq 不清楚在那里初始化了,就 ...

  2. 深度学习与计算机视觉系列(2)_图像分类与KNN

    作者: 寒小阳 &&龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49949535 ht ...

  3. Unity UGUI实现分段式血条

    我们可以看到像英雄联盟等游戏里英雄头顶的血条显示并非是纯色的,而是根据血量的多少而显示一定量的格子,这种方式明显是比较友好.比较美观的,事实上我们的游戏里面也想实现这样的效果,那该怎么办呢?根据血量的 ...

  4. (Java)微信之个人公众账号开发(一)——进入开发者模式

    本篇文章将教大家如何建立微信个人公众账号,(注意:后台全部是用javaweb相关技术开发),大家知道,现在微信公众账号分服务号和订阅号,现在我要讲的主要是个人微信公众账号的建立以及后台的开发,个人公众 ...

  5. oracle伪列

    Oracle的伪列以及伪表 oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Ora ...

  6. activiti 数据库连接配置

    1.1.1. 前言 在activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)一文中,我们讲解了如何动态的配置DataSource 当我们程序配置了DataSource,act ...

  7. Linux--FTP和MAIL服务器

     1) FTP协议 FTP(FileTransfer Protocol,文件传输协议)用于管理计算机之间的文件传送.FTP 是Internet 上使用非常广泛的一种通讯协议,它是由支持Intern ...

  8. [shiro学习笔记]第一节 使用eclipse/myeclipse搭建一个shiro程序

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39519509 shiro官网:http://shiro.apache.org/ shi ...

  9. CUDA5.5 的环境变量设置

    为了方便,我写了这个文件用于设置cuda5.5的环境变量. 其中有些环境变量可能用不到,大家根据需要修改就是了. export CUDA_HOME=/usr/local/cuda-5.5 export ...

  10. dbcp连接池不合理的锁导致连接耗尽

    应用报错,表象来看是连接池爆满了. org.springframework.transaction.CannotCreateTransactionException: Could not open J ...