BIO的声明和释放等基本操作
---根据openssl doc/crypto/bio/bio_new.pod翻译和自己的理解写成
(作者:DragonKing Mail:wzhah@263.net 发布于:gdwzh.126.com openssl专业论坛)
在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。
关于BIO的基本创建和释放操作,就介绍到这儿,欢迎大家有问题到gdwzh.126.com指教交流。