用打转转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一面旗帜.
那么,我是否正确地假设:
...但我想,我不会把任何东西保存在磁盘上.只是在内存上运行.
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的事实不是问题.