MSYNC - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-06-09
名称
msync-将文件与内存映射同步
语法
#包括
int msync(void * addr,size_t长度,int标志);
说明
msync()将对使用mmap(2)映射到内存中的文件的核内副本所做的更改刷新回文件系统。如果不使用此调用,则不能保证在调用munmap(2)之前将更改写回。更准确地说,文件的与存储区相对应的部分(从addr开始并具有长度length)被更新。
flags参数应确切指定MS_ASYNC和MS_SYNC之一,并且可以另外包含MS_INVALIDATE位。这些位具有以下含义:
- MS_ASYNC
- 指定安排更新,但调用立即返回。
- MS_SYNC
- 请求更新并等待更新完成。
- MS_INVALIDATE
- 要求使同一文件的其他映射无效(以便可以使用刚写入的新值来更新它们)。
返回值
成功时,返回零。如果出错,则返回-1,并正确设置errno。
错误说明
- EBUSY
- 在标志中指定了MS_INVALIDATE,并且对于指定的地址范围存在内存锁定。
- EINVAL
- addr不是PAGESIZE的倍数;或MS_ASYNC以外的任何其他位| MS_INVALIDATE | MS_SYNC在标志中设置;或MS_SYNC和MS_ASYNC都在标志中设置。
- ENOMEM
- 指示的内存(或其一部分)未映射。
遵循规范
POSIX.1-2001,POSIX.1-2008。
此调用是在Linux 1.3.21中引入的,然后使用EFAULT代替ENOMEM。在Linux 2.4.19中,将其更改为POSIX值ENOMEM。
在可以使用msync()的POSIX系统上,_POSIX_MAPPED_FILES和_POSIX_SYNCHRONIZED_IO都定义为大于0的值。(另请参见sysconf(3)。)
备注
根据POSIX,必须在标志中指定MS_SYNC或MS_ASYNC,实际上,如果不包含这些标志之一将导致msync()在某些系统上失败。但是,Linux允许调用msync(),该调用既不指定这些标志,也不具有(当前)等价于指定MS_ASYNC的语义。 (自Linux 2.6.19起,MS_ASYNC实际上是禁止操作的,因为内核会正确跟踪脏页并根据需要将它们刷新到存储中。)尽管Linux行为良好,但可移植,面向未来的应用程序应确保它们指定了MS_SYNC或MS_ASYNC中的标志。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。