fopencookie函式詳解

qliu83發表於2014-07-15

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


相關文章