$ cd glibc-2.23
$ grep -ErI --include='*.c' '= *f?put([cs]|char)\>' |wc -l
1
$ grep -ErI --include='*.c' '[^= ] *f?put([cs]|char)\>' |wc -l
1764
$ man putc
...
RETURN VALUE
fputc(), putc() and putchar() return the character written
as an unsigned char cast to an int or EOF on error.
也许它不够可能"例如,在 putchar 的序列中,一个或两个在前面和后面的一个或两个失败时会成功失败吗?
或者,至少99.9999%的实现,他们可能没有"返回suchandsuch"声明?
或者,在每个字节后(在putchar,putc,fputc的情况下)连续错误检查可能会导致性能下降太大?
答案 0 :(得分:1)
忽略函数的返回值是软件中许多难以发现的错误的根源。您的声明" nobody"检查返回值是不正确的。高可靠性软件系统会检查返回值。
答案 1 :(得分:0)
由于几个原因,这些往往被忽略。首先,对于大多数系统来说,它们存在的问题可能性很大,以至于大多数人都不在乎。
其次,因为如果它们确实失败了,那么你无论如何都可以做的相对较少 - 如果操作系统已经进入写入文件失败的状态,通常的反应如显示消息对用户和/或记录错误也可能很容易失败。
最后,在大多数情况下,您可以简化问题:执行I / O,然后只检查fclose
是否成功。如果文件已进入失败状态,则可能会导致fclose
失败,因此较早捕获错误(执行I / O时)通常只是优化 - 您只能通过检测同一问题检查fclose
,尽管在检测到问题后你可能会浪费一些时间来编写文件。
即使检查来自fclose
的回复,相当也是不寻常的。你仍然遇到与上面提到的相同的问题:如果系统失败到失败的程度,那么你对失败作出反应的大部分尝试也会失败。
但仍有一些情况可行。例如,考虑将文件从一个地方移动到另一个地方(例如,通过网络)。您希望在删除源文件之前检查是否已成功将数据写入目标。在这种情况下,检查来自fclose
的返回是一种相当简单的方法,可以减少销毁用户文件的可能性,以防复制尝试失败。