当前位置:   article > 正文

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

kifso

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

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/601586
推荐阅读
相关标签
  

闽ICP备14008679号