总线错误打开和映射文件
Posted
技术标签:
【中文标题】总线错误打开和映射文件【英文标题】:Bus error opening and mmap'ing a file 【发布时间】:2014-01-02 11:41:16 【问题描述】:我想创建一个文件并将其映射到内存中。我认为我的代码可以工作,但是当我运行它时,我得到一个“总线错误”。我搜索了谷歌,但我不确定如何解决这个问题。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>
int main(void)
int file_fd,page_size;
char buffer[10]="perfect";
char *map;
file_fd=open("/tmp/test.txt",O_RDWR | O_CREAT | O_TRUNC ,(mode_t)0600);
if(file_fd == -1)
perror("open");
return 2;
page_size = getpagesize();
map = mmap(0,page_size,PROT_READ | PROT_WRITE,MAP_SHARED,file_fd,page_size);
if(map == MAP_FAILED)
perror("mmap");
return 3;
strcpy(map, buffer);
munmap(map, page_size);
close(file_fd);
return 0;
【问题讨论】:
使用调试器(所以使用gcc -Wall -g
编译并使用gdb
进行调试)
你有一个变量page_size
,但你似乎在调用mmap()
时使用了pege_size
mmap()
中的 addr
应该是 NULL
而不是 0
。
谢谢。我尝试了 null 的 addr 但结果没有改变。
【参考方案1】:
您正在创建一个新的零大小文件,您无法使用 mmap 扩展文件大小。当您尝试在文件内容之外写入时,您会收到总线错误。
使用例如文件描述符上的fallocate() 用于在文件中分配空间。
请注意,您还将 page_size 作为偏移量传递给 mmap,这在您的示例中似乎没有多大意义,您必须首先将文件扩展为 pagesize + strlen(buffer) + 1
如果您想写 @ 987654323@ 在那个位置。您更有可能希望从文件开头开始,因此将 0 作为最后一个参数传递给 mmap。
【讨论】:
谢谢,你为我节省了很多时间 :) 顺便说一句,因为我在这里遇到了类似的情况,但在我的情况下,我 was 正在执行 fallocate - 但是在这种情况下磁盘(ram disk)已满- 内存访问成功后 fallocate 和 mmap 总线出错。只需要注意一个 8) @nos,感谢您的出色解决方案。 你先生,是一个真正的传奇以上是关于总线错误打开和映射文件的主要内容,如果未能解决你的问题,请参考以下文章
使用cmd打开java文件,报错:“错误,编码GBK的不可映射字符”
在文件作为 RandomAccessFile 打开并映射为 MappedByteBuffer 后重命名文件
在 Windows 上的 PyTorch 中使用“多处理”出现错误-“无法打开共享文件映射:<torch_13684_4004974554>,错误代码:<0>”