使用需要包括頭文件#include <kernel/kififo>
1、創(chuàng)建隊列(動態(tài)創(chuàng)建)
int kfifo_alloc(struct kififo *fifo , unsigned int size , gfp_t gfp_mask);
該函數(shù)會創(chuàng)建并初始化1個大小為size的fifo,內(nèi)核使用gfp_mask標(biāo)識分配隊列。
成功返回0
ep :
struct kfifo fifo ;
int ret ;
//創(chuàng)建1個大小為PAGE_SIZE的隊列,由內(nèi)核進行內(nèi)存分配
ret = kfifo_allo(&kifo , PAGE_SIZE , GFP_KERNEL);
if(ret)
return ret ;
自己分配緩沖,可以調(diào)用:
void kfifo_init(struct kfifo *kfifo ,void *buffer , unsigned int size);
創(chuàng)建并初始化1個kfifo對象,它將使由buffer指向的size字節(jié)大小的內(nèi)存
對以上兩個函數(shù),size必須是2的冪。
靜態(tài)聲明:
DECLARE_KFIFO(name , size);
INIT_KFIFO(name);
2、堆入隊列數(shù)據(jù)
unsigned int kfifo_in(struct kfifo *fifo , const void *from , unsigned int len);
該函數(shù)將from指針?biāo)傅膌en字節(jié)的數(shù)據(jù)拷貝到fifo所指向的隊列中,成功返回數(shù)據(jù)字節(jié)大小。
3、摘取隊列數(shù)據(jù)
unsigned int kfifo_out_peek(struct kfifo *fifo , void *to , unsigned int len , unsigned offset);;
與kfifo_out類似,如果offset為0,則讀隊列頭,參數(shù)offset指向隊列中的索引位置。
4、獲得隊列長度
//返回存儲kfifo隊列的空間的整體大小
static inline unsigned int kififo_size(struct kfifo *fifo);
//返回隊列中已堆入數(shù)據(jù)的大小
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、重置和撤消隊列
//拋棄所有隊列中的內(nèi)容,調(diào)用kfifo_reset();
static inline void kfifo_reset(struct kfifo *fifo);
//撤消1個還是用kfifo_alloc()分配的隊列,調(diào)用kfifo_free();
使用舉例: