C语言 如果请求的Map大小大于文件大小,mmap()应该如何操作?

xlpyo6sf  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(174)

据我所知,mmap()用于将文件批量加载到内存中。因此,它们可以这样使用:

// Assuming PAGE_SIZE == 4096
int fd = open("/some/large/resource", O_RDONLY);
void *buffer = mmap(NULL, 8192, PROT_READ, MAP_SHARED, fd, 0);
// Use buffer
munmap(buffer, 8192);

这应该达到类似的效果,并且表面上比这更快:

int fd = open("/some/large/resource", O_RDONLY);
void *buffer = malloc(8196);
read(fd, buffer, 8196);
// Use buffer
free(buffer);

如果/some/large/resource实际上不是8192字节,而是4096字节,会发生什么?一整页内存变小?对于第二种情况,read()将返回4096,表示许多字节已成功读取,缓冲区的其余部分将是不确定但有效的写入空间。
”””但什么是(应该?)发生在mmap()的情况下?**发生的事情是否取决于flags,即如果我使用MAP_PRIVATE而不是MAP_SHARED?下一页的内存是否不可访问?内存是否可以访问,但不确定,就像malloc()/read()的情况一样?内存会清零吗?

**免责声明:**这是How to correctly use mmap() and newBufferWithBytesNoCopy together?的后续问题,我问这个新问题是为了确定旧问题中描述的问题是mmap()问题还是其他问题。

oug3syen

oug3syen1#

访问mmap区域中但完全超出文件大小的页面将导致总线错误。
mmap函数将成功,返回一个似乎正确的指针。
但如果访问文件外页,则会出现总线错误。
在man mmap中:
SIGBUS试图访问位于Map文件末尾之外的缓冲区页。

相关问题