#include "StdOutRedirector.h" #include #include StdOutRedirector::StdOutRedirector() : QObject() { #ifdef __linux__ if (pipe(fdguistd) == -1) printf("failed!"); #else // Redirect if (_pipe(fdguistd, 4096, _O_BINARY) == -1) printf("failed!"); #endif //int tr = fcntl(fdguistd, O_NONBLOCK); // Duplicate stdout file descriptor (next line will close original) fdStdOut = dup(fileno(stdout)); // Duplicate write end of pipe to stdout file descriptor if (dup2(fdguistd[1], fileno(stdout)) != 0) printf("failed!"); // Close original close(1); // Duplicate write end of original dup2(fdguistd[1], 1); buffer = new char[bufferSize]; } StdOutRedirector::~StdOutRedirector() { delete[] buffer; } void StdOutRedirector::readOutsToTF() { size_t len; char* copy; int n_out; QString str; //char buffer[512]; //qDebug() << "begin read..."; //qDebug() << "from qdebug..."; //printf("from printf..."); //std::cout << "from std::cout..." << std::endl; fflush(stdout); //Perhaps there is a non-blocking version of _read() that you can call ? memset(buffer, 0, bufferSize); n_out = read(fdguistd[0], buffer, bufferSize); if (n_out <= 0) { return; } if (n_out >= 1) { str.append(QString(buffer)); int con = str.lastIndexOf('\n'); int remv = str.at(con - 1) == '\n' ? 1 : 0; if (con > 0) { str = str.remove(con - remv, str.length()); output->append(str); } } return; }