使用需要包含頭文件#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); }