【发布时间】:2014-08-20 02:14:42
【问题描述】:
注意:请在将其标记为重复之前阅读到最后。虽然相似,但我在答案中寻找的范围超出了上一个问题所要求的范围。
我倾向于同意的广泛实践倾向于将close 纯粹视为文件描述符的资源分配函数,而不是具有有意义的失败案例的潜在 IO 操作。事实上,在the resolution of issue 529 之前,POSIX 在错误发生后未指定文件描述符的状态(即是否仍被分配),因此无法以任何有意义的方式对错误做出可移植的响应。
然而,许多 GNU 软件不遗余力地检查来自 close 的错误,而 Linux man page for close 称未能这样做是“常见但仍然严重的编程错误”。 NFS 和配额被引用为close 可能产生错误但未提供详细信息的情况。
在现实世界的系统中,close 可能在哪些情况下失败,它们与今天是否相关?我特别想知道是否有任何现代系统close 因任何非 NFS、非设备节点特定原因以及 NFS 或设备相关故障在什么条件下(例如配置)失败他们可能会被看到。
【问题讨论】:
-
也许这个问题与它被标记为重复的问题相似,但另一个问题没有足够的答案来解决我在这个问题末尾要求的细节,而且似乎没有要求这样的细节。所以我认为至少有一些不同。如果这个问题要保持关闭状态,我应该如何为它“重复”的问题获得更可接受的答案?
-
无论如何,通常无法在写入时检测到物理介质错误。我的意思是 corrupted 文件系统,即底层元数据被损坏的地方。比如说,不正确的片段/块索引,仅在尝试写入时捕获,在
close()时间刷新最终缓存的数据。如果你没有write()错误并且close()没有错误,你就知道它被正确写入了,尽管它可能还没有长期存储。fsync()一直等到数据到达媒体,这是一个更强大的要求——而且它可能非常慢,尤其是使用 fuse:考虑 sshfs 等。close()检查几乎没有成本。 -
@NominalAnimal:“正确写入,但尚未长期存储”是什么意思?我无法在
close成功返回后立即拔出书呆子/关闭 NFS 服务器---我必须等待同步---所以close-checking 究竟添加了什么保证?如果你有内核错误,它只是一个会发出噪音的金丝雀吗?) -
@NominalAnimal:我的印象——这可能是错误的,这就是我想要确定的——检查
close绝对不会提供有关未能将文件提交到存储的信息,由于物理设备故障或逻辑故障(损坏的文件系统)。所以从某种意义上说,检查close的唯一用处似乎是试图为 NFS-with-caching 提供比您为本地文件提供的更强数据一致性保证。这让我觉得很可疑。如果您关心一致性,则应该同时关心两者,并使用fsync。 -
@tmyklebu, R..:Canary 可能是描述我对它的看法的最佳术语。没有“更强”的保证,我只是不想错过 fuse 的内核/nfsd/用户空间组件检测到的问题。损坏的 fs 处理中的错误、NFSv4 在不稳定连接上的委派问题、熔断文件系统中的错误处理错误,都是我正在考虑的——人为错误。您似乎假设/断言
close()永远不会以任何有意义的方式失败。基于什么?相信?希望? 标准?我对待close()就像对待read()或write()一样。我可能错了,但为了安全起见,我想犯错。