MSYNC - Linux手册页

时间:2019-08-20 17:59:01  来源:igfitidea点击:

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中的标志。

另外参见

mmap(2)

B.O. Gallmeister,POSIX.4,O'Reilly,第128-129和389-391页。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/