c++ - 是否可以在不出现总线错误的情况下写入 mmap 文件

标签 c++ c mmap

当内容从 0 更改为 1 时,我正在尝试监视我创建的文件。此代码创建文件并将其映射好,然后旋转,等待 *map 的内容从 '0' 更改为 '1'

但是,一旦我运行 echo 1 > file.dat,代码就会因 Bus Error 而崩溃。

我假设这是因为 echo(或我尝试的其他任何东西)正在创建一个新文件并且 mmap 不再指向相关的东西。有什么方法可以使它起作用吗?

int fd = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);

write(fd, "0", 1)

char* map = static_cast<char*>(mmap(0, 1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));

最佳答案

echo 1 > the_file 执行以下操作:

  1. the_file 截断为 0 字节。
  2. 将字符 1\n 附加到 the_file

在第 1 步和第 2 步之间,文件的长度为 0。

(第 1 步由 shell 执行,当它解释重定向 >the_file 时。第 2 步然后由 echo 命令执行,因此可能有一个重要的两者之间的时间量。)

如果要覆盖文件的一个字符,可以使用dd:

echo 1 | dd of=the_file bs=1 count=1 conv=notrunc

关于c++ - 是否可以在不出现总线错误的情况下写入 mmap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30738568/

相关文章:

c++ - 根据包含的数据对结构 vector 进行排序

c++ - 以 "generic"方式设置成员属性

C - n-ary 树的根未被保存/更新

c - 在循环函数调用中使用省略号 (...)

C++ lambda 和内联 fizzbuzz

c++ - 在一行中输入多个字符串到一个 vector 中? (C++)

c - 指针和指针指向的对象

c++ - 使用 mmap 读/写寄存器

c - 使用 mmap 读/写文件时如何解决 ENODEV

c++ - 使用 mmap 时性能下降