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!!!
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!!!