我希望这是一个基本问题,但我一直找不到答案。
我正在用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/