Я использую следующий код, чтобы перенаправить стандартный вывод в канал, а затем прочитать все данные из канала в буфер.У меня 2 проблемы:
первая проблема: когда я отправляю строку (после перенаправления) больше, чем 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);
}