mmap():如果底层文件发生变化(收缩)会发生什么?

时间:2011-07-29 15:54:19

标签: c++ linux mmap

如果你的内存使用mmap()映射文件,但是底层文件会变得更小。如果访问从文件中删除的内存偏移量会发生什么?

3 个答案:

答案 0 :(得分:4)

IBM表示未定义http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fapis%2Fmmap.htm

  

如果在mmap()之后映射文件的大小减小,则尝试在文件结尾之后引用是未定义的,并且可能导致MCH0601异常。

     

如果mmap()函数完成后文件的大小增加,则无法通过映射访问文件原始结尾之外的整个页面。

在SingleUnixSpecification中也是如此:http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html

  

如果映射文件的大小在调用mmap()后由于映射文件上的某些其他操作而发生更改,则引用映射区域的部分对应于<的添加或删除部分的效果strong>文件未指定。

'undefined'或'unspecified'表示 - 允许操作系统开始格式化磁盘或任何东西。最可能的是SIGSEGV - 杀死你的应用程序。

答案 1 :(得分:0)

根据手册页,当您尝试访问对于当前文件映射来说太大的地址时,mmap会返回EINVAL错误。

“dnotify”和“inotify”是Linux内核中当前的文件更改通知服务。 据推测,他们会通知mmap子系统文件的更改。

答案 2 :(得分:0)

这取决于您为mmap提供的标志,手册页:

  

MAP_SHARED分享此映射。可以看到对映射的更新   映射此文件的其他进程,并将其传递给   底层文件。在msync(2)之前,文件实际上可能不会更新   或者叫munmap()。

  

MAP_PRIVATE创建私有的写时复制映射。更新   映射对于映射同一文件的其他进程是不可见的   不会传递到底层文件。它没有具体说明   mmap()调用后对文件所做的更改是否可见   映射区域。

因此对于MAP_PRIVATE来说,无所谓,每个作家都有一个“私人”副本。 (虽然只有在发生变异操作时才会复制。)

认为如果您使用MAP_SHARED,则不允许其他进程使用write特权打开该文件。但这是猜测。

编辑:ninjalj是对的,即使您mmap MAP_SHARED,也可以修改该文件。