我认为这是一个基本的问题,但是我还没能找到答案。
我正在用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
。