是否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标准1003.1,2004年版
(2004年POSIX.1)
似乎禁止它。
一个实现可能允许除规定以外的访问
prot
;
但是,如果支持“内存保护”选项,则该实现将不允许PROT_WRITE
未设置的地方成功写入,或者PROT_NONE
单独设置的地方不允许任何访问。实现应支持至少以下值prot
:PROT_NONE
,PROT_READ
,PROT_WRITE
,和按位包括OR的PROT_READ
和PROT_WRITE
。如果不支持“内存保护”选项,则与指定保护冲突的任何访问的结果都是不确定的。
无论指定了什么保护选项,都应在具有读取许可的情况下打开
文件描述符fildes
。如果PROT_WRITE
如果指定了,则应用程序应确保它已打开了fildes
具有写许可权的文件描述符,除非MAP_PRIVATE
在flags
如下所述的参数中指定。
(添加了重点)
同样,在x86上,不可能有只写存储器,这是页表项的限制。页面可以标记为只读或读写,并且可以独立地是可执行的或不可执行的,但不能是只写的。此外,的手册页mprotect()
还说:
是否
PROT_EXEC
有任何不同之处PROT_READ
取决于体系结构和内核版本。在某些硬件体系结构(例如i386)上,PROT_WRITE
暗含PROT_READ
。
在这种情况下,您已经打开了没有读取访问权限的文件描述符,但是mmap()
将O_WRONLY
通过赋予您PROT_READ
权限来绕过文件描述符。相反,它将完全拒绝EACCESS
。
问题内容: 我正在尝试为各个字段使用不同的分析器设置ElasticSearch索引。但是,我似乎找不到一种设置特定于字段的分析器的方法。这是我创建(测试)索引的方法: 如果我正确阅读了文档,则应创建类型为“ tweet”的索引“ twitter”,并且应通过雪球词根分析器分析“ message”字段的内容。为了对此进行测试,我尝试了以下查询: 如果我没记错的话,那应该会受到打击,因为战斗是战斗的源
我已经定义了对象HomeContentDTO和SubscriberUpsertDTO的映射 下面是这两个对象的映射配置 HomeContentDTO中的所有映射值都没有复制到SubscriberUpsertDTO。有人知道原因吗?
在代码中使用XSLT 2.0的字符映射功能时,我遇到了以下错误。 名称空间中的元素“样式表”http://www.w3.org/1999/XSL/Transform'命名空间中的子元素'character map'无效'http://www.w3.org/1999/XSL/Transform“是的 这是我的XSLT声明 请提供有关如何在XSLT中使用字符映射的帮助。
当我访问localhost:8080/home-我得到: 当我访问localhost:8080/或localhost:8080/index时,看起来一切正常。 为什么一条路行得通,而另一条行不通? 还有一件事让我困惑:localhost:8080/homepage。html-返回我的主视图。 所以我的项目在这里:https://github.com/IRus/jMusic 我的web.xml se
我使用fasterxml jackson进行json序列化。我已将日期序列化程序编写为 但它没有被调用。然而,其他Jackson序列化程序运行良好。 现在日期正被正确序列化。但是现在有效的JSON等效字符串并没有像这里提到的那样转换为JSON。
问题内容: 我使用FileWriter和BufferWriter写入文件。文件“ test.txt”已创建,但内部未写入任何内容。 该文件应写入我的按钮的ActionEvent中。那是为什么吗? 那是我的代码: 问题答案: 这里, 您将其包装在,默认缓冲区大小为8KB。因此,只要您不写超过8KB的内容并且不刷新/关闭它,它就不会出现在目标文件中。 完成后,您需要关闭编写器。这将刷新所有缓冲区并释放