处理C只读文件closures错误

我正在做一些基本的文件读取使用打开,读取和closures(文件打开访问模式O_RDONLY)。

当closures文件的时候,我想不出一个好办法来处理可能的文件closures错误,以确保文件closures正确。

有什么build议么?

从我的经验来看,即使失败, close也会成功。 有几个原因。

我怀疑在某些操作系统上close一个重要原因是AFS。 AFS是一个80年代的分布式文件系统,具有有趣的语义 – 所有的写入都是在本地缓存中完成的,当您关闭文件时,您的数据被写入服务器。 AFS也被密码认证,一段时间后过期的令牌。 所以你可能最终会遇到一个有趣的情况,即你的文件写入的所有操作都是在你的令牌有效的情况下完成的,但是实际上和文件服务器交谈的close可以用过期的令牌来完成,这意味着你写入的所有数据本地缓存丢失。 这就是为什么close需要沟通的用户出了点问题。 大多数文件编辑器正确地处理这个(例如,emacs拒绝将缓冲区标记为不脏),但是我很少看到其他可以处理这个问题的应用程序。

这就是说, close不能真的失败。 closeexit是隐含的, exec (女巫关闭执行文件描述符)并崩溃该转储核心。 那些是你不能失败的情况。 只有关闭文件描述符失败,才能exit或崩溃失败。 exit失败后你会怎么做? 崩溃? 如果崩溃失败? 那之后我们跑哪去了? 另外,由于几乎没有人检查close错误,如果失败是常见的,你最终会得到文件描述符泄漏和信息泄漏(如果我们在产生非特权进程之前未能关闭某个文件描述符?)。 所有这些对于操作系统来说太危险了,即使底层的文件系统关闭操作失败了,我所看到的所有操作系统(* BSD,Linux,Solaris)都会关闭文件描述符。

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

我想最好的做法是重试几次,尝试之间有一些短暂的延迟,然后记录问题,继续前进。

close()的手册页提到EINTR是一个可能的错误,这就是重新尝试可以提供帮助的原因。

如果你的程序即将退出,我不会太担心这种类型的错误检查,因为你分配的任何资源都将被操作系统解除分配(在大多数/典型的桌面/服务器上平台,那就是)。