[英]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()
您不能fclose()
从open()
获得的文件描述符。 您必须改为使用close(fp)
。 您要做的是传递一个被当作指针的小int
。 这会导致分段错误。
注意,不幸的是您选择的标识符命名。 通常, fp
是指向文件的指针(标准IO库使用的FILE*
),而fd
是内核的IO系统调用使用的文件描述符(一个小整数)。
您的编译器应该告诉您,您传递了一个预期指向文件的指针的int
,或者您在范围内没有原型的情况下使用了fclose()。 您是否启用了编译器的最大警告级别?
如果data
指针未指向以NUL(0)终止的字符串,则可能会发生另一个段错误。 您的log.txt
是否包含NUL终止的字符串?
您还应该检查mmap()
无法返回MAP_FAILED
。
mmap的手册页为您提供有关参数的信息:
void * mmap(void * addr,size_t长度,int prot,int标志,int fd,off_t偏移量);
如您所见,您的第二个参数可能是错误的(除非您确实希望将一部分文件准确地映射到单个页面中)。
另外:可能0
不是有效的标志值? 让我们再次看一下手册页:
flags参数确定对映射的更新是否对映射同一区域的其他进程可见,以及是否将更新进行到基础文件。 通过在标志中完全包含以下值之一来确定此行为:MAP_SHARED或MAP_PRIVATE
所以你可以尝试像
data = mmap(0, size, PROT_READ, MAP_SHARED, fp, 0);
始终使用提供的标志,因为基础值可能因计算机而异。
另外,映射区域不应大于基础文件。 事先检查log.txt
的大小。
好的,这是使它起作用的代码
#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();”之前 谢谢蜜蜂!
mmap
的第二个参数不应为页面大小,而应为文件的大小。 这是一个很好的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.