歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核通用隊列的使用筆記(讀linux內核設計與實現)

Linux內核通用隊列的使用筆記(讀linux內核設計與實現)

日期:2017/3/1 11:45:21   编辑: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);
	}

Copyright © Linux教程網 All Rights Reserved