Search code examples
qtqt4

QProcess.startDetached() and write to its stdin


What is wrong with this code? I can not write to stdin of new process that has been detached. It is important for me that the new process is detached.

QProcess commandLine;
commandLine.setWorkingDirectory("E:\\");  //does not work.
commandLine.startDetached("cmd.exe");     //works (but uses wrong working dir).
commandLine.write("echo hi\0");           //writes nothing.
commandLine.write("\n\r");                //Still nothing is written!

Solution

  • Good morning.

    The problem is that QProcess::startDetached() is a static method which creates a "fire and forget" process.

    This means, that you cannot set a working directory this way. All you can do is call

    QProcess::startDetached (const QString &program, const QStringList &arguments, const   QString &workingDirectory);
    

    This however leaves you with the problem of writing to the stdin of the newly created process. The thing is, since you don't have a QProcess object there is nothing you can write your stdin to. There could be a solution using the process handle the static startDetached() method's providing.

    We had the similar problem in our company. We needed detached processes which ran beyond the lifespan of the calling programm and for which we could set the environment. This seemed, looking at the Qt code, impossible.

    My solution was to use a wrapper around QProcess with its own startDetached() method. What it did, it actually created this QProcess subclass on the heap and used its ordinary start() method. In this mode however the signal, which fires once the process has finished, calles upon a slot which deletes the object itself: delete this;. It works. The process is running independently and we can set an environment.

    So basically there is no need to use the detached start method. You can use the ordinary start method as long as your QProcess is an object on the heap. And if you care for memory leaks in this scenario you'd have to provide a similar mechanism as described above.

    Best regards
    D