簡體   English   中英

mmap() 導致 C 中的分段錯誤

[英]mmap() causing segmentation fault in C

我很確定我的錯誤非常明顯,但我似乎無法找到問題所在。

我正在學習如何在 C 中使用mmap() ,一切對我來說都是正確的,但是我遇到了分段錯誤。

這是我的代碼:

int n=50;
char * tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED, -1, 0);

for(int i=0; i<n; i++)
{
   tab[i] = 1;
}

使用valgrind ,我在執行tab[i]=1的行收到一條錯誤消息,提示“大小 1 的無效寫入”,(我曾嘗試將1替換為'1'認為 char 的大小可能小於int ,但仍然得到相同的錯誤),然后是“地址0xfffff..ff不是堆棧的、malloc 的或(最近)釋放的”。

我不知道我的錯誤在哪里。 有人可以幫我找到嗎?

來自man 2 mmap

文件映射的內容(與匿名映射相反;請參閱下面的MAP_ANONYMOUS )使用從文件描述符fd引用的文件(或其他對象)中的偏移offset開始的length字節進行初始化。

我想您正在嘗試創建一個匿名映射(即不受文件支持)。 在這種情況下,您需要MAP_ANONYMOUS添加到flags ,否則系統將嘗試從指定的fd讀取,這是無效的 ( -1 ) 並且會失敗。

正確的代碼是:

char *tab = mmap(NULL, n, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (tab == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

對於未來,請注意,如果返回值指示失敗,您可以像上面一樣通過簡單地調用perror()輕松檢測錯誤。 在您的情況下,它應該打印以下內容:

mmap: Bad file descriptor

再次檢查手冊,您可以在“錯誤”部分看到:

EBADF : fd不是有效的文件描述符(並且未設置MAP_ANONYMOUS )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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