可以通过相应的标准I / O流输入/输出失败吗?

时间:2014-11-17 13:55:07

标签: c file-io c99

标准输入/输出功能(例如fgetsfputs)可能会因相应的读取或写入错误而失败。这是有道理的,因为文件系统权限和空间限制可能会阻止程序读取或写入文件。

但是,我很难想象各个标准I / O流(stdinstdoutstderr)上的输入/输出操作会失败的情况,因为它们在概念上似乎比文件系统中的典型文件更抽象。

例如,以下fputs调用是否有可能返回表示写入错误的EOF

fputs("Hello world!\n", stdout)

C99标准是否明确地或隐含地保证在各自的标准I / O流上成功进行输入/输出操作;或者在合规的理论实施中是否可能失败?

我怀疑标准I / O流上可能存在错误,因为puts函数和gets函数返回部分都提到了失败返回值的可能性; putsgets分别明确地写入/读取stdout / stdin个流,标准I / O流上的错误似乎是隐含的。

但是,这同样适用于stderr流吗?可能不是,因为perror函数没有提到错误条件,也没有返回表示失败的值(perrorvoid返回类型)。

1 个答案:

答案 0 :(得分:1)

保证标准IO流存在。它们不能保证在IO操作时打开。由于进程通常从其父进程(无论是shell还是其他任何东西)继承其IO流,因此它们可以处于绝对任何状态:直接进入控制台/键盘,重定向到/从文件或管道或套接字,或者......关闭

所以是的,即使在标准流上也可能出现任何IO操作错误,无论是输入(关闭)还是输出(设备上没有更多空间,......)

编辑:

您提到了perror的特殊情况,它具有void返回类型。这并不意味着perror不会失败:它可以被重定向。但问题是更多我在哪里可以写出我无法写错误条件?由于它已经在错误处理程序中,如果它无法写入perror的结果,通常程序无法做得更好: - (

相关问题