【发布时间】:2013-06-12 22:18:04
【问题描述】:
我希望这是一个基本问题,但我一直无法找到答案。
我正在用 C++ 构建一个 Web 服务器,为了帮助我在系统运行时对其进行可视化,我正在构建一个单独的程序来进行可视化。 Web 服务器将通过将语句打印到通过管道传输到可视化器的标准输出来通知可视化器其当前状态,这将解析输入并呈现整个系统的漂亮示意图以及各种统计信息。可视化器将使用 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 打印到标准输出。
我想不出这不起作用的任何原因。
编辑: 事实证明,解决方案只是显式刷新输出。应该是我真正尝试的第一件事..
【问题讨论】:
-
不相关:首选
std::string和std::getline从std::cin读取行。 -
也许 ./aril 正在写入 stderr?试试 ./aril 2>&1 | ./二
-
您确定您的 Web 服务器打印到 stdout,而不是 stderr 吗?你试过 ./aril 2>&1 |./two 吗?
-
哇布伦特沃什伯恩。伟大的思想都一样:)
-
那么,您展示的代码运行良好,而您没有展示的代码是您有疑问的?这应该如何工作?
标签: c++ linux stdout stdin pipe