标准错误和标准输出

时间:2014-04-16 17:04:35

标签: c error-handling

假设我遇到这种情况: 我将某些程序的标准错误重定向到文件output.err和标准输出到文件output.out。当程序运行但在允许正常完成之前被终止时,我注意到output.err文件包含预期的输出,但是即使我保证执行了相应的printf语句,output.out也是空的。 这是为什么?

2 个答案:

答案 0 :(得分:1)

这是因为STDERR永远不会被缓冲。这意味着无论如何都会立即写入数据。要刷新STDOUT中的缓冲数据,您可以使用此功能:

some_write_operation_on_stdout();
fflush(stdout);

此调用导致数据从缓冲区刷新并写入,就好像它是无缓冲的一样。要永久禁用STDOUT缓冲,您只需调用一次:

setbuf(stdout, NULL);

有关详细信息,请参阅Why does printf not flush after the call unless a newline is in the format string?

答案 1 :(得分:1)

这可能是因为程序使用库来编写包含缓冲区的输出(通常是C' stdout文件流的情况),并且输出实际上并未写入到刷新缓冲区之前的设备(当你杀死程序时不会发生这种情况)。相比之下,C' stderr是无缓冲的。 (可以使用setbuf()控制缓冲。)