我正在使用以下代码将标准输出重定向到管道,然后将所有数据从管道读取到缓冲区。我有两个问题:
第一个问题:当我发送比管道的BUFF_SIZE更大的字符串(在重定向之后),程序停止响应(死锁或其他情况)。
第二个问题:当我尝试在发送到标准输出之前从管道中读取时,我会得到相同的响应,程序停止响应——_read命令卡住了……
问题在于我不知道在重定向之后将发送多少数据到管道中。
对于第一个问题,我不知道如何处理,希望能得到帮助。第二个问题我通过简单的解决方法解决了,就是在重定向之后立即向标准输出打印空格字符。但我认为这种解决方案并不正确……
第一个问题:当我发送比管道的BUFF_SIZE更大的字符串(在重定向之后),程序停止响应(死锁或其他情况)。
第二个问题:当我尝试在发送到标准输出之前从管道中读取时,我会得到相同的响应,程序停止响应——_read命令卡住了……
问题在于我不知道在重定向之后将发送多少数据到管道中。
对于第一个问题,我不知道如何处理,希望能得到帮助。第二个问题我通过简单的解决方法解决了,就是在重定向之后立即向标准输出打印空格字符。但我认为这种解决方案并不正确……
#include <fcntl.h>
#include <io.h>
#include <iostream>
#define READ 0
#define WRITE 1
#define BUFF_SIZE 5
using namespace std;
int main()
{
int stdout_pipe[2];
int saved_stdout;
saved_stdout = _dup(_fileno(stdout)); // save stdout
if(_pipe(stdout_pipe,BUFF_SIZE, O_TEXT) != 0 ) // make a pipe
{
exit(1);
}
fflush( stdout );
if(_dup2(stdout_pipe[1], _fileno(stdout)) != 0 ) //redirect stdout to the pipe
{
exit(1);
}
ios::sync_with_stdio();
setvbuf( stdout, NULL, _IONBF, 0 );
//anything sent to stdout goes now to the pipe
//printf(" ");//workaround for the second problem
printf("123456");//first problem
char buffer[BUFF_SIZE] = {0};
int nOutRead = 0;
nOutRead = _read(stdout_pipe[READ], buffer, BUFF_SIZE); //second problem
buffer[nOutRead] = '\0';
// reconnect stdout
if (_dup2(saved_stdout, _fileno(stdout)) != 0 )
{
exit(1);
}
ios::sync_with_stdio();
printf("buffer: %s\n", buffer);
}
buffer[nOutRead] = '\0';
更改传递给_read
的长度为 BUFF_SIZE - 1,以避免当_read
实际填充缓冲区时发生这种情况。 - JimR