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/