进一步阅读

进一步阅读

Ubuntu 20, Bash 5.

我可能忽略了一些愚蠢的事情!有一个 C++ 二进制文件foo,它使用std::cout,printf()puts()来进行日志记录。

./foo当我从终端运行它时,我得到一些输出(和分段错误)。

当我重定向所有内容时./foo > log,我只得到输出的一部分。当我传播 then./foo 1>one 2>twoone,正如预期的那样,包含缩短的输出并且two不包含任何内容。

(显然)没有中央日志记录设施,所以我无法想象如何强制刷新。

可能出什么问题了?


$./foo
text1
text2

$./foo > log ; cat log
text1

答案1

日志记录与此无关,这是您需要学习的 C 和 C++ 编程的基本方面。

标准I/O库例程是完全缓冲输出的,因为运行时库已确定标准输出不是终端设备。如果您想要标准输出行缓冲,您可以使用 在代码中打开行缓冲setvbuf(),或者使用 Bernstein 等工具说服 C 运行时库标准输出是一个终端ptybandage,或者使用 C 库中的特殊挂钩来打开行缓冲代码注入工具,例如stdbuff. ptybandage可能是这里最好的选择。它是非侵入性的,您可能会这样做不是一旦您真正了解了标准 I/O 缓冲的本质,您就希望在您的程序中进行显式缓冲覆盖。

顺便说一下,不要记录到标准输出。登录到std::clog.

进一步阅读

相关内容