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

linux – 总线错误打开和mmap’ing文件,第1张

概述我想创建一个文件并将其映射到内存中.我认为我的代码可以工作,但是当我运行它时,我得到一个“总线错误”.我搜索谷歌,但我不知道如何解决问题.这是我的代码: #include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <errno.h>#include <sys/types.h>#include <unistd.h>#in 我想创建一个文件并将其映射到内存中.我认为我的代码可以工作,但是当我运行它时,我得到一个“总线错误”.我搜索谷歌,但我不知道如何解决问题.这是我的代码:
#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 – 总线错误打开和mmap’ing文件全部内容,希望文章能够帮你解决linux – 总线错误打开和mmap’ing文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1046173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存