Use Qt 6.7's QProcess::UnixProcessFlag::CreateNewSession

Allow QProcess to do the setsid() call for us. Unfortunately, the
nice()-setting feature wasn't approved, so we need to keep the modifier
for that.

Change-Id: Icfe44ecf285a480fafe4fffd174d111b806eb3a8
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Thiago Macieira
2023-03-16 18:37:25 -07:00
parent eaa9f0f4c1
commit e8ca1877de
2 changed files with 16 additions and 2 deletions

View File

@@ -82,9 +82,13 @@ void LauncherInterfacePrivate::doStart()
connect(m_process, &QProcess::readyReadStandardError, connect(m_process, &QProcess::readyReadStandardError,
this, &LauncherInterfacePrivate::handleProcessStderr); this, &LauncherInterfacePrivate::handleProcessStderr);
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
# if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
m_process->setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
# else
m_process->setChildProcessModifier([] { m_process->setChildProcessModifier([] {
setpgid(0, 0); setpgid(0, 0);
}); });
# endif
#endif #endif
m_process->start(launcherFilePath(), QStringList(m_server->fullServerName())); m_process->start(launcherFilePath(), QStringList(m_server->fullServerName()));

View File

@@ -107,7 +107,17 @@ ProcessHelper::ProcessHelper(QObject *parent)
: QProcess(parent), m_processStartHandler(this) : QProcess(parent), m_processStartHandler(this)
{ {
#if defined(Q_OS_UNIX) #if defined(Q_OS_UNIX)
setChildProcessModifier([this] { bool needSetsid = m_unixTerminalDisabled;
# if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
if (needSetsid) {
setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
needSetsid = false;
}
# endif
if (!m_lowPriority && !needSetsid)
return;
setChildProcessModifier([=, this] {
// nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest // nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest
if (m_lowPriority) { if (m_lowPriority) {
errno = 0; errno = 0;
@@ -116,7 +126,7 @@ ProcessHelper::ProcessHelper(QObject *parent)
} }
// Disable terminal by becoming a session leader. // Disable terminal by becoming a session leader.
if (m_unixTerminalDisabled) if (needSetsid)
setsid(); setsid();
}); });
#endif #endif