问题描述
C 规范要求所有 C 程序都有 3 个可用的流:stdout
、stdin
、stderr
。
用户可以按照他们认为合适的方式使用这些流,例如:
fprintf(stdout,"lol");
fputs("oops",stderr);
fgets(buffer,20,stdin);
C 标准库中的某些函数隐式使用这些,例如:
printf("lol"); /* implicitly uses stdout */
puts("rofl"); /* implicitly uses stdout */
int c = getchar(buffer); /* implicitly uses stdin */
解决方法
assert
宏和 perror
函数写入标准错误流。 abort_handler_s
函数也是如此(在可选附件 K 中)。
exit
关闭文件并刷新流,因此它隐式作用于标准错误流。 _Exit
和 abort
可以这样做; C 标准允许但不要求它。 fflush(NULL)
刷新所有流。
Ç2018 7.21.3 3描述的输入和输出之间的一些相互作用流:上的无缓冲流或上一个线缓冲流请求输入和需要来自主机环境的字符,然后行缓冲流被刷新。这可能会影响标准错误流。
根据 C 2018 Annex J(可选),C 实现可能会将一些浮点诊断写入标准错误流,作为正常程序终止的一部分。
在 C 2018 标准中搜索“标准错误流”和“stderr”不会揭示标准库中标准错误流的任何其他隐式用途。