被管道困惑。 'cat -A'似乎过滤了部分输出

时间:2016-10-23 19:42:05

标签: c++ bash

我看到了这一点。

cat test.hs |./TonHospel 
25 x 25 matrix, 8 threads
permanent=-5258461839360 (0.213000 s)
user@user-desktop:~/python$ cat test.hs |./TonHospel |cat -A
25 x 25 matrix, 8 threads$

由于某种原因,cat -A正在过滤掉部分输出。我猜它可能与stderr和stdout有关,所以我尝试将两者都连接到stdout。这没有用。

user@user-desktop:~/python$ cat test.hs |./TonHospel 2>&1 |cat -A
25 x 25 matrix, 8 threads$

最后我只是随机尝试了这个。

user@user-desktop:~/python$ cat test.hs |./TonHospel 3>&1 1>&2 2>&3 |cat -A
25 x 25 matrix, 8 threads
permanent=-5258461839360 (0.236000 s)

发生了什么事? C ++源代码位于https://bpaste.net/show/ce5ca8643ba5

2 个答案:

答案 0 :(得分:1)

您在quick_exit结束时调用main,而不是简单地返回退出代码。这非常危险,因为quick_exit无需清理执行环境。特别是,它不会刷新与stdout关联的缓冲区。

如果stdout是行缓冲的,那将不会有问题,因为如果它连接到终端,它将在大多数系统上。但如果它是完全缓冲的,如果它被连接到管道,那么输出可能会丢失,这就是你所看到的。

这不是代码中唯一可疑的编程实践,但我相信这是当前的问题。

(顺便说一下,第一行是正确打印的,因为std::cout << std:::endl;显式刷新了cout缓冲区。但是混合使用c ++和c输出函数也是一个坏主意。)

答案 1 :(得分:0)

TonHospel检测到其标准输出是终端时,它会将另一行(例如permanent=-5258461839360 (0.213000 s))写入标准错误。当标准输出是其他内容时,没有任何内容写入标准错误,例如管道或文件。