4

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

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

有什么建议么?

4

2 回答 2

5

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

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

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

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

于 2013-05-17T12:53:44.203 回答
-2

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

手册页中close()提到可能EINTR存在错误,这就是为什么重新尝试会有所帮助。

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

于 2013-05-17T12:17:46.867 回答