博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核通用队列的使用笔记(读linux内核设计与实现)
阅读量:7058 次
发布时间:2019-06-28

本文共 1891 字,大约阅读时间需要 6 分钟。

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

转载地址:http://gcwll.baihongyu.com/

你可能感兴趣的文章
MySQL两千万数据优化&迁移
查看>>
《UNIXLinux程序设计教程》一2.3 打开和关闭流
查看>>
《Android的设计与实现:卷I》——第2章 2.5 JNI操作Java对象
查看>>
FBI和DHS在响应网络攻击时为何存在分歧
查看>>
《系统分析与设计方法及实践》一3.1 案例研究中涵盖的内容
查看>>
湖北省开启能源供给侧改革 将重点发展光伏发电
查看>>
美国伊利诺伊州响应区块链技术倡议活动 将举办黑客马拉松
查看>>
阿里音乐打算用大数据发掘下一个TFboy
查看>>
大数据能否成帮助人类 控制寨卡病毒疫情
查看>>
大数据为推动中国出版“走出去”提供新机遇
查看>>
Nest应用登陆tvOS 可在大屏幕上进行监控了
查看>>
Tumblr遭遇数据泄露 6000多万名用户受波及
查看>>
新的系统漏洞使iOS10更容易被攻破,苹果称已开始修复
查看>>
物联网路径,美国运营商怎么走?
查看>>
除Hadoop大数据技术外,还需了解的九大技术
查看>>
印度限制官员使用智能手机:真因为怕中国黑客?
查看>>
沪穗深百万地铁族担心:花生WiFi到底安全吗?
查看>>
东莞:现代会展公司成立呼叫中心 大数据分析提升办展质量
查看>>
实现“中国制造”向“中国智造”转变 大数据技术成关键
查看>>
苹果市值15个交易日蒸发450亿美元 相当于半个波音
查看>>