文件I / O的故障修复策略

时间:2013-11-03 21:40:33

标签: c file file-io

我正在将缓冲的IO写入文件,包括读写。我正在使用fopen(), fseeko()标准ANSI C文件I / O函数。在所有情况下,我都在写一个磁盘上的标准本地文件。这些文件I / O操作失败的频率是多少,策略应该针对哪些失败?我并不是在寻找统计数据,但我正在寻找一个关于我应该在多大程度上处理错误情况的通用声明。

例如,我认为每个人都认识到malloc()可能并且可能会在某个用户的计算机上失败并且开发人员应该检查返回的NULL,但是没有很好的补救策略,因为它可能意味着系统是记忆力不足。至少,这似乎是malloc()在桌面系统上采用的方法,嵌入式系统是不同的。

同样,是否值得重新尝试文件I / O操作,或者我应该只考虑基本上无法恢复的错误等等。

我很欣赏一些演示正确用法的代码示例,或者一个指示如何处理它的库指南参考。当然,任何其他数据都是受欢迎的。

2 个答案:

答案 0 :(得分:1)

我猜你是这里的新手程序员。我在这里给出的建议并不适用于所有情况,但它可以帮助您编写可靠的代码。

  • 试图找出如何从错误中恢复 hard ,除非你有一个非常可靠的模型来说明错误的发生方式及其意义。
  • 因此,除非您确切地知道错误是什么及其含义,否则请在stderr上报告错误,或者告诉您什么错误并将其炸毁。
  • 如果您在第一件事出错时立即轰炸,您将被迫了解错误并修复您的代码。从长远来看,这可以带来更高质量的代码,即使你的直觉暗示其他原因。
  • 某些功能返回"错误"并不表示严重失败。在POSIX中,EINTR是一种使信号处理更容易实现的黑客攻击,并且它具有使得关注信号的单线程程序的某种体系结构更容易实现的副作用。当I / O函数返回EAGAIN时,这意味着您以非阻塞模式打开文件,并且I / O想要阻止。你需要正确处理这些事情。
  • 有些错误表明发生了可怕的事情; POSIX中的EIO表示该功能甚至不知道如何谈论出错。
  • 使用文件系统代码,您会注意到文件的并发更新可能会导致某些错误。尝试恢复"这是一个愚蠢的差事。从这些事情和优雅地来看。"不要试试。

答案 1 :(得分:0)

这是我快速回复的答案的副本,试图再给它一次机会。

这在很大程度上取决于程序的类型。

作为一个突出的例子,一个流行的C库Glib并不关心处理OOM;它只是中止。这可能适用于应用程序代码,但它不适用于某些系统级代码。

在大多数情况下,可以认为I / O错误或OOM的情况是不可避免的。例如,遇到OOM的许多程序都具有非常顺序(少数分支)的代码路径,并且在失败的分配上没有替代方案。因此,大多数程序只会退出(1)。

如果你在另一边操纵合理的状态,你应该尽力不要崩溃或退出。

通常很难清理,特别是在普通的C中。

作为一个明智的最小值,您应该始终尝试调查失败的直接原因并将其打印到stderr - 这有助于调试。

我可以推荐阅读reprepro的源代码,它在处理错误条件和清理时非常小心。这是一个很大的锅炉板,所以你可能会选择它不适合您的应用程序阅读后。