I'm trying to write an app that would spawn a subprocess and communicate with it via standard output/input. Just to get the hang of it I tried writing a simple app that would send a message to the subprocess, and the subprocess would receive it and send it back. After frankly ridiculous amount of trial and error I managed to get a message to the subprocess, but I can't figure out how to send it back.
Here's my attempt:
#include <QApplication>
#include <QDataStream>
#include <QFile>
#include <QDebug>
#include <QProcess>
#include <QThread>
#define dumpval(x) qDebug()<<#x<<'='<<x
void slave()
{
QApplication::setApplicationName("slave");
qSetMessagePattern("%{appname}: %{message}");
qDebug()<<"started";
QFile input;
QFile output;
dumpval(input.open(stdin, QFile::ReadOnly));
dumpval(output.open(stdout, QFile::WriteOnly));
QObject::connect(&output, &QIODevice::bytesWritten, [](int bytesWritten){dumpval(bytesWritten);});
QDataStream inputStream(&input);
QDataStream outputStream(&output);
QByteArray data;
while (true){
inputStream>>data;
dumpval(data);
if (!data.isEmpty()) break;
inputStream.resetStatus();
QThread::sleep(1);
}
dumpval(output.isWritable());
outputStream<<data;
dumpval(output.waitForBytesWritten(-1));
qDebug()<<"data written";
qDebug()<<"stopped";
}
void master(QString path)
{
QApplication::setApplicationName("master");
qSetMessagePattern("%{appname}: %{message}");
qDebug()<<"started";
QProcess p;
QObject::connect(&p, &QIODevice::bytesWritten, [](int bytesWritten){dumpval(bytesWritten);});
p.setProgram(path);
p.setArguments({"slave"});
p.setProcessChannelMode(QProcess::ForwardedErrorChannel);
p.start();
p.waitForStarted();
QDataStream stream(&p);
QByteArray data = "this is a test";
stream<<data;
dumpval(p.waitForBytesWritten(-1));
data.clear();
while (true){
stream>>data;
dumpval(data);
if (!data.isEmpty()) break;
stream.resetStatus();
QThread::sleep(1);
}
qDebug()<<"stopped";
}
int main(int argc, char** argv)
{
if (argc == 1) master(argv[0]);
else slave();
}
And here's the output of this code:
master: started
master: bytesWritten = 18
master: p.waitForBytesWritten(-1) = true
master: data = ""
slave: started
slave: input.open(stdin, QFile::ReadOnly) = true
slave: output.open(stdout, QFile::WriteOnly) = true
slave: data = "this is a test"
slave: output.isWritable() = true
slave: output.waitForBytesWritten(-1) = false
slave: data written
slave: stopped
master: data = ""
master: data = ""
master: data = ""
master: data = ""
master: data = ""
master: data = ""
^C
What am I doing wrong?