2011-04-16 58 views
2

我試圖使用mmap讀取使用的1024我需要幫助輸入塊文件到MMAP

這裏塊是一個代碼片段文件....

numberOfBuffers = filesize/buffersize; 
if (filesize % buffersize) 
{ 
    numberOfBuffers++;  
} 

for (i = 0; i < numberOfBuffers; i++) { 
    if((map = mmap(NULL, buffersize, PROT_READ, MAP_PRIVATE, fd, i * buffersize)) == MAP_FAILED) { 
     perror("map failed"); 
    } 

    if(munmap(map, buffersize) == -1) { 
      perror("unmap failed"); 
    } 
} 

我在第二次迭代中獲得「非法參數」錯誤。

我期待了解mmap以及如何通過已定義的緩衝區大小迭代mmap的幫助。

+0

「...似乎是......」 - 不要猜測,請確保。 – Mat 2011-04-16 23:40:41

+0

我認爲'if(numberOfBuffers%buffersize)'應該是'if(fileSize%buffersize)' – MByD 2011-04-16 23:41:03

+0

對不起......我在第一個if語句後有一個打印語句,它只打印一次,然後我得到'非法參數'錯誤。 – Tony 2011-04-16 23:43:40

回答

4

mmap手冊頁:

偏移必須是頁面大小的倍數通過的sysconf(_SC_PAGE_SIZE)返回。

如果系統(特別是x86)是4k(4096字節),頁面大小很多。所以第一次調用會成功(偏移量爲0),但第二次調用將失敗(偏移量1024無效)。

嘗試將您的塊大小更改爲4096(或任何頁面大小在您的平臺上,或更好的,使用sysconf來獲取該信息)。

+0

就是這樣,一旦我使用了4096或者多個,它就可以工作。感謝您的幫助。我現在明白了這一點。 – Tony 2011-04-17 00:02:31