2013-05-31 182 views
1

我想映射文件的某些部分到內存中,爲此我必須使用mmap()。 (項目的REC t) 我打開該文件:mmap()總是返回-1

file = open(fileName, O_RDWR, 0) 

和它打開regulary(文件!= -1)。

然後,內爲(),我嘗試配圖:

char *res; 
res = (char*)mmap((void*)sectionHeads[i].adr, sectionHeads[i].size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, file, sectionHeads[i].offset); 

sectionHead包含地址ADR(INT)等。但我總是得到-1。我檢查了一下,那部分內存應該是免費的。我究竟做錯了什麼?

注意:這是我第一次使用mmap(),稍後我會考慮標誌,但現在我只想映射如果只有一個節。部分包含有效值,再次檢查。

更新:建議我打電話perror ("mmap error");看看錯誤是什麼,我得到mmap error: Invalid argument。第一部分頭的adr值,大小和偏移量爲:adr = 8154 size = 13 offset = 154。我也拋出了MAP_ANON。什麼論據是無效的?有沒有辦法看到這個?

+2

因此,請檢查'errno'。 – kirelagin

+0

要添加到@ kirelagin的評論:只要你檢測到'mmap()'已經返回-1,即'perror(「mmap error」),就調用'perror()'' - 它會告訴你什麼錯誤代碼是。 –

回答

3

你在做什麼錯是沒有檢查到底是什麼錯誤。出錯時,mmap()不僅會返回MAP_FAILED(我建議您使用它來代替-1),但它也會將errno設置爲適當的值。所以你可以自己檢查errno或者使用perror()來打印錯誤描述,它可以回答你的問題(並且節省你很多時間;))。除此之外,MAP_ANONYMOUSMAP_SHARED一起使用僅在內核2.4以後的Linux上受支持;也許你有一箇舊版本的Linux內核?

+0

我得到mmap「錯誤:無效的參數」。我從一個部分頭的參數是: adr = 8154 size = 13 offset = 154。作爲一項預防措施,我也拋出了MAP_ANON。任何想法哪個論點是無效的? –

+1

@InvaderZim:你甚至沒有閱讀[手冊頁](http://man7.org/linux/man-pages/man2/mmap.2.html),是嗎?例如,您的偏移量不是頁面大小的倍數。如果您要創建匿名映射,則不清楚爲什麼需要文件。映射地址的開始看起來不正確...繼續挖掘。 – 2013-05-31 14:48:18

+0

我明白偏移量的問題,但爲什麼地址看起來有問題?另外,有沒有一種方法來映射數組中的字節?在我到達mmap節之前,我讀取了我需要的文件中的所有字節。這樣我就消除了偏移量,並使其成爲頁面大小的倍數等。 –