![打开带有 O_WRONLY 标志但没有写权限的文件](https://linux22.com/image/213173/%E6%89%93%E5%BC%80%E5%B8%A6%E6%9C%89%20O_WRONLY%20%E6%A0%87%E5%BF%97%E4%BD%86%E6%B2%A1%E6%9C%89%E5%86%99%E6%9D%83%E9%99%90%E7%9A%84%E6%96%87%E4%BB%B6.png)
我注意到可以使用带有标志但带有模式(即没有)open(...)
的文件,然后将数据写入该文件并关闭它。O_CREAT|O_WRONLY
0400
w
这对我来说有点矛盾,但我可以理解它是如何运作的。
然而,我最近在 CIFS 安装的文件系统中遇到了这种方法的问题。
现在我很好奇以下两种说法哪一个是正确的:
- 从技术上讲(POSIX),这是一个“不受支持/未记录”的功能,恰好可以在某些文件系统上工作。
或者
- 事实上,它不适用于 CIFS,这是 CIFS 实施方式的一个缺点。
我一直在寻找权威答案,但找不到。引用一些官方 POSIX 标准会很棒。
答案1
我注意到可以使用 O_CREAT|O_WRONLY 标志打开(...)一个文件,但使用 0400 模式(即没有 w),然后将数据写入该文件并关闭它。
这与更改权限位的方式一致不是影响已打开的文件描述符的访问。从概念上讲,您可以想象使用权限创建文件0600
,然后以只写模式打开它,然后将权限更改为0400
。只是系统以原子方式完成所有这些操作,而不让其他进程也打开它进行中间写入。
我看不到open()
系统调用的描述明确地说你可以这样做,但我认为这隐含在如何O_WRONLY
控制打开的 fd 获得的权限以及不同的权限中模式参数控制为创建的文件设置的权限位。两个不同的东西,而且它不说他们需要以任何方式相关。
另外,EACCES 的描述说:
[EACCES] 路径前缀的某个组成部分的搜索权限被拒绝,或者文件存在并且指定的权限奥弗拉格被拒绝,或者文件不存在并且要创建的文件的父目录的写权限被拒绝,或者指定了 O_TRUNC 并且被拒绝写权限。
即权限位仅适用于已经存在的文件。但我不确定在多大程度上可以理智地假设列出的标准错误条件可能是唯一可能的错误条件。
由于 CIFS 源自某种不同的传统,我不认为这是它与“传统”Unixy 文件系统或 POSIX 规范不同的唯一方式。