openssl之BIO系列之3---BIO的聲明和釋放等基本操作

BIO的聲明和釋放等基本操作
    
    在BIO的基本操作系列函數中,他們用來BIO分配和釋放操作,包括:
    BIO_new, BIO_set, BIO_free, BIO_vfree, BIO_free_all
    他們的聲明在openssl/bio.h文件中,其聲明形式如下:
     BIO * BIO_new(BIO_METHOD *type);
     int BIO_set(BIO *a,BIO_METHOD *type);
     int BIO_free(BIO *a);
     void BIO_vfree(BIO *a);
     void BIO_free_all(BIO *a);
    下面分別對這些函數進行解釋.
    【BIO_new】
    這個函數創建並返回一個相應的新的BIO,並根據給定的BIO_METHOD類型調用下述的BIO_set()函數給BIO結構的method成員賦值,如果創建或給method賦值失敗,則返回NULL。創建一個Memory類型的BIO例子如下:
    BIO* mem=BIO_new(BIO_s_mem());
    有些類型的BIO使用BIO_new()函數之後就可以直接使用了,如memory類型的BIO;而有些BIO創建之後還需要一些初始化工作,如文件BIO,一般來說,也提供了這樣的一些函數來創建和初始化這種類型的BIO。
    這是什麼意思呢,舉個簡單的例子大家就明白了:
    比如創建一個文件BIO,使用下面的代碼:
    BIO* in=NULL;
    in=BIO_new(BIO_s_file());
    BIO_read_filename(in,"rsa512.pem");
    這樣,BIO in才能使用,而如果是創建一個memory類型的BIO,則只需要如下一句代碼:
    BIO* mem=BIO_new(BIO_s_mem());
    然後就可以對該BIO mem進行操作了。
    另外,需要補充的是(這個大家從前面兩篇文章可能已經認識到了),對於source/sink類型的BIO,其類型創建函數一般爲BIO_s_*的形式,對於filter型的函數,其類型創建函數一般爲BIO_f_*的形式。
    
    
    【BIO_set】
    該函數功能比較簡單,就是對一個已經存在的BIO設置新的BIO_METHOD類型。其實就是簡單的對BIO的各個成員進行初始化,並將參數type賦值給該BIO。其實,BIO_new函數在使用OPENSSL_malloc給BIO分配了內存之後,就簡單調用了BIO_set函數進行初始化工作。所以一般來說,除非你要重新設置你已經存在的BIO,否則是不需要直接調用這個函數的。成功操作返回1,否則返回0。
    【BIO_free】
    該函數釋放單個BIO的內存和資源,成功操作返回1,失敗返回0。BIO的操作不僅僅是釋放BIO結構所佔用的資源,也會釋放其下層的I/O資源,比如關閉釋放相關的文件符等,這對不同類型的BIO是不一樣的,詳細的請參看各種類型BIO本身的說明文件和源文件。需要注意的是,BIO_free只釋放當前的一個BIO,如果用來釋放一個BIO鏈,就可能會導致內存泄漏,這種情況應該使用下述的BIO_free_all函數。
    【BIO_vfree】
    該函數功能與BIO_free完全相同,只是沒有返回值。事實上,它簡單調用了BIO_free函數,但不返回該函數的返回值,所以它的函數實現代碼只有一個語句。
    【BIO_free_all】
    該函數釋放這個BIO鏈,並且即使在這個過程中,如果釋放其中一個BIO出錯,釋放過程也不會停止,會繼續釋放下面的BIO,這保證了儘量避免內存泄漏的出現。如果你非要調用這個函數釋放單個的BIO,那麼效果跟BIO_free是一樣的。事實上,該函數只是簡單的遍歷整個BIO鏈,並調用BIO_free釋放各個環節的BIO。

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