【发布时间】:2014-11-17 13:55:06
【问题描述】:
fgets 和fputs 等标准输入/输出函数可能会因各自的读取或写入错误而失败。这是有道理的,因为文件系统权限和空间限制可能会阻止程序读取或写入文件。
但是,我很难想象在相应标准 I/O 流(stdin、stdout、stderr)上的输入/输出操作会失败的情况,因为它们似乎是在概念上比文件系统中的典型文件更抽象。
例如,以下fputs 调用是否有可能返回表示写入错误的EOF?
fputs("Hello world!\n", stdout)
C99 标准是否明确或隐含地保证在各自的标准 I/O 流上成功的输入/输出操作?还是在合规的理论实现上可能会失败?
我怀疑标准 I/O 流上可能会出错,因为 puts 函数和 gets 函数 Returns 部分都提到了失败返回值的可能性; puts 和 gets 分别显式写入/读取 stdout/stdin 流,标准 I/O 流上的错误似乎是隐含的。
但是,这同样适用于stderr 流吗?可能不是,因为perror 函数没有提及错误条件,也没有返回表示失败的值(perror 有一个void 返回类型)。
【问题讨论】:
-
输入函数,根据他们的定义,不能得到 output 操作的错误。此外,您的示例存在缺陷,因为
fgets永远不会返回EOF。 -
失败总是可能的。想象一下,您的进程位于管道中间,而其左侧或右侧的进程被终止。
-
标准 I/O 流可以重定向到文件/从文件重定向。因此,可以应用相同的限制
-
@VilhelmGray:写入读取器已被杀死的管道(假设已处理 SIGPIPE)将与 EPIPE 出错,它不会永远阻塞等待不可能回来的读取器。虽然我不认为 C 涉及到这种详细程度,但肯定不能保证读取或写入不会失败。
-
由于其内在性质,无法预先保证输入/输出操作:它们与外部世界一起操作,程序无法控制其外部;所以它们总是在输入/输出过程中可能发生的潜在问题(磁盘已满、终端关闭、网络关闭等)。