fifo
linux kernel有链表、队列、映射、二叉树等内建数据结构,并且封装一系列API给linux kernel开发人员使用,本章讲解队列。
base linux-2.6.34
简介
linux kernel 队列 定义如下:
struct kfifo {
unsigned char *buffer; /* the buffer holding the data */
unsigned int size; /* the size of the allocated buffer */
unsigned int in; /* data is added at offset (in % size) */
unsigned int out; /* data is extracted from off. (out % size) */
};
如何初始化队列 ?
int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask);
如何将数据入队列 ?
unsigned int kfifo_in(struct kfifo *fifo, const void *from, unsigned int len);
如何将数据出队列 ?
unsigned int kfifo_out(struct kfifo *fifo, void *to, unsigned int len);
如何释放队列 ?
void kfifo_free(struct kfifo *fifo);
实践
#include <linux/kfifo.h>
void fifo()
{
struct kfifo fifo; // 定义队列
int i, tmp;
kfifo_alloc(&fifo, PAGE_SIZE, GFP_KERNEL); // 分配队列缓冲区以及初始化队列
for(i=0; i<5; i++)
kfifo_in(&fifo, &i, sizeof(i)); // 数据入队列
pr_debug("%s: len : %d\t", __func__, kfifo_len(&fifo)); // 返回队列已用空间大小
pr_debug("%s: size : %d\t", __func__, kfifo_size(&fifo)); // 返回队列大小
pr_debug("%s: avail: %d\t", __func__, kfifo_avail(&fifo)); // 返回队列可用空间大小
while(!kfifo_is_empty(&fifo)) // 判断队列是否为空
{
kfifo_out(&fifo, &tmp, sizeof(tmp)); // 数据出队列
pr_debug("%s: %d\t", __func__, tmp);
}
pr_debug("%s: len : %d\t", __func__, kfifo_len(&fifo));
pr_debug("%s: size : %d\t", __func__, kfifo_size(&fifo));
pr_debug("%s: avail: %d\t", __func__, kfifo_avail(&fifo));
kfifo_free(&fifo); // 释放队列缓冲区
}
Last updated
Was this helpful?