如果你的内存使用mmap()映射文件,但是底层文件会变得更小。如果访问从文件中删除的内存偏移量会发生什么?
答案 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
,也可以修改该文件。