diff options
Diffstat (limited to 'src/corelib/io/qprocess.cpp')
-rw-r--r-- | src/corelib/io/qprocess.cpp | 99 |
1 files changed, 75 insertions, 24 deletions
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp index 88a54f275f..7ed319f5f1 100644 --- a/src/corelib/io/qprocess.cpp +++ b/src/corelib/io/qprocess.cpp @@ -450,11 +450,6 @@ void QProcessPrivate::Channel::clear() process = 0; } -/*! \fn bool QProcessPrivate::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid) - -\internal - */ - /*! \class QProcess \inmodule QtCore @@ -1058,10 +1053,7 @@ bool QProcessPrivate::tryReadFromChannel(Channel *channel) readBuffer.chop(available - readBytes); bool didRead = false; - if (readBytes == 0) { - if (channel->notifier) - channel->notifier->setEnabled(false); - } else if (currentReadChannel == channelIdx) { + if (currentReadChannel == channelIdx) { didRead = true; if (!emittedReadyRead) { emittedReadyRead = true; @@ -2114,6 +2106,64 @@ void QProcess::start(OpenMode mode) } /*! + \since 5.10 + + Starts the program set by setProgram() with arguments set by setArguments() + in a new process, and detaches from it. Returns \c true on success; + otherwise returns \c false. If the calling process exits, the + detached process will continue to run unaffected. + + \b{Unix:} The started process will run in its own session and act + like a daemon. + + The process will be started in the directory set by setWorkingDirectory(). + If workingDirectory() is empty, the working directory is inherited + from the calling process. + + \note On QNX, this may cause all application threads to + temporarily freeze. + + If the function is successful then *\a pid is set to the process identifier + of the started process. Note that the child process may exit and the PID + may become invalid without notice. Furthermore, after the child process + exits, the same PID may be recycled and used by a completely different + process. User code should be careful when using this variable, especially + if one intends to forcibly terminate the process by operating system means. + + Only the following property setters are supported by startDetached(): + \list + \li setArguments() + \li setCreateProcessArgumentsModifier() + \li setNativeArguments() + \li setProcessEnvironment() + \li setProgram() + \li setStandardErrorFile() + \li setStandardInputFile() + \li setStandardOutputFile() + \li setWorkingDirectory() + \endlist + All other properties of the QProcess object are ignored. + + \sa start() + \sa startDetached(const QString &program, const QStringList &arguments, + const QString &workingDirectory, qint64 *pid) + \sa startDetached(const QString &command) +*/ +bool QProcess::startDetached(qint64 *pid) +{ + Q_D(QProcess); + if (d->processState != NotRunning) { + qWarning("QProcess::startDetached: Process is already running"); + return false; + } + if (d->program.isEmpty()) { + d->setErrorAndEmit(QProcess::FailedToStart, tr("No program defined")); + return false; + } + return d->startDetached(pid); +} + +/*! Starts the program set by setProgram() with arguments set by setArguments(). The OpenMode is set to \a mode. @@ -2447,6 +2497,8 @@ int QProcess::execute(const QString &command) } /*! + \overload startDetached() + Starts the program \a program with the arguments \a arguments in a new process, and detaches from it. Returns \c true on success; otherwise returns \c false. If the calling process exits, the @@ -2454,16 +2506,10 @@ int QProcess::execute(const QString &command) Argument handling is identical to the respective start() overload. - \b{Unix:} The started process will run in its own session and act - like a daemon. - The process will be started in the directory \a workingDirectory. If \a workingDirectory is empty, the working directory is inherited from the calling process. - \note On QNX, this may cause all application threads to - temporarily freeze. - If the function is successful then *\a pid is set to the process identifier of the started process. @@ -2474,10 +2520,11 @@ bool QProcess::startDetached(const QString &program, const QString &workingDirectory, qint64 *pid) { - return QProcessPrivate::startDetached(program, - arguments, - workingDirectory, - pid); + QProcess process; + process.setProgram(program); + process.setArguments(arguments); + process.setWorkingDirectory(workingDirectory); + return process.startDetached(pid); } /*! @@ -2486,11 +2533,14 @@ bool QProcess::startDetached(const QString &program, bool QProcess::startDetached(const QString &program, const QStringList &arguments) { - return QProcessPrivate::startDetached(program, arguments); + QProcess process; + process.setProgram(program); + process.setArguments(arguments); + return process.startDetached(); } /*! - \overload + \overload startDetached() Starts the command \a command in a new process, and detaches from it. Returns \c true on success; otherwise returns \c false. @@ -2508,9 +2558,10 @@ bool QProcess::startDetached(const QString &command) if (args.isEmpty()) return false; - const QString prog = args.takeFirst(); - - return QProcessPrivate::startDetached(prog, args); + QProcess process; + process.setProgram(args.takeFirst()); + process.setArguments(args); + return process.startDetached(); } QT_BEGIN_INCLUDE_NAMESPACE |