fchmod 之后写入的预期行为是啥?

Posted

技术标签:

【中文标题】fchmod 之后写入的预期行为是啥?【英文标题】:What is the expected behaviour of a write after fchmod?fchmod 之后写入的预期行为是什么? 【发布时间】:2017-09-01 04:27:10 【问题描述】:

如果我打开并创建一个文件以进行 r/w 访问,然后随后使用 fchmod 删除写入访问权限,在 fchmod 调用之后和关闭/重新打开该文件之前直接在同一文件描述符上写入的预期行为是什么?

这是由 POSIX 指定的吗?

是否仅在打开时检查权限?

【问题讨论】:

在我看来,你可以通过编写一个三行程序来找出答案。 我知道它做了什么(我没有看到失败的写入,这是我没想到的)。我想知道指定的行为是什么以及为什么。 从这个线程unix.stackexchange.com/questions/89045/…接受的答案看来,文件权限仅在文件打开时检查。 【参考方案1】:

对于完全一致的实现,在打开文件后更改文件的权限似乎对已经打开的文件描述符没有影响。

从版本 7 chmod()/fchmodat() documentation:

应用用途

...

当前由文件上的任何进程打开的任何文件描述符都可以 如果文件的模式更改为一个值,可能会变得无效 这将拒绝访问该进程。一种情况 可能发生在无状态文件系统上。 这种行为不会 发生在符合要求的环境中

这与 POSIX 版本 6 不同,其中 the chmod() documentation states:

对调用时打开的文件的文件描述符的影响 chmod() 是实现定义的。

【讨论】:

我认为“这种行为”是指“变得无效”部分。 IE。调用chmod 不能使打开的文件描述符无效——但这并不意味着它不能更改权限。以 NFS 为例,更改权限将立即影响已打开的文件(因为它发生在服务器端)。 @SanderDeDycker 我以同样的方式阅读它。由于问题是fchmod 调用之后直接在同一文件描述符上写入的预期行为是什么,标准中这个不太清楚的声明表明已经打开的描述符应该仍然有效。如果打开一个文件进行写入,然后权限更改以从文件中删除写入权限,则仍然打开的描述符不应失效。 我试图提出的观点(显然很糟糕)是保证它不会使打开的文件描述符无效并不意味着它“对已经打开的文件描述符没有影响”。或者特别是这个问题,我没有发现它说明权限错误导致文件描述符无效。但也许我忽略了什么? 或者更明确地说,EACCES 错误(权限问题)与EBADF 错误(无效文件描述符)不同。两者都可以通过write返回。 @SanderDeDycker 我明白你的意思。该标准对“无效”的使用并不十分清楚。我认为为写入而打开的文件描述符但该进程无法再写入将是“无效的”,但我没有看到标准中明确说明。我只能说该标准使用“拒绝访问”一词,这对我来说至少意味着EACCESS 错误-该标准后来说“不会发生这种行为”。【参考方案2】:

来自chmod 的参考页面(与fchmod 具有相同的行为):

在调用chmod() 时打开的文件对文件描述符的影响是实现定义的。

因此,这不是 POSIX 定义的,您必须查阅您的平台文档。

【讨论】:

这不是 POSIX 规范的最新版本。 @AndrewHenle :是的,但我看不出与最新版本(今年才刚刚成为当前版本)有真正的区别。 @AndrewHenle :事实上 - 您的答案中的相同引用已经出现在第 6 期中。 那似乎会使问题 6 不一致,不是吗?在一个地方“实现定义”,在另一个地方“变得无效......不会在符合标准的环境中发生”。 @AndrewHenle:我猜这就是我们阅读它的不同之处(参考我的 cmets 对你的回答 - 这是一个奇怪的对话哈哈)。

以上是关于fchmod 之后写入的预期行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用hibernate.get()取得对象再set()属性后调用update()更新对象时一直不能写入到数据库,是啥原因?

C ++ bool行为不符合预期[重复]

SELECT 子句中多个集合返回函数的预期行为是啥?

使用静态大小的数组进行堆栈保护的预期行为是啥?

Android,有啥方法可以禁用使用键盘在日期选择器内写入?

BLE 中的“可靠写入”是啥?