MMAP 分段错误

MMAP segmentation fault

int  fp, page;
char *data;

if(argc > 1){
    printf("Read the docs");
    exit(1);
}

fp = open("log.txt", O_RDONLY); //Opening file to read 
page = getpagesize();
data = mmap(0, page, PROT_READ, 0,fp, 0);

initscr(); // Creating the ncurse screen
clear();
move(0, 0); 
printw("%s", data);
endwin(); //Ends window
fclose(fp); //Closing file 
return 0;

这是我的代码,由于某种原因,我一直遇到分段错误。 我所有的头文件都包含在内,所以这不是问题(显然,因为它与内存有关)。提前致谢。

编辑:知道了 - 它没有被格式化为字符串。并且还必须使用 stat() 而不是 getpagesize()

来获取文件信息

mmap 的第二个参数不应该是页面大小,它应该是您的文件的大小。 Here 是一个很好的例子。

mmap's man page给你参数的信息:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

如您所见,您的第二个参数 可能 是错误的(除非您真的想准确地将文件的一部分映射到一个页面中)。

另外:可能 0 不是有效的标志值?让我们再看看手册页:

The flags argument determines whether updates to the mapping are visible to other processes mapping the same region, and whether updates are carried through to the underlying file. This behavior is determined by including exactly one of the following values in flags: MAP_SHARED or MAP_PRIVATE

所以你可以试试

data = mmap(0, size, PROT_READ, MAP_SHARED, fp, 0);
  • 始终使用提供的标志,因为基础值可能因机器而异。

  • 另外,映射区域不能大于底层文件。事先检查 log.txt 的大小。

您不能 fclose()open() 获得的文件描述符。您必须改用 close(fp)。您所做的是传递一个被视为指针的小 int。这会导致分段错误。

请注意,您选择的标识符命名很不合适。通常 fp 是指向文件的指针(FILE*,标准 IO 库使用),而 fd 是文件描述符(一个小整数),由内核的 IO 系统调用。

您的编译器应该告诉您您传递了一个 int ,其中需要一个指向文件的指针,或者您使用 fclose() 而没有范围内的原型。您是否启用了编译器的最大警告级别?

如果 data 指针不指向以 NUL (0) 结尾的字符串,则可能会出现另一个段错误。您的 log.txt 是否包含以 NUL 结尾的字符串?

您还应该检查 mmap() 是否无法返回 MAP_FAILED

好的,这是让它工作的代码

#include <sys/stat.h>
int status;
struct stat s;
status = stat(file, &s);

if(status < 0){
    perror("Stat:");
    exit(1);

data = mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);

在我使用之前'getpagesize();'谢谢beej!!!