我希望这是一个基本问题,但我找不到答案。
我正在用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
然而,当我像这样运行我的网络服务器时:
./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。
我想不出有什么理由不起作用。
编辑: 事实证明,解决方案只是明确地刷新输出。本来应该是我尝试的第一件事。
答案 0 :(得分:1)
您正在从STDIN中读取two
时,您的网络服务器正在STDERR中打印。所以它不起作用。
将./aril | ./two
更改为
./aril 2>&1 | ./two
这会将aril
的所有STDERR和STOUT重定向到STDOUT,因此two
将能够读取它。
答案 1 :(得分:0)
aril可能检测其输出是否是管道输入(有关详细信息,请参阅fstat()和此线程http://cboard.cprogramming.com/cplusplus-programming/73909-prevent-piping.html)并切换到静默模式,即不产生任何输出。尝试用管道输送其他东西,猫可能,看它是否产生输出。
答案 2 :(得分:-1)
我认为您的程序设计为成对工作,但不能互换。 ./one | ./two
是管道的示例,但./aril
期望通过套接字与./arild
进行通信。混合./aril | ./two
可能没有意义。