我一直试图了解这个标志的正确用法,但互联网上有相互矛盾的信息。
我的理解是这个标志目前在linux内核中是无操作的。 https://github.com/tinganho/linux-kernel/blob/master/mm/msync.c
由于添加了此标志而导致的任何历史原因(设计选择)?
答案 0 :(得分:0)
在msync.c
的代码中,您可以看到:
if ((flags & MS_INVALIDATE) &&
(vma->vm_flags & VM_LOCKED)) {
error = -EBUSY;
goto out_unlock;
}
基本上,我们知道正在评估MS_INVALIDATE
,如果vma
指向的当前映射被锁定,msync()
调用将失败并显示EBUSY
。
根据(来自 Linux man-pages项目的3.74版本的部分,msync(2)
)这是有道理的:
MS_INVALIDATE
要求使同一文件的其他映射无效(所以 他们可以用刚刚写好的新值来更新。
因为如果链接到vma
列表的任何文件映射被锁定,则它不能被无效,因此否则调用将失败(否则不会设置MS_INVALIDATE
标志)它将不会。
所以,现在回答你的问题,它不能被视为无操作,因为它在设置时会影响msync()
的行为。