fopencookie函數詳解

今天看DPDK時,看到了fopencookie函數,以前基本沒有用過該函數,乘此機會好好看看如何使用。


1. 函數頭文件與函數原型 

函數頭文件: #include <stdio.h>

函數原型:

FILE *fopencookie(void *cookie, const char *mode, cookie_io_functions_t io_funcs);


2. 函數及參數說明

該函數用來DIY一個流,什麼是流,比如標準輸入,標準輸出。

參數:

(1 cookie

cookie是一種自定義的數據結構,用於和後面的io_funcs配合使用,可以爲NULL。

(2 mode

打開方式,和fopen相同,包括:r,w,a,r+,w+,a+。

(3 io_funcs

四個函數指針組成的函數集,需要用戶實現這四個函數指針。我們仔細看看:

 

io_funcs:

typedef struct {
cookie_read_function_t *read;
cookie_write_function_t *write;
cookie_seek_function_t *seek;
cookie_close_function_t *close;
} cookie_io_functions_t;

第一個read函數實現從流的讀操作,原型如下:
ssize_t read(void *cookie, char *buf, size_t size);
該函數必須返回讀到數據的字節數,注意是讀到,意味着流數據要拷貝到
buf中。返回0表示EOF,-1表示出錯。該函數必須要更新流的offset。

第二個函數write實現向流的寫操作,原型如下:
ssize_t write(void *cookie, const char *buf, size_t size);
基本和上面read類似。

第三個函數seek實現挪動流的offset,原型如下:
int seek(void *cookie, off64_t *offset, int whence);
offset更具whence的取值指明瞭流指針要移動到的位置。基本和系統調用的seek函數類似。
返回0表示成功,返回-1表示失敗。

第四個函數close用於關閉流,該函數用來釋放流所用到的緩衝區資源。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章