mmap

时间:2017-10-08 04:43:27

标签: linux mmap

尝试写入内存时出现总线错误(核心转储)。我想在Linux中使用mmap()和open()函数写入二进制文件。我希望通过将其映射到内存而不是直接写入文件,在二进制文件中写入1到100的整数。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#define FILE_SIZE 0x100

int main(int argc,char *argv[])
{

    int fd;
    void *pmap; 

    printf("im here");
    //fd=open(argv[1],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
    fd=open("numbers.raw",O_RDWR);

    if(fd == -1)
    {
        perror("open");
        exit(1);
    }

    lseek(fd,FILE_SIZE+1,SEEK_SET); //checking the file length
    lseek(fd,0,SEEK_SET);//points to start of the file

    //create the memory mapping
    pmap = mmap(0,FILE_SIZE,PROT_WRITE,MAP_SHARED,fd,0);



    if(pmap == MAP_FAILED)
    {
        perror("mmap")  ;
        close(fd);
        exit(1);
    }

    close(fd);

    for(int i=1;i<=100;i++)
        sprintf(pmap,"%d",i);

    return 0;

}

1 个答案:

答案 0 :(得分:0)

您的评论说您“正在检查文件长度”,但您从不检查该呼叫的返回值。我敢打赌它是失败的,因为你的文件不够大,因此后来的总线错误。 您的文件中还有其他多个不相关的错误     方式:

  1. 您的文件大小假设0x100字节足以以二进制形式存储100个整数。对于64位系统,情况并非如此。
  2. 您实际上并不存储二进制数字 - 您正在存储数字的字符串。
  3. 你没有在你写的地方前进,所以你在文件的开头写下所有数字,一个在另一个上面。