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

Virtualizing fopen with some malloc-ed memory instead of using a file

我有一段代码使用 FILE* file 和 fwrite:

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

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

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

解决它们

另一种方法是在 library/test 的顶部包含一个特殊的 header,其中包含类似“#define fopen my_fopen”的语句。在执行 "my_fopen" 的文件中,您需要在包含原始 "stdio.h" 之前放置“#undef fopen”。此方法仅适用于包含 header 的源代码文件,但不会挂钩您 link.

的二进制库的函数

fopencookie 完成了我想要的工作。

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