mmap()是否应该能够为O_WRONLY打开的文件创建只写映射?

我问是因为在Linux 4.0.4 x86-64系统(strace日志)上,以下操作失败:

mkdir("test", 0700)          = 0
open("test/foo", O_WRONLY|O_CREAT, 0666) = 3
ftruncate(3, 11)                        = 0
mmap(NULL, 11, PROT_WRITE, MAP_SHARED, 3, 0) = -1 EACCES (Permission denied)
errno等于EACCESS

O_WRONLY替换打开标志的O_RDWR会产生成功的映射。

Linux mmap手册页将errno记录为:



因此,第二句记录了该行为。

但是其背后的原因是什么?

POSIX允许吗?

是内核还是库限制? (快速浏览,我在Linux/mm/mmap.c中找不到任何明显的东西)

最佳答案

编辑
IEEE Std 1003.1, 2004 Edition (POSIX.1 2004)似乎禁止这样做。

(强调)
同样,在x86上,不可能有只写存储器,这是页表条目的限制。页面可以标记为只读或可读写,并且可以独立地是可执行的或不可执行的,但不能是只写的。此外,mprotect()的手册页还说:

在这种情况下,您已经打开了没有读取访问权限的文件描述符,但是mmap()将通过赋予O_WRONLY权限来绕过PROT_READ。相反,它将使用EACCESS完全拒绝。

关于linux - 只写映射O_WRONLY打开的文件应该起作用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31014515/

10-15 22:22