总线错误打开和映射文件

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>”

VS 创建虚拟目录失败,映射到其他文件夹!

STM32的GPIO 7个寄存器地址是多少 映射地址怎么设置