Ubuntu 20
, Bash 5
.
我可能忽略了一些愚蠢的事情!有一个 C++ 二进制文件foo
,它使用std::cout
,printf()
和puts()
来进行日志记录。
./foo
当我从终端运行它时,我得到一些输出(和分段错误)。
当我重定向所有内容时./foo > log
,我只得到输出的一部分。当我传播 then./foo 1>one 2>two
时one
,正如预期的那样,包含缩短的输出并且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
.