linux – 总线错误打开和mmap’ing文件

我想创建一个文件并将其映射到内存中.我认为我的代码可以工作,但是当我运行它时,我得到一个“总线错误”.我搜索谷歌,但我不知道如何解决问题.这是我的代码
#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;
}

解决方法

您正在创建一个新的零大小的文件,您无法使用mmap扩展文件大小.当您尝试在文件内容之外写入时,您将收到总线错误.

使用例如fallocate()在文件描述符上分配文件中的空间.

请注意,您还将page_size作为偏移量传递给mmap,这在您的示例中似乎没有多大意义,如果要编写buf,则必须先将文件扩展到pagesize strlen(buffer)1在那个位置.您更希望从文件的开头开始,因此将0作为mmap的最后一个参数传递.

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...