mmap 内存区域的总线错误
Bus error with mmap memory region
在下面的简单程序中:
# include <sys/mman.h>
# include <fcntl.h>
# include <cstdlib>
# include <cassert>
struct rgn_desc
{
size_t end_;
char data[];
};
int main(int argc, const char *argv[])
{
int fd = open("foo.mm", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0700);
assert(fd != -1);
void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_POPULATE, fd, 0);
assert(ptr != (void*) -1);
rgn_desc * rgn_ptr = (rgn_desc*) ptr;
rgn_ptr->end_ = 0; // <-- bus error
}
基本上,我想管理一个简单的 mmaped arena 分配器并将我分配的字节存储为映射的第一部分。因此,当我从文件中恢复时,我会得到分配了多少字节。
然而,最后一行给了我一个bus error
。有人可以解释为什么,如果可能的话,向我建议一种避免它的方法。我 运行 Linux 在 32 位奔腾上使用 clang++ 编译器
根据文档,如果满足以下条件,信号总线可以触发:
SIGBUS
Attempted access to a portion of the buffer that does not
correspond to the file (for example, beyond the end of the
file, including the case where another process has truncated
the file).
在你的截图中你的文件大小与你的不匹配mmap()
size (0, 4096), so you could use ftruncate()
增加你的文件的大小。
ftruncate(fd, 4096);
在下面的简单程序中:
# include <sys/mman.h>
# include <fcntl.h>
# include <cstdlib>
# include <cassert>
struct rgn_desc
{
size_t end_;
char data[];
};
int main(int argc, const char *argv[])
{
int fd = open("foo.mm", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0700);
assert(fd != -1);
void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_POPULATE, fd, 0);
assert(ptr != (void*) -1);
rgn_desc * rgn_ptr = (rgn_desc*) ptr;
rgn_ptr->end_ = 0; // <-- bus error
}
基本上,我想管理一个简单的 mmaped arena 分配器并将我分配的字节存储为映射的第一部分。因此,当我从文件中恢复时,我会得到分配了多少字节。
然而,最后一行给了我一个bus error
。有人可以解释为什么,如果可能的话,向我建议一种避免它的方法。我 运行 Linux 在 32 位奔腾上使用 clang++ 编译器
根据文档,如果满足以下条件,信号总线可以触发:
SIGBUS Attempted access to a portion of the buffer that does not correspond to the file (for example, beyond the end of the file, including the case where another process has truncated the file).
在你的截图中你的文件大小与你的不匹配mmap()
size (0, 4096), so you could use ftruncate()
增加你的文件的大小。
ftruncate(fd, 4096);