[英]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.