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

我正在用C ++构建Web服务器,为了帮助我在系统运行时对其进行可视化,我正在构建一个单独的程序来进行可视化。 Web服务器将通过打印输出到可视化工具中的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


但是,当我像这样运行Web服务器时:

./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。

我想不出什么原因都不起作用。

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

最佳答案

two中从STDIN读取数据时,Web服务器正在STDERR中打印。这样就行不通了。

./aril | ./two更改为

./aril 2>&1 | ./two


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

关于c++ - 从一个程序到另一个程序的输出管道不适用于该特定程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17076347/

10-08 22:29
查看更多