为什么带有PROT_WRITE的mmap(2)只需要一个可读的fd?

时间:2013-11-29 17:16:50

标签: posix mmap

来自mmap上的POSIX(IEEE标准1003.1-2008)section

  

无论指定的保护选项如何,文件描述符fildes都应以读取权限打开。

为什么?看起来像打开O_WRONLY并且使用PROT_WRITE映射而不是PROT_READ的描述符在权限方面不应该有问题,对吗?

2 个答案:

答案 0 :(得分:0)

但下一行说明:

If PROT_WRITE is specified, the application shall ensure that it has opened the file descriptor fildes with write permission unless MAP_PRIVATE is specified in the flags parameter as described below.

我认为您引用的行意味着至少应该以读取权限打开文件的文件描述符。显然应用程序应该确保首先授予适当级别的权限。

为了尝试这个,我在READ ONLY模式下打开文件并将该描述符传递给mmap。

fd= open(file_name,O_RDONLY);  
mappedData = mmap(0,fdstat.st_size,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);

但是当我运行程序时会抛出错误,即:

  

mmap:权限被拒绝

编辑: 对不起,我误解了你的问题。

答案 1 :(得分:0)

我认为这不是因为权限,而是因为虚拟内存内部:实际RAM页面的分配是由首次访问mmaped页面时的页面错误触发的。这些页面填充了映射文件的内容。用零填充它们(如果O_WRONLY打开文件被映射PROT_WRITE)将是一个合理的实现,但它可能没有很多真实世界的应用程序。

例如,如果页面中只有几个字节发生了变化,那么整个页面仍然会在msync()munmap()上进行处理。这意味着如果只写文件被加密和修改,那么它将有效地trash"垃圾"真实的文件,除非整个页面在momory中正确填充数据。

据我所知,页面不需要是4KB或其他值,因此正确使用这种映射功能会很棘手。