我需要帮助将文件分块输入到mmap中。

4

我正在尝试使用mmap按1024字节的块读取文件。

下面是代码片段...

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的帮助。


“appears to be” - 看起来似乎是 - Mat
我认为这个 if (numberOfBuffers % buffersize) 应该改成 if (fileSize % buffersize) - MByD
抱歉...我在第一个if语句后面加了一个打印语句,它只打印了一次,然后我就收到了“非法参数”错误。 - Tony
1个回答

6

根据 mmap 的手册:

偏移量必须是由 sysconf(_SC_PAGE_SIZE) 返回的页面大小的倍数。

在许多系统(尤其是x86)上,页面大小为4k(4096字节)。因此第一个调用将成功(使用偏移量0),但第二个调用将失败(偏移量1024无效)。

尝试将您的块大小更改为4096(或者在您的平台上页面大小是多少,或者更好地使用 sysconf 来获取该信息)。


就是这样,一旦我使用了4096或其倍数,它就可以工作了。感谢您的帮助。现在我对此有了更深入的理解。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接