C++ 从一个程序到另一个程序的管道输出不适用于此特定程序
我想这是一个基本的问题,但我还没有找到答案 我在C++中构建了一个Web服务器,为了帮助我在运行时可视化系统,我正在构建一个单独的程序来进行可视化。web服务器将通过将语句打印到stdout(通过管道传输到visualiser)来通知visualiser其当前状态,stdout将解析输入并呈现整个系统以及各种统计数据的良好示意图。可视化程序将用Python编写 为了检查我是否了解管道的工作原理,我创建了两个简单的程序:C++ 从一个程序到另一个程序的管道输出不适用于此特定程序,c++,linux,stdout,stdin,pipe,C++,Linux,Stdout,Stdin,Pipe,我想这是一个基本的问题,但我还没有找到答案 我在C++中构建了一个Web服务器,为了帮助我在运行时可视化系统,我正在构建一个单独的程序来进行可视化。web服务器将通过将语句打印到stdout(通过管道传输到visualiser)来通知visualiser其当前状态,stdout将解析输入并呈现整个系统以及各种统计数据的良好示意图。可视化程序将用Python编写 为了检查我是否了解管道的工作原理,我创建了两个简单的程序: #include <iostream> using name
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!\n";
return 0;
}
但是,当我这样运行web服务器时:
./aril | ./two
我一点输出都没有
单独运行服务器会产生如下输出:
Spawning handlers
Waiting for HTTP clients
Server: got connection from 127.0.0.1, port 52168
Connection timed out
(很明显,这并不是我要传递给visualiser的输出类型——它需要一种更容易解析的语法)
可能相关信息:
web服务器分为两个进程:aril和arild。aril使用root权限运行,而arild没有。这两个进程都使用std::cout打印到标准输出
我想不出为什么这不起作用
编辑:
事实证明,解决方案只是显式地刷新输出。应该是我真正尝试的第一件事。您的web服务器正在STDERR中打印,而在
two中您正在从STDIN读取。所以它不起作用
将/aril |./two
更改为
./aril 2>&1 | ./two
这将把aril
的所有STDERR和STOUT重定向到STDOUT,因此two
将能够读取它。我认为您的程序设计为成对工作,但不能互换/one |./two
是管道的一个例子,但是/aril
希望通过套接字与/arild
进行通信。混合使用/aril |/two
可能没有意义。aril可能会检测其输出是否通过管道传输(有关详细信息,请参阅fstat()和此线程)并切换到静默模式,即不产生任何输出。尝试通过管道传输到其他地方,cat maybe,看看它是否会产生输出。不相关:首选std::string
和std::getline
读取std::cin
中的行。可能。/aril正在向stderr写入代码?试试。/aril 2>&1|。/2您确定您的web服务器打印到标准输出,而不是标准输出吗?你试过了吗?/aril 2>&1 |/2?哇,布伦特·沃什伯恩。英雄所见略同:)那么,你展示的代码工作得很好,而你没有展示的代码让你有疑问?这是怎么回事?/aril
和/arild
是通过套接字进行通信的,但是无论/aril
从它的套接字末端读取什么,它都可能将标准输出放在由/two
读取的位置,所以这种组合是有意义的。在这种情况下,在后台运行/aril |/two,然后并行运行./arild(或者在单独的终端窗口中运行它们)。这是我的猜测,但我假设他已经在这么做了。
Spawning handlers
Waiting for HTTP clients
Server: got connection from 127.0.0.1, port 52168
Connection timed out
./aril 2>&1 | ./two