我有一个关于MAP_PRIVATE的查询。一旦我用MAP_PRIVATE映射一个区域,我知道我所做的更改对其他进程是不可见的。但我只是想确保如果某个其他进程也在同一个实例上运行,如果它对mmap文件进行了一些修改,那么这些更改在我的进程中是可见的(使用MAP_PRIVATE映射它)。
基本上我的要求是我想在我的应用程序中的某个时刻mmap一个文件,条件是在我的任务完成之前,我的进程中不应该看到其他进程对该文件所做的更新。那么我可以安全地使用MAP_PRIVATE对其进行mmap吗?
谢谢, 拉姆
答案 0 :(得分:1)
仔细阅读并多次阅读mmap(2)手册页。
MAP_PRIVATE Create a private copy-on-write mapping. Updates to the mapping are not visible to other processes mapping the same file, and are not carried through to the underlying file. It is unspecified whether changes made to the file after the mmap() call are visible in the mapped region.
所以你在"未指明"情况下
您需要在其他进程(写入文件)和进程之间进行一些同步。请参阅sem_overview(7)和mlock(2)以及msync(2)
如果其他进程是任意的(并且你无法改变他们的行为),你就会陷入困境。 这是Unix文件的理念:任意进程可以同时写入同一个文件,但是发生的事情并不总是指定(并且可能依赖于文件系统)。如果你想要多个进程写入同一个文件,他们应该以某种方式同步和合作(例如锁定flock(2)或lockf(3)等等。)。
也许你应该使用一些数据库系统而不是普通文件!例如。 sqlite会为您做一些同步(假设当然所有进程正在使用sqlite
写入公共文件...)