使用一些malloc-ed内存虚拟化fopen而不是使用文件

时间:2017-07-18 08:06:34

标签: c unit-testing serialization virtualization fwrite

我有一段代码使用带有fwrite的FILE* file

test = fwrite(&object,sizeof(object),1,file);

我想用索引结构序列化一些内部数据结构(因此,我既不使用Google的Protobuf也不使用Cap' n Proto,因为这是一个带有一些特定索引的自定义数据结构要求)。现在,在我的项目中,我想使用Google Test来测试序列化,为了检查序列化的内容,它可以反序列化并轻松检索。在测试阶段,我想传递fwrite一个FILE *对象,它不是一个文件,而是一个分配主内存的处理程序,所以没有文件被生成,我可以直接检查主内存中的结果序列化。是否可以虚拟化FILE*并直接写入主内存?出于性能原因,我想保留fwrite用于编写数据结构,而不必强制编写两种不同的序列化方法(有时候我会动态写入而不需要进一步的内存占用来进行转码)。提前谢谢。

2 个答案:

答案 0 :(得分:0)

一种方法是创建一个包含所有fopen / fwrite函数的动态库(这将为您的魔术文件名做一些事情,否则将回退到原始文件名)并使用LD_PRELOAD加载它。要回退到原始文件,请使用“dlsym”和RTLD_NEXT解决它们。

另一种方法是在库/测试的顶部包含一个特殊的标题,它将有一个类似“#define fopen my_fopen”的语句。在执行“my_fopen”的文件中,你需要在包含原始“stdio.h”之前加上“#undef fopen”。此方法仅适用于包含标头的源代码文件,但不会挂钩您链接的二进制库的函数。

答案 1 :(得分:0)

fopencookie完成了我正在寻找的工作。

http://man7.org/linux/man-pages/man3/fopencookie.3.html