在以下简单程序中:
# 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竞技场分配器,并将分配的字节存储为映射的第一部分。因此,当我从文件中恢复时,我得到了分配的字节数。
但是,最后一行给了我bus error
。有人可以解释为什么,如果可能的话,向我建议避免的方法。我在32位奔腾操作系统上运行Linux,并使用clang ++编译器
答案 0 :(得分:2)
根据文档,sig总线可以在以下情况下触发:
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()
的大小(0、4096)不匹配,因此您可以使用ftruncate()
来增大文件的大小。
ftruncate(fd, 4096);