从一个程序到另一个程序的管道输出不适合这个特定的程序
Piping output from one program to another not working for this particular program
我认为这是一个基本的问题,但是我还没能找到答案。
我正在用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
。
- 如何从Windows应用程序输出到标准?
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 而循环:简单的除法程序输出零,不明白为什么
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 使用复制构造函数的程序输出错误
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 为什么在 Direct X 11 中没有我的程序输出?
- 我怎样才能阻止我的程序输出时间,它使我的程序难以阅读
- 程序输出奇怪的字符
- 程序输出"nan"
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 3D 纹理大小会影响程序输出,而不会引发错误
- C++,程序输出无效输入,但继续通过循环
- 如何连接C++和Excel(从C++程序输出到Excel电子表格)
- 为什么我的C 程序输出乱码代码
- QT小部件应用程序输出到控制台
- 混淆了具有虚拟继承的程序输出
- 为什么我的C++程序输出这个
- 为什么我的程序输出不断变化?EAX寄存器不断更改值