从一个程序到另一个程序的管道输出不适合这个特定的程序

Piping output from one program to another not working for this particular program

本文关键字:程序 输出 管道 不适合 一个 另一个      更新时间:2023-10-16

我认为这是一个基本的问题,但是我还没能找到答案。

我正在用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

然而,当我运行我的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打印到标准输出。

我想不出任何不工作的理由。

编辑:结果证明,解决方案只是显式地刷新输出。

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

./aril | ./two改为

./aril 2>&1 | ./two

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

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

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