簡體   English   中英

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()

您不能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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM