【问题标题】:Piping output from one program to another not working for this particular program从一个程序到另一个程序的输出管道不适用于该特定程序
【发布时间】:2013-06-12 22:18:04
【问题描述】:

我希望这是一个基本问题,但我一直无法找到答案。

我正在用 C++ 构建一个 Web 服务器,为了帮助我在系统运行时对其进行可视化,我正在构建一个单独的程序来进行可视化。 Web 服务器将通过将语句打印到通过管道传输到可视化器的标准输出来通知可视化器其当前状态,这将解析输入并呈现整个系统的漂亮示意图以及各种统计信息。可视化器将使用 Python 编写。

为了检查我是否了解管道的工作原理,我创建了两个简单的程序:

#include <iostream>


using namespace std;


int main() {
    cout << "Hello world!\n";

    return 0;
}

,和

#include <iostream>


using namespace std;


int main() {
    char buf[128];

    while (!cin.eof()) {
        cin.getline(buf, 128, '\n');
        cout << "Received line: " << buf << "\n";
    }

    return 0;
}

当我执行命令时,这会按预期工作

./one | ./two

但是,当我像这样运行我的网络服务器时:

./aril | ./two

我根本没有输出。

自行运行服务器会产生如下输出:

Spawning handlers
Waiting for HTTP clients
Server: got connection from 127.0.0.1, port 52168
Connection timed out

(显然这实际上不是我将传递给可视化器的那种输出——它需要更容易解析的语法)。

可能的相关信息:

web 服务器分为两个进程:aril 和 arild。 aril 以 root 权限运行,而 arild 没有。两个进程都使用 std::cout 打印到标准输出。

我想不出这不起作用的任何原因。

编辑: 事实证明,解决方案只是显式刷新输出。应该是我真正尝试的第一件事..

【问题讨论】:

  • 不相关:首选std::stringstd::getlinestd::cin 读取行。
  • 也许 ./aril 正在写入 stderr?试试 ./aril 2>&1 | ./二
  • 您确定您的 Web 服务器打印到 stdout,而不是 stderr 吗?你试过 ./aril 2>&1 |./two 吗?
  • 哇布伦特沃什伯恩。伟大的思想都一样:)
  • 那么,您展示的代码运行良好,而您没有展示的代码是您有疑问的?这应该如何工作?

标签: c++ linux stdout stdin pipe


【解决方案1】:

您的 Web 服务器正在 STDERR 中打印,而 two 您正在从 STDIN 读取。所以它不会起作用。

./aril | ./two更改为

./aril 2>&1 | ./two

这会将aril 的所有STDERR 和STOUT 重定向到STDOUT,因此two 将能够读取它。

【讨论】:

    【解决方案2】:

    aril 可能会检测到其输出是否通过管道传输(有关详细信息,请参阅 fstat() 和此线程 http://cboard.cprogramming.com/cplusplus-programming/73909-prevent-piping.html)并切换到静默模式,即不产生任何输出。尝试通过管道连接到其他东西,可能是 cat,看看它是否会产生输出。

    【讨论】:

      【解决方案3】:

      我认为您的程序旨在成对工作,但不能互换。 ./one | ./two 是管道的一个示例,但 ./aril 期望通过套接字与 ./arild 通信。混合./aril | ./two 可能没有意义。

      【讨论】:

      • ./aril./arild 正在通过套接字进行通信,但是无论 ./aril 从它的套接字末尾读取什么,它都可能放在标准输出上以供 ./two 读取,所以这个组合确实有道理。
      • 在这种情况下,在后台运行 ./aril|./two&,然后并行运行 ./arild(或在单独的终端窗口中运行)。
      • 这是我的猜测,但我假设这就是他已经在做的事情。
      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多