C向/从磁盘写入/读取内存快照

时间:2016-08-03 12:58:35

标签: c memory-management file-io redis

我在C中实现了自己的Redis。我通过分配足够的内存来保存n无符号长(比如说单词)然后使用字偏移和位偏移来设置/清除来设计位图位于pos

的位置
word_offset = pos / BITS_PER_WORD;
bit_offset = pos % BITS_PER_WORD;

下一步是通过将此位图写入磁盘来保留此位图,可以再次读回以恢复位图。

作为第一个天真的方法,我试图逐字读取内存,并将此unsigned long写入文件。它有效,但看起来很丑,工作缓慢而且感觉愚蠢,因为位图的大小可以达到512mb。

此外,我必须将多个这样的位图存储到单个文件中。

如何设计一种将数据结构保存到磁盘的有效方法。由于这是一个学习项目,我正在避免偷看Redis源代码。

1 个答案:

答案 0 :(得分:2)

请参阅fwrite

#include <stdio.h>

size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
       FILE *restrict stream);
  

fwrite()函数应从ptr指向的数组写入由size指定的nitems个元素到stream指向的流。对于每个对象,应对fputc()函数进行大小调用,从无符号字符数组中取值(按顺序)与对象完全重叠。流的文件位置指示符(如果已定义)应按成功写入的字节数提前。如果发生错误,则未指定流的文件位置指示符的结果值。

读取的相应功能是fread

如果POSIX是唯一的要求,请使用write

#include <unistd.h>

ssize_t pwrite(int fildes, const void *buf, size_t nbyte,
       off_t offset);
ssize_t write(int fildes, const void *buf, size_t nbyte);
  

write()函数应尝试将nbyte字节从buf指向的缓冲区写入与打开文件描述符fildes相关联的文件。

读取的相应功能是read