是否可以在不出现总线错误的情况下写入 mmap 文件
Is it possible to write to a mmap'd file without getting a bus error
我正在尝试监控我创建的文件,当内容从 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
执行以下操作:
- 将
the_file
截断为 0 个字节。
- 将字符
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
我正在尝试监控我创建的文件,当内容从 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
执行以下操作:
- 将
the_file
截断为 0 个字节。 - 将字符
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