mmap文件未同步

时间:2019-11-23 16:40:54

标签: file filesystems mmap lseek

您好,我正在尝试通过mmap备份矢量。 但是,我尝试了msync然后使用munmap,但是它不起作用。在我写入(char *)然后munmap文件之后,该文件没有内容。 mmap文件也使用标志MAP_SHARED创建。如果有人可以帮助,我们将不胜感激。

data class ResponseCurrencyConvert(
    val USD_BDT: Double
)

1 个答案:

答案 0 :(得分:0)

您的代码和问题有很多问题:

  • S_IRWXUopen()的第三个参数,不是第二个参数的标志。
  • 如果文件太小,
  • mmap()将无法正常工作。您可以使用ftruncte()来正确设置文件大小。您尝试查找映射的总大小并写入几个字节("ta"),但在此之前,您发出了查找lseek(fd, 0, SEEK_SET),这意味着文件大小设置为3,而不是mapping_size +3。
  • 您没有使用映射文件来支持向量,向量与它无关,向量使用了自己的内存,该内存与该映射没有任何关系(请编辑您的问题...) 。
  • 您通过地址msync()呼叫了(void *)0,因此需要同步的实际地址map并未同步。
  • 同样,您使用地址munmap()呼叫了(void *)0,因此需要取消映射的实际地址不会被取消映射。
  • 您使用msync()调用了MS_ASYNC,这意味着在您读取文件内容之前无法保证同步发生。

这是对我有用的(为简便起见,省略了错误处理):

unsigned frontier_size = 2;
const unsigned URL_MAX_SIZE = 100;

int fd = open("data", O_RDWR);
loff_t size = frontier_size * URL_MAX_SIZE;
ftruncate(fd, size);
char *map = (char *)mmap(0, size, PROT_WRITE, MAP_SHARED, fd, 0);
strcpy(map, "hello there");
msync(map, size, MS_SYNC);
munmap(map, size);
close(fd);