今天看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用於關閉流,該函數用來釋放流所用到的緩衝區資源。