从一个程序到另一个程序的管道输出不适用于此特定程序

时间:2013-06-12 22:18:05

标签: c++ linux stdout stdin pipe

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

我正在用C ++构建一个Web服务器,为了帮助我在系统运行时可视化系统,我正在构建一个单独的程序来进行可视化。 Web服务器将通过将语句打印到用于可视化器的stdout来通知可视化器其当前状态,该stdout将解析输入并呈现整个系统的漂亮示意图以及各种统计数据。可视化器将用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打印到stdout。

我想不出有什么理由不起作用。

编辑: 事实证明,解决方案只是明确地刷新输出。本来应该是我尝试的第一件事。

3 个答案:

答案 0 :(得分:1)

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

./aril | ./two更改为

./aril 2>&1 | ./two

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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