当前位置: 首页 > 面试题库 >

只写映射O_WRONLY打开的文件应该起作用吗?

白云
2023-03-14
问题内容

是否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_WRONLYO_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单独设置的地方不允许任何访问。实现应支持至少以下值protPROT_NONEPROT_READPROT_WRITE,和按位包括OR的PROT_READPROT_WRITE。如果不支持“内存保护”选项,则与指定保护冲突的任何访问的结果都是不确定的。
无论指定了什么保护选项,都应在具有读取许可的情况下打开
文件描述符fildes。如果PROT_WRITE如果指定了,则应用程序应确保它已打开了fildes具有写许可权的文件描述符,除非MAP_PRIVATEflags如下所述的参数中指定。

添加了重点)

同样,在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的内容并且不刷新/关闭它,它就不会出现在目标文件中。 完成后,您需要关闭编写器。这将刷新所有缓冲区并释放