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