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
手册将错误码描述为:
EACCES A file descriptor refers to a non-regular file. Or a file map‐
ping was requested, but fd is not open for reading. Or
MAP_SHARED was requested and PROT_WRITE is set, but fd is not
open in read/write (O_RDWR) mode. Or PROT_WRITE is set, but the
file is append-only.
因此,第二句话记录了这种行为。但是背后的原因是什么呢?
POSIX是否允许?
这是内核还是库的限制?(快速查看,我在Linux/mm/mmap.c中没有找到任何明显的东西)