gpt4 book ai didi

c - 写入 mmap 文件时出现总线错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:47 25 4
gpt4 key购买 nike

尝试使用 mmap 写入文件。不幸的是,循环中的第一个写入 map[i] = i; 将导致总线错误。不知道为什么。

PC 运行 Ubuntu 14.04,文件 /tmp/mmapped.bin 有 12 个字节,程序调用 ./a.out 3

谢谢

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

#define FILEPATH "/tmp/mmapped.bin"
//#define NUMINTS (1000)
#define FILESIZE 0x400000000

int main(int argc, char *argv[])
{
int i;
int fd;
int *map; /* mmapped array of int's */
int size = atoi(argv[1]);
fd = open(FILEPATH, O_RDWR| O_CREAT | O_TRUNC);
if (fd == -1) {
perror("Error opening file for reading");
exit(EXIT_FAILURE);
}

map = mmap(0, 4 * size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
close(fd);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}

for (i = 1; i <= size; ++i) {
map[i] = i;
}

if (munmap(map, FILESIZE) == -1) {
perror("Error un-mmapping the file");
}
close(fd);
return 0;
}

最佳答案

在 c 中,您需要从索引 0 开始。因为它只会将指针增加 i 的量,然后取消引用它。您的代码取消引用超出允许范围的指针。

应该是,

for (i = 0; i < size; ++i) {
map[i] = i;
}

因为它等同于

for (i = 0; i < size; ++i) {
*(map + i) = i;
}

另外,使用

map = mmap(0, size * sizeof *map, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

确保分配足够的空间并且 *(map + i) 将在边界内。不要使用魔数(Magic Number)。

关于c - 写入 mmap 文件时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45244402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com