我正在将缓冲的IO写入文件,包括读写。我正在使用fopen(), fseeko()
标准ANSI C文件I / O函数。在所有情况下,我都在写一个磁盘上的标准本地文件。这些文件I / O操作失败的频率是多少,策略应该针对哪些失败?我并不是在寻找统计数据,但我正在寻找一个关于我应该在多大程度上处理错误情况的通用声明。
例如,我认为每个人都认识到malloc()
可能并且可能会在某个用户的计算机上失败并且开发人员应该检查返回的NULL,但是没有很好的补救策略,因为它可能意味着系统是记忆力不足。至少,这似乎是malloc()
在桌面系统上采用的方法,嵌入式系统是不同的。
同样,是否值得重新尝试文件I / O操作,或者我应该只考虑基本上无法恢复的错误等等。
我很欣赏一些演示正确用法的代码示例,或者一个指示如何处理它的库指南参考。当然,任何其他数据都是受欢迎的。
答案 0 :(得分:1)
我猜你是这里的新手程序员。我在这里给出的建议并不适用于所有情况,但它可以帮助您编写可靠的代码。
stderr
上报告错误,或者告诉您什么错误并将其炸毁。EINTR
是一种使信号处理更容易实现的黑客攻击,并且它具有使得关注信号的单线程程序的某种体系结构更容易实现的副作用。当I / O函数返回EAGAIN
时,这意味着您以非阻塞模式打开文件,并且I / O想要阻止。你需要正确处理这些事情。EIO
表示该功能甚至不知道如何谈论出错。答案 1 :(得分:0)
这是我快速回复的答案的副本,试图再给它一次机会。
这在很大程度上取决于程序的类型。
作为一个突出的例子,一个流行的C库Glib并不关心处理OOM;它只是中止。这可能适用于应用程序代码,但它不适用于某些系统级代码。
在大多数情况下,可以认为I / O错误或OOM的情况是不可避免的。例如,遇到OOM的许多程序都具有非常顺序(少数分支)的代码路径,并且在失败的分配上没有替代方案。因此,大多数程序只会退出(1)。
如果你在另一边操纵合理的状态,你应该尽力不要崩溃或退出。
通常很难清理,特别是在普通的C中。
作为一个明智的最小值,您应该始终尝试调查失败的直接原因并将其打印到stderr - 这有助于调试。
我可以推荐阅读reprepro的源代码,它在处理错误条件和清理时非常小心。这是一个很大的锅炉板,所以你可能会选择它不适合您的应用程序阅读后。