c++ - 被管道弄糊涂了。 'cat -A' 似乎过滤掉了部分输出

标签 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。 .

最佳答案

您调用 quick_exitmain 的末尾,而不是简单地返回退出代码。这是非常危险的,因为 quick_exit懒得清理执行环境。特别是,它不会刷新与 stdout 关联的缓冲区.

如果 stdout 就没问题了是行缓冲的,因为如果它连接到终端,它将在大多数系统上使用。但是如果它是完全缓冲的,就像它连接到管道时一样,那么输出可能会丢失,这就是您所看到的。

这不是您的代码中唯一有问题的编程实践,但我相信这是最直接的问题。

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

关于c++ - 被管道弄糊涂了。 'cat -A' 似乎过滤掉了部分输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40207079/

相关文章:

linux - 使用脚本生成一堆新用户以生成 newusers 命令所需的输出

linux - 如何在 bash 中编写一个返回 ASCII 字符而不使用 printf 的函数

linux - 如何在 If else 情况下使用 shell 逻辑运算符

c++ - VK_TAB 在我的 C++ 程序中的 SendInput() 中不起作用

c++ - Ofstream 不写入文件 C++

C++ 重载模板赋值或回调函数

c++ - C++优先级队列容器比较器中如何直观理解大于/小于运算符

c++ - 为什么我的数组值更新为随机值?

linux - 如何理解 Linux 中的 diff -u?

bash - 如何将文本从一个 Vim 文件复制/粘贴到另一个 shell 选项卡中的另一个 Vim 文件?