- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
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 记录为:
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
中找不到任何明显的内容)
最佳答案
IEEE Std 1003.1, 2004 Edition (POSIX.1 2004)似乎禁止它。
An implementation may permit accesses other than those specified by
prot
; however, if the Memory Protection option is supported, the implementation shall not permit a write to succeed wherePROT_WRITE
has not been set or shall not permit any access wherePROT_NONE
alone has been set. The implementation shall support at least the following values ofprot
:PROT_NONE
,PROT_READ
,PROT_WRITE
, and the bitwise-inclusive OR ofPROT_READ
andPROT_WRITE
. If the Memory Protection option is not supported, the result of any access that conflicts with the specified protection is undefined. The file descriptorfildes
shall have been opened with read permission, regardless of the protection options specified. IfPROT_WRITE
is specified, the application shall ensure that it has opened the file descriptorfildes
with write permission unlessMAP_PRIVATE
is specified in theflags
parameter as described below.
(强调)
此外,在 x86 上,不可能有只写内存,这是页表条目的限制。页面可以被标记为只读或读写,并且独立地可以是可执行的或不可执行的,但不能是只写的。此外,mprotect()
的手册页说:
Whether
PROT_EXEC
has any effect different fromPROT_READ
is architecture- and kernel version-dependent. On some hardware architectures (e.g., i386),PROT_WRITE
impliesPROT_READ
.
在这种情况下,您打开了一个没有读取权限的文件描述符,但是 mmap()
会通过给您 PROT_READ< 来绕过
权利。相反,它会使用 O_WRONLY
/EACCESS
直接拒绝。
关于linux - 只写映射一个 O_WRONLY 打开的文件应该工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31014515/
mmap() 是否应该能够创建一个O_WRONLY 打开文件的只写映射? 我问是因为以下在 Linux 4.0.4 x86-64 系统上失败(strace 日志): mkdir("test", 070
mmap() 是否应该能够创建一个O_WRONLY 打开文件的只写映射? 我问是因为以下在 Linux 4.0.4 x86-64 系统上失败(strace 日志): mkdir("test", 070
#include #include #include #include #include char data [ 6 ]; main ( ) { int len; desc = open (
这是我的简单代码,它打开一个命名管道,向其中写入一个字符串,然后关闭管道。管道是在另一个函数中创建的,如下所述。 char * ipcnm = "./jobqueue"; std::cout << "
在我的简单程序中: #include #include #include #include using namespace std; int main(int argc, char *argv
我需要打开一个文件进行写入。如果文件已经存在,我不想截断它。 换句话说,在纯 C 中我会这样做: int fd = open("output.bin", O_WRONLY | O_CREAT, 066
是否可以从 nodejs 访问操作系统常量 O_RDONLY、O_WRONLY、O_APPEND 等的值? 我知道它们在所有平台上都不一样,所以正确的方法是使用常量而不是依赖我当前系统中的硬编码值。
我有一个向文件追加一行的 Go 函数: func AppendLine(p string, s string) error { f, err := os.OpenFile(p, os.O_AP
我正面临标题所说的确切问题。 代码 pid_t childpid; int childfdRead, childfdWrite; // file descriptors for childs int
我知道 open 提供了这些互斥的标志:O_RDONLY、O_WRONLY 和 O_RDWR。 我想知道:如果文件以 O_RDWR 和 打开,是否存在任何性能问题(即使只是几分之一毫秒)或处理文件的不
在我的代码中,我创建了一个名为“my_fifo”的 fifo,如果我在 O_WRONLY | 中打开它的话O_NONBLOCK 模式,open() 返回 -1 和错误编号“没有这样的设备或地址”,另一
问题和标题一样,操作系统是linux。 我试过几个例子。 dup(1); close(1); int fd = open("/dev/stdout", O_WRONLY); 这导致了“/dev/std
我是一名优秀的程序员,十分优秀!