c - 处理 C 只读文件关闭错误

标签 c linux file-io error-handling

我正在使用打开、读取和关闭进行一些基本的文件读取(文件以访问模式 O_RDONLY 打开)。

当需要关闭文件时,我想不出一个好的方法来处理可能的文件关闭错误以确保文件正确关闭。

有什么建议吗?

最佳答案

根据我的经验,即使失败,close 也会成功。这有几个原因。

我怀疑 close 在某些操作系统上开始失败的主要原因之一是 AFS。 AFS 是 80 年代的分布式文件系统,具有有趣的语义——您的所有写入都完成到本地缓存,并且您的数据在您关闭文件时写入到服务器。 AFS 还使用一段时间后过期的 token 进行密码验证。所以你可能会遇到一个有趣的情况,你对文件所做的所有写入都是在你的 token 有效时完成的,但是实际上与文件服务器对话的 close 可以用过期的 token 完成,这意味着您写入本地缓存的所有数据都丢失了。这就是为什么 close 需要向用户传达出现问题的原因。大多数文件编辑器都能正确处理这个问题(例如,emacs 拒绝将缓冲区标记为不脏),但我很少看到其他应用程序可以处理这个问题。

也就是说,close 无论如何都不会真的失败。 closeexitexec(witch close-on-exec 文件描述符)期间是隐式的,并且会导致转储核心崩溃。那些是你不能失败的情况。您不能仅仅因为关闭文件描述符失败就让 exit 或崩溃失败。 exit 失败时你会怎么做?碰撞?如果崩溃失败怎么办?在那之后我们跑哪里?此外,由于几乎没有人检查 close 中的错误,如果失败很常见,您最终会遇到文件描述符泄漏和信息泄漏(如果我们在生成非特权进程之前未能关闭某些文件描述符怎么办? ).所有这些对于操作系统来说都太危险了,所以我看过的所有操作系统(*BSD、Linux、Solaris)都会关闭文件描述符,即使底层文件系统关闭操作失败也是如此。

实际上这意味着您只需调用 close 并忽略它返回的任何错误。如果您有像编辑器一样处理失败的优雅方式,您可以向用户发送消息,让用户解决问题并重新打开文件,记下数据并再次尝试关闭。不要在循环或其他情况下自动执行任何操作。 close 中的错误超出您在应用程序中的控制范围。

关于c - 处理 C 只读文件关闭错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16608783/

相关文章:

c - 如何修改 C 中现有的 YAML 节点?

c - 如何轻松打包分析核心转储所需的库(即 packcore)

powershell - 如何使用 Powershell 将 Set-Content 写入文件?

c++ - 逐字符读取文本文件

c - 如何使用 lseek 检查文件中的当前偏移位置?

C - 简单斐波那契程序中的共享内存

php - Laravel + Crontab 不工作

在Linux上模拟键盘/鼠标输入的Python库?

php - 是否有比 file_get_contents 占用更少内存或更有效的合并 MP3 的方法?

c - scanf 不超过缓冲区溢出