0

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

我正在用 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 打印到标准输出。

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

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

4

3 回答 3

1

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

更改./aril | ./two

./aril 2>&1 | ./two

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

于 2013-06-12T22:23:45.773 回答
0

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

于 2013-06-12T22:49:49.807 回答
-1

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

于 2013-06-12T22:37:33.830 回答