我正在尝试编写一个程序,使用'mmap'为学校读取文件。我在创建地图时遇到了一些困难。具体来说,我遇到了分段错误。我不确定我在这里做错了什么,所以一些具体的帮助将不胜感激。谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int main(int argc, char* argv[])
{
printf("Hello world!\n");
FILE* fp;// File pointer
int fd;// File descriptor
size_t size;// Length of the file
char* map;// File mmap
/* Open the file */
fp = fopen("data.txt", "r+");
/* Get the file descriptor */
fd = fileno(fp);
printf("FD: %d\n", fd);
/* Get the size of the file */
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
printf("SIZE: %d\n", size);
/* Map the file with mmap */
map = mmap(NULL, size, PROT_READ, 0, fd, 0);
if (map == MAP_FAILED)
{
printf("MMAP FAILED\n");
} else {
printf("MMAP SUCEEDED\n");
}
/* Do something with the map */
int i;
for (i = 0; i < size; i++)
{
char c;
c = map[i];
putchar(c);
}
fclose(fp);
return(0);
}
答案 0 :(得分:3)
您没有指定任何内容作为flag参数,您必须指定MAP_PRIVATE
或MAP_SHARED
指定here:
flags参数确定是否对映射进行更新 映射相同区域的其他进程可见,以及是否 更新将传递到基础文件。通过在flags中恰好包含以下值之一来确定此行为:
MAP_SHARED
分享此映射。可以看到对映射的更新 映射此文件的其他进程,并继续执行 底层文件。 (准确控制何时更新 贯彻到底层文件需要使用 的msync(2)。)
MAP_PRIVATE
创建私有的写时复制映射。更新 映射对于映射相同的其他进程是不可见的 文件,并没有传递到底层文件。它 未指定是否对文件进行了更改 mmap()调用在映射区域中可见。
在您的情况下,由于您只是阅读文件,MAP_PRIVATE
应该足够了。
尝试:
map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);