IBM表示,如果在mmap()之后映射文件的大小减小,尝试引用文件末尾之外的内容是未定义的,可能会导致MCH0601异常。
如果mmap()函数完成后文件的大小增加,则原始文件末尾之外的整个页面将无法通过映射访问。
SingleUnixSpecification中也有同样的说法:http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html
'如果映射文件的大小由于对映射文件的其他操作而发生更改,则对应于添加或删除文件部分的映射区域的引用的影响是未指定的。
'undefined'或'unspecified'的意思是 - 操作系统允许开始格式化磁盘或其他内容。最可能的情况是SIGSEGV会终止您的应用程序。
'这取决于您给mmap
什么标志,手册页面如下:
MAP_SHARED 共享此映射。对映射的更新对于映射此文件的其他进程是可见的,并传递到底层文件。实际上,直到调用msync(2)或munmap()才可能更新文件。
和
MAP_PRIVATE 创建一个私有的写时复制映射。对映射的更新对于映射同一文件的其他进程不可见,并且不会传递到底层文件。未指定在mmap()调用之后对文件所做的更改是否在映射区域中可见。
因此,对于MAP_PRIVATE
,无论如何,每个编写器都有一个“私有”副本。(但只有在发生变异操作时才会复制)。
我认为如果您使用MAP_SHARED
,则不允许其他进程以写权限打开该文件。但这只是猜测。
编辑:ninjalj是正确的,即使您使用MAP_SHARED
,文件也可以被修改。
根据man页面,当您尝试访问对于当前文件映射来说太大的地址时,mmap会返回EINVAL错误。
"dnotify"和"inotify"是Linux内核中当前的文件更改通知服务。它们可能会通知mmap子系统文件的更改。
SIGBUS
信号。 - Matthew Hall