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

Linux内核通用队列实现 Kfifo

位置:kernel/kififo.c

使用需要包含头文件#include

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值