August 25, 2017 by Jörg Bornemann | Comments
From Qt 5.10 on, there is a new way how to start detached processes with QProcess
.
Of course you know this, but let me quickly repeat what a detached process is. If you start a program using QProcess
without detaching, then the destructor of QProcess
will terminate the process. In contrast, a detached process keeps running unaffected when the calling process exits. On Unix, a detached process will run in its own session and act like a daemon.
Traditionally, we start detached processes with the static QProcess::startDetached()
method.
QProcess::startDetached("aplay tada.wav");
There is a second overload that supports passing a separate argument list and the working directory. It also lets us retrieve the PID of the started process.
qint64 pid;
QProcess::startDetached("mpg123", {"Jeopardy_Theme.mp3"}, musicDirPath, &pid);
printf("Performing a lengthy calculation...");
calculateDeterminant(reallyBigMatrix);
puts("done.");
QProcess::startDetached("kill", {QString::number(pid)});
This little example crunches numbers for a while and plays the Jeopardy Theme to entertain the user. When the calculation result is ready, it kills the music player using the obtained PID.
When running this example on Linux, you will notice a little annoyance: we have no way of suppressing the output of the detached process.
(Okay, this particular tool has the "--quiet" option, but let's ignore that for the example's sake.)
Qt Users have requested for a long long time the ability to
stdin
, stdout
, stderr
to filesCreateProcess
argument modifier on Windowsfor detached processes.
All this is now possible in Qt 5.10! But instead of adding a monstrous overload for the static startDetached()
method, we added a non-static QProcess::startDetached(qint64 *pid)
. This new member function reads the properties of your QProcess
object and starts the to-be-detached process accordingly. It can be used as follows:
QProcess process;
process.setProgram("mpg123");
process.setArguments({"Jeopardy_Theme.mp3"});
process.setWorkingDirectory(musicDirPath);
process.setStandardOutputFile(QProcess::nullDevice());
process.setStandardErrorFile(QProcess::nullDevice());
qint64 pid;
process.startDetached(&pid);
...
The redirection to /dev/null
makes sure that the user is not disturbed by visual output of the audio player.
Only a certain sensible subset of functions is supported for startDetached()
:
setArguments()
setCreateProcessArgumentsModifier()
setNativeArguments()
setProcessEnvironment()
setProgram()
setStandardErrorFile()
setStandardInputFile()
setStandardOutputFile()
setWorkingDirectory()
All other properties of the QProcess
object are ignored.
If there are more properties to be supported in the future, they can be easily added in the implementation of the new startDetached()
.
Happy detaching!
Download the latest release here: www.qt.io/download.
Qt 6.9 is now available, with new features and improvements for application developers and device creators.
Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.
Apr 16, 2025
We’re excited to announce a major step forward for QML development..
Apr 16, 2025
With the 0.9 release, you can unshackle yourself from cloud LLM providers,..
Apr 14, 2025
We're happy to announce the release of version 1.4.0 of the Qt Extension..