mmap函数中MAP_SHARED和MAP_PRIVATE有什么区别?

ntl*_*0ve 13 c linux mmap

用打转转mmap了它的乐趣,我有以下代码:

(.. snip ..)
fd = open("/home/me/straight_a.txt", O_RDONLY);
if (fd == -1) {
    perror("open");
    exit(1);
}

m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0);

if (m == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

printf("m is %p\n", m);

printf("*m = %c\n", *m);
printf("*(m+1) = %c\n", *(m+1));
(.. snip ..)
Run Code Online (Sandbox Code Playgroud)

这按预期工作.但在我做到这一点之前,我试过......

m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
Run Code Online (Sandbox Code Playgroud)

...和mmap错误地用:

mmap: Permission denied
Run Code Online (Sandbox Code Playgroud)

一般来说,两个标志之间的区别是什么(手册页对这个主题不慷慨)?我遗失了什么样的许可(以及在哪里)?

编辑

喜欢它通常发生..部分想通了.

结果open需要O_RDWR一面旗帜.

那么,我是否正确地假设:

  • MAP_PRIVATE - 更改仅在内存中进行,而不是保存到磁盘?
  • MAP_SHARED - 更改将保存到磁盘...

...但我想,我不会把任何东西保存在磁盘上.只是在内存上运行.

kar*_*ski 14

您以只读模式打开文件.然后,您试图在设置了MAP_SHARED的情况下以读/写模式对其中的一部分进行映射.在此上下文中,MAP_SHARED意味着如果您写入mmap'd区域,您的更改将提交回映射文件本身.您无法执行此操作,因为您以只读模式打开了文件.

MAP_PRIVATE有效,因为对mmap'd区域的写入未提交回原始文件.当您写入区域时,写入的页面将复制到不同的内存区域,可能由交换空间支持.


小智 8

对MAP_SHARED段的写入将传递到基础文件.您使用O_RDONLY打开了文件,该文件与PROT_WRITE标志冲突,从而阻止MAP_SHARED能够写回文件.

MAP_PRIVATE不会将写入带回基础文件,因此您打开文件O_RDONLY的事实不是问题.

  • 得到它了。还发现了“ msync”,它承诺强制执行刷新/同步。谢谢。 (2认同)