【发布时间】:2012-03-01 16:07:53
【问题描述】:
为了好玩而玩弄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 ..)
这按预期工作。但在此之前,我尝试过......
m = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);
... 和 mmap 出错:
mmap: Permission denied
一般来说,这两个标志之间有什么区别(手册页在这个主题上不是很慷慨)?我缺少什么样的权限(以及在哪里)?
编辑
就像它通常发生的那样......部分弄清楚了。
原来open 需要一个O_RDWR 标志。
那么,我的假设是否正确:
- MAP_PRIVATE - 更改仅在内存中进行,不保存到磁盘?
- MAP_SHARED - 更改将保存到磁盘...
...但我没有在任何地方保存任何东西到磁盘,我想?只是在内存上操作。
【问题讨论】:
-
, O_RDONLY);该文件是只读的。它不能用作PROT_READ|PROT_WRITEmmap()ed 区域的后备存储,因为它不可写。MAP_PRIVATE映射不需要写入文件(该文件仅用于读取,可能是由 COW 使用的) 注意:我不希望波浪号扩展适用于 open(2)。如果它有效,我会感到惊讶。 -
对,这只是从那里获取真正的基本目录的快速方法,甚至没有考虑过。谢谢,为了正确起见已修复。