Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从一个程序到另一个程序的管道输出不适用于此特定程序_C++_Linux_Stdout_Stdin_Pipe - Fatal编程技术网

C++ 从一个程序到另一个程序的管道输出不适用于此特定程序

C++ 从一个程序到另一个程序的管道输出不适用于此特定程序,c++,linux,stdout,stdin,pipe,C++,Linux,Stdout,Stdin,Pipe,我想这是一个基本的问题,但我还没有找到答案 我在C++中构建了一个Web服务器,为了帮助我在运行时可视化系统,我正在构建一个单独的程序来进行可视化。web服务器将通过将语句打印到stdout(通过管道传输到visualiser)来通知visualiser其当前状态,stdout将解析输入并呈现整个系统以及各种统计数据的良好示意图。可视化程序将用Python编写 为了检查我是否了解管道的工作原理,我创建了两个简单的程序: #include <iostream> using name

我想这是一个基本的问题,但我还没有找到答案

我在C++中构建了一个Web服务器,为了帮助我在运行时可视化系统,我正在构建一个单独的程序来进行可视化。web服务器将通过将语句打印到stdout(通过管道传输到visualiser)来通知visualiser其当前状态,stdout将解析输入并呈现整个系统以及各种统计数据的良好示意图。可视化程序将用Python编写

为了检查我是否了解管道的工作原理,我创建了两个简单的程序:

#include <iostream>


using namespace std;


int main() {
    cout << "Hello world!\n";

    return 0;
}
但是,当我这样运行web服务器时:

./aril | ./two
我一点输出都没有

单独运行服务器会产生如下输出:

Spawning handlers
Waiting for HTTP clients
Server: got connection from 127.0.0.1, port 52168
Connection timed out
(很明显,这并不是我要传递给visualiser的输出类型——它需要一种更容易解析的语法)

可能相关信息:

web服务器分为两个进程:aril和arild。aril使用root权限运行,而arild没有。这两个进程都使用std::cout打印到标准输出

我想不出为什么这不起作用

编辑:
事实证明,解决方案只是显式地刷新输出。应该是我真正尝试的第一件事。

您的web服务器正在STDERR中打印,而在
two中您正在从STDIN读取。所以它不起作用

/aril |./two
更改为

./aril 2>&1 | ./two

这将把
aril
的所有STDERR和STOUT重定向到STDOUT,因此
two
将能够读取它。

我认为您的程序设计为成对工作,但不能互换
/one |./two
是管道的一个例子,但是
/aril
希望通过套接字与
/arild
进行通信。混合使用
/aril |/two

可能没有意义。aril可能会检测其输出是否通过管道传输(有关详细信息,请参阅fstat()和此线程)并切换到静默模式,即不产生任何输出。尝试通过管道传输到其他地方,cat maybe,看看它是否会产生输出。

不相关:首选
std::string
std::getline
读取
std::cin
中的行。可能。/aril正在向stderr写入代码?试试。/aril 2>&1|。/2您确定您的web服务器打印到标准输出,而不是标准输出吗?你试过了吗?/aril 2>&1 |/2?哇,布伦特·沃什伯恩。英雄所见略同:)那么,你展示的代码工作得很好,而你没有展示的代码让你有疑问?这是怎么回事?
/aril
/arild
是通过套接字进行通信的,但是无论
/aril
从它的套接字末端读取什么,它都可能将标准输出放在由
/two
读取的位置,所以这种组合是有意义的。在这种情况下,在后台运行/aril |/two,然后并行运行./arild(或者在单独的终端窗口中运行它们)。这是我的猜测,但我假设他已经在这么做了。
Spawning handlers
Waiting for HTTP clients
Server: got connection from 127.0.0.1, port 52168
Connection timed out
./aril 2>&1 | ./two