19#if __has_include(<paths.h>)
102 auto it =
other.vars.constBegin();
103 const auto end =
other.vars.constEnd();
109 auto nit =
other.nameMap.constBegin();
110 const auto nend =
other.nameMap.constEnd();
111 for ( ; nit != nend; ++nit)
112 nameMap.insert(nit.key(), nit.value());
212 return lhs.d && rhs.d && lhs.d->
vars == rhs.d->
vars;
379#if QT_CONFIG(process)
381void QProcessPrivate::Channel::clear()
386 process->stdinChannel.type =
Normal;
387 process->stdinChannel.process =
nullptr;
391 process->stdoutChannel.type =
Normal;
392 process->stdoutChannel.process =
nullptr;
962QProcessPrivate::QProcessPrivate()
973QProcessPrivate::~QProcessPrivate()
975 if (stdinChannel.process)
976 stdinChannel.process->stdoutChannel.clear();
977 if (stdoutChannel.process)
978 stdoutChannel.process->stdinChannel.clear();
984void QProcessPrivate::setError(QProcess::ProcessError
error,
const QString &description)
986 processError =
error;
989 case QProcess::FailedToStart:
990 errorString = QProcess::tr(
"Process failed to start");
992 case QProcess::Crashed:
995 case QProcess::Timedout:
996 errorString = QProcess::tr(
"Process operation timed out");
998 case QProcess::ReadError:
999 errorString = QProcess::tr(
"Error reading from process");
1001 case QProcess::WriteError:
1002 errorString = QProcess::tr(
"Error writing to process");
1004 case QProcess::UnknownError:
1016void QProcessPrivate::setErrorAndEmit(QProcess::ProcessError
error,
const QString &description)
1021 emit q->errorOccurred(QProcess::ProcessError(processError));
1027bool QProcessPrivate::openChannels()
1030 if (inputChannelMode == QProcess::ForwardedInputChannel) {
1031 if (stdinChannel.type != Channel::Normal)
1032 qWarning(
"QProcess::openChannels: Inconsistent stdin channel configuration");
1033 }
else if (!openChannel(stdinChannel)) {
1038 if (processChannelMode == QProcess::ForwardedChannels
1039 || processChannelMode == QProcess::ForwardedOutputChannel) {
1040 if (stdoutChannel.type != Channel::Normal)
1041 qWarning(
"QProcess::openChannels: Inconsistent stdout channel configuration");
1042 }
else if (!openChannel(stdoutChannel)) {
1047 if (processChannelMode == QProcess::ForwardedChannels
1048 || processChannelMode == QProcess::ForwardedErrorChannel
1049 || processChannelMode == QProcess::MergedChannels) {
1050 if (stderrChannel.type != Channel::Normal)
1051 qWarning(
"QProcess::openChannels: Inconsistent stderr channel configuration");
1052 }
else if (!openChannel(stderrChannel)) {
1062void QProcessPrivate::closeChannels()
1064 closeChannel(&stdoutChannel);
1065 closeChannel(&stderrChannel);
1066 closeChannel(&stdinChannel);
1072bool QProcessPrivate::openChannelsForDetached()
1075 bool needToOpen = (stdinChannel.type == Channel::Redirect
1076 || stdinChannel.type == Channel::PipeSink);
1077 if (stdinChannel.type != Channel::Normal
1079 || inputChannelMode == QProcess::ForwardedInputChannel)) {
1080 qWarning(
"QProcess::openChannelsForDetached: Inconsistent stdin channel configuration");
1082 if (needToOpen && !openChannel(stdinChannel))
1086 needToOpen = (stdoutChannel.type == Channel::Redirect
1087 || stdoutChannel.type == Channel::PipeSource);
1088 if (stdoutChannel.type != Channel::Normal
1090 || processChannelMode == QProcess::ForwardedChannels
1091 || processChannelMode == QProcess::ForwardedOutputChannel)) {
1092 qWarning(
"QProcess::openChannelsForDetached: Inconsistent stdout channel configuration");
1094 if (needToOpen && !openChannel(stdoutChannel))
1098 needToOpen = (stderrChannel.type == Channel::Redirect);
1099 if (stderrChannel.type != Channel::Normal
1101 || processChannelMode == QProcess::ForwardedChannels
1102 || processChannelMode == QProcess::ForwardedErrorChannel
1103 || processChannelMode == QProcess::MergedChannels)) {
1104 qWarning(
"QProcess::openChannelsForDetached: Inconsistent stderr channel configuration");
1106 if (needToOpen && !openChannel(stderrChannel))
1116bool QProcessPrivate::tryReadFromChannel(Channel *
channel)
1126 QProcess::ProcessChannel channelIdx = (
channel == &stdoutChannel
1127 ? QProcess::StandardOutput
1128 : QProcess::StandardError);
1129 Q_ASSERT(readBuffers.size() >
int(channelIdx));
1135 if (readBytes == -2) {
1139 if (readBytes == -1) {
1140 setErrorAndEmit(QProcess::ReadError);
1141#if defined QPROCESS_DEBUG
1142 qDebug(
"QProcessPrivate::tryReadFromChannel(%d), failed to read from the process",
1143 int(
channel - &stdinChannel));
1147 if (readBytes == 0) {
1150#if defined QPROCESS_DEBUG
1151 qDebug(
"QProcessPrivate::tryReadFromChannel(%d), 0 bytes available",
1152 int(
channel - &stdinChannel));
1156#if defined QPROCESS_DEBUG
1157 qDebug(
"QProcessPrivate::tryReadFromChannel(%d), read %lld bytes from the process' output",
1158 int(
channel - &stdinChannel), readBytes);
1168 bool didRead =
false;
1169 if (currentReadChannel == channelIdx) {
1171 if (!emittedReadyRead) {
1172 QScopedValueRollback<bool> guard(emittedReadyRead,
true);
1173 emit q->readyRead();
1176 emit q->channelReadyRead(
int(channelIdx));
1177 if (channelIdx == QProcess::StandardOutput)
1178 emit q->readyReadStandardOutput(QProcess::QPrivateSignal());
1180 emit q->readyReadStandardError(QProcess::QPrivateSignal());
1187bool QProcessPrivate::_q_canReadStandardOutput()
1189 return tryReadFromChannel(&stdoutChannel);
1195bool QProcessPrivate::_q_canReadStandardError()
1197 return tryReadFromChannel(&stderrChannel);
1203void QProcessPrivate::_q_processDied()
1205#if defined QPROCESS_DEBUG
1206 qDebug(
"QProcessPrivate::_q_processDied()");
1215 _q_canReadStandardOutput();
1216 _q_canReadStandardError();
1222 if (processState != QProcess::NotRunning)
1229void QProcessPrivate::processFinished()
1232#if defined QPROCESS_DEBUG
1233 qDebug(
"QProcessPrivate::processFinished()");
1244 if (exitStatus == QProcess::CrashExit)
1245 setErrorAndEmit(QProcess::Crashed);
1248 emit q->readChannelFinished();
1253 emit q->finished(exitCode, QProcess::ExitStatus(exitStatus));
1255#if defined QPROCESS_DEBUG
1256 qDebug(
"QProcessPrivate::processFinished(): process is dead");
1263bool QProcessPrivate::_q_startupNotification()
1266#if defined QPROCESS_DEBUG
1267 qDebug(
"QProcessPrivate::startupNotification()");
1272 q->setProcessState(QProcess::Running);
1273 emit q->started(QProcess::QPrivateSignal());
1277 q->setProcessState(QProcess::NotRunning);
1278 setErrorAndEmit(QProcess::FailedToStart,
errorMessage);
1289void QProcessPrivate::closeWriteChannel()
1291#if defined QPROCESS_DEBUG
1292 qDebug(
"QProcessPrivate::closeWriteChannel()");
1295 closeChannel(&stdinChannel);
1301QProcess::QProcess(
QObject *parent)
1302 :
QIODevice(*new QProcessPrivate, parent)
1304#if defined QPROCESS_DEBUG
1305 qDebug(
"QProcess::QProcess(%p)", parent);
1315QProcess::~QProcess()
1318 if (
d->processState != NotRunning) {
1335QProcess::ProcessChannelMode QProcess::processChannelMode()
const
1337 Q_D(
const QProcess);
1338 return ProcessChannelMode(
d->processChannelMode);
1352void QProcess::setProcessChannelMode(ProcessChannelMode
mode)
1355 d->processChannelMode =
mode;
1365QProcess::InputChannelMode QProcess::inputChannelMode()
const
1367 Q_D(
const QProcess);
1368 return InputChannelMode(
d->inputChannelMode);
1380void QProcess::setInputChannelMode(InputChannelMode
mode)
1383 d->inputChannelMode =
mode;
1391QProcess::ProcessChannel QProcess::readChannel()
const
1393 Q_D(
const QProcess);
1394 return ProcessChannel(
d->currentReadChannel);
1405void QProcess::setReadChannel(ProcessChannel
channel)
1420void QProcess::closeReadChannel(ProcessChannel
channel)
1424 if (
channel == StandardOutput)
1425 d->stdoutChannel.closed =
true;
1427 d->stderrChannel.closed =
true;
1448void QProcess::closeWriteChannel()
1451 d->stdinChannel.closed =
true;
1452 if (bytesToWrite() == 0)
1453 d->closeWriteChannel();
1518 d->stdoutChannel.append =
mode == Append;
1545 d->stderrChannel.append =
mode == Append;
1560void QProcess::setStandardOutputProcess(QProcess *
destination)
1562 QProcessPrivate *dfrom = d_func();
1564 dfrom->stdoutChannel.pipeTo(dto);
1565 dto->stdinChannel.pipeFrom(dfrom);
1568#if defined(Q_OS_WIN) || defined(Q_QDOC)
1579QString QProcess::nativeArguments()
const
1581 Q_D(
const QProcess);
1582 return d->nativeArguments;
1618QProcess::CreateProcessArgumentModifier QProcess::createProcessArgumentsModifier()
const
1620 Q_D(
const QProcess);
1621 return d->modifyCreateProcessArgs;
1635void QProcess::setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier)
1638 d->modifyCreateProcessArgs = modifier;
1643#if defined(Q_OS_UNIX) || defined(Q_QDOC)
1654std::function<
void(
void)> QProcess::childProcessModifier()
const
1656 Q_D(
const QProcess);
1657 return d->unixExtras ?
d->unixExtras->childProcessModifier : std::function<void(void)>();
1707void QProcess::setChildProcessModifier(
const std::function<
void(
void)> &modifier)
1711 d->unixExtras.reset(
new QProcessPrivate::UnixExtras);
1712 d->unixExtras->childProcessModifier = modifier;
1765auto QProcess::unixProcessParameters() const noexcept -> UnixProcessParameters
1767 Q_D(
const QProcess);
1768 return d->unixExtras ?
d->unixExtras->processParameters : UnixProcessParameters{};
1789void QProcess::setUnixProcessParameters(
const UnixProcessParameters &
params)
1793 d->unixExtras.reset(
new QProcessPrivate::UnixExtras);
1794 d->unixExtras->processParameters =
params;
1808void QProcess::setUnixProcessParameters(UnixProcessFlags flagsOnly)
1812 d->unixExtras.reset(
new QProcessPrivate::UnixExtras);
1813 d->unixExtras->processParameters = { flagsOnly };
1826QString QProcess::workingDirectory()
const
1828 Q_D(
const QProcess);
1829 return d->workingDirectory;
1839void QProcess::setWorkingDirectory(
const QString &
dir)
1842 d->workingDirectory =
dir;
1851qint64 QProcess::processId()
const
1853 Q_D(
const QProcess);
1855 return d->pid ?
d->pid->dwProcessId : 0;
1866void QProcess::close()
1869 emit aboutToClose();
1870 while (waitForBytesWritten(-1))
1874 d->setWriteChannelCount(0);
1880bool QProcess::isSequential()
const
1887qint64 QProcess::bytesToWrite()
const
1890 return d_func()->pipeWriterBytesToWrite();
1901QProcess::ProcessError QProcess::error()
const
1903 Q_D(
const QProcess);
1904 return ProcessError(
d->processError);
1912QProcess::ProcessState QProcess::state()
const
1914 Q_D(
const QProcess);
1915 return ProcessState(
d->processState);
1932void QProcess::setEnvironment(
const QStringList &environment)
1948 Q_D(
const QProcess);
1949 return d->environment.toStringList();
1968 d->environment = environment;
1982 Q_D(
const QProcess);
1983 return d->environment;
2006bool QProcess::waitForStarted(
int msecs)
2009 if (
d->processState == QProcess::Starting)
2012 return d->processState == QProcess::Running;
2017bool QProcess::waitForReadyRead(
int msecs)
2021 if (
d->processState == QProcess::NotRunning)
2023 if (
d->currentReadChannel == QProcess::StandardOutput &&
d->stdoutChannel.closed)
2025 if (
d->currentReadChannel == QProcess::StandardError &&
d->stderrChannel.closed)
2029 if (
d->processState == QProcess::Starting) {
2030 bool started =
d->waitForStarted(
deadline);
2040bool QProcess::waitForBytesWritten(
int msecs)
2043 if (
d->processState == QProcess::NotRunning)
2047 if (
d->processState == QProcess::Starting) {
2048 bool started =
d->waitForStarted(
deadline);
2053 return d->waitForBytesWritten(
deadline);
2075bool QProcess::waitForFinished(
int msecs)
2078 if (
d->processState == QProcess::NotRunning)
2082 if (
d->processState == QProcess::Starting) {
2083 bool started =
d->waitForStarted(
deadline);
2096void QProcess::setProcessState(ProcessState
state)
2099 if (
d->processState ==
state)
2102 emit stateChanged(
state, QPrivateSignal());
2105#if QT_VERSION < QT_VERSION_CHECK(7,0,0)
2109auto QProcess::setupChildProcess() -> Use_setChildProcessModifier_Instead
2111 Q_UNREACHABLE_RETURN({});
2123 if (
d->processState == QProcess::NotRunning)
2137 ProcessChannel tmp = readChannel();
2138 setReadChannel(StandardOutput);
2140 setReadChannel(tmp);
2155 if (
d->processChannelMode == MergedChannels) {
2156 qWarning(
"QProcess::readAllStandardError: Called with MergedChannels");
2158 ProcessChannel tmp = readChannel();
2159 setReadChannel(StandardError);
2161 setReadChannel(tmp);
2208 if (
d->processState != NotRunning) {
2209 qWarning(
"QProcess::start: Process is already running");
2213 d->setErrorAndEmit(QProcess::FailedToStart,
tr(
"No program defined"));
2232void QProcess::start(OpenMode
mode)
2235 if (
d->processState != NotRunning) {
2236 qWarning(
"QProcess::start: Process is already running");
2239 if (
d->program.isEmpty()) {
2240 d->setErrorAndEmit(QProcess::FailedToStart,
tr(
"No program defined"));
2281void QProcess::startCommand(
const QString &command, OpenMode
mode)
2285 qWarning(
"QProcess::startCommand: empty or whitespace-only command was provided");
2339bool QProcess::startDetached(
qint64 *pid)
2342 if (
d->processState != NotRunning) {
2343 qWarning(
"QProcess::startDetached: Process is already running");
2346 if (
d->program.isEmpty()) {
2347 d->setErrorAndEmit(QProcess::FailedToStart,
tr(
"No program defined"));
2350 return d->startDetached(pid);
2364bool QProcess::open(OpenMode
mode)
2367 if (
d->processState != NotRunning) {
2368 qWarning(
"QProcess::start: Process is already running");
2371 if (
d->program.isEmpty()) {
2372 qWarning(
"QProcess::start: program not set");
2380void QProcessPrivate::start(QIODevice::OpenMode
mode)
2383#if defined QPROCESS_DEBUG
2387 if (stdinChannel.type != QProcessPrivate::Channel::Normal)
2389 if (stdoutChannel.type != QProcessPrivate::Channel::Normal &&
2390 (stderrChannel.type != QProcessPrivate::Channel::Normal ||
2391 processChannelMode == QProcess::MergedChannels))
2396 if (stdoutChannel.type == QProcessPrivate::Channel::Normal)
2397 q->setStandardOutputFile(
q->nullDevice());
2398 if (stderrChannel.type == QProcessPrivate::Channel::Normal
2399 && processChannelMode != QProcess::MergedChannels)
2400 q->setStandardErrorFile(
q->nullDevice());
2403 q->QIODevice::open(
mode);
2405 if (
q->isReadable() && processChannelMode != QProcess::MergedChannels)
2406 setReadChannelCount(2);
2408 stdinChannel.closed =
false;
2409 stdoutChannel.closed =
false;
2410 stderrChannel.closed =
false;
2413 exitStatus = QProcess::NormalExit;
2414 processError = QProcess::UnknownError;
2433 bool inQuote =
false;
2438 for (
int i = 0;
i < command.
size(); ++
i) {
2439 if (command.
at(
i) == u
'"') {
2441 if (quoteCount == 3) {
2444 tmp += command.
at(
i);
2449 if (quoteCount == 1)
2453 if (!inQuote && command.
at(
i).isSpace()) {
2459 tmp += command.
at(
i);
2475QString QProcess::program()
const
2477 Q_D(
const QProcess);
2497 if (
d->processState != NotRunning) {
2498 qWarning(
"QProcess::setProgram: Process is already running");
2513 Q_D(
const QProcess);
2514 return d->arguments;
2528 if (
d->processState != NotRunning) {
2529 qWarning(
"QProcess::setProgram: Process is already running");
2551void QProcess::terminate()
2554 d->terminateProcess();
2565void QProcess::kill()
2576int QProcess::exitCode()
const
2578 Q_D(
const QProcess);
2591QProcess::ExitStatus QProcess::exitStatus()
const
2593 Q_D(
const QProcess);
2594 return ExitStatus(
d->exitStatus);
2617 process.setProcessChannelMode(ForwardedChannels);
2619 if (!process.waitForFinished(-1) || process.error() == FailedToStart)
2621 return process.exitStatus() == QProcess::NormalExit ? process.exitCode() : -1;
2645 const QString &workingDirectory,
2651 process.setWorkingDirectory(workingDirectory);
2652 return process.startDetached(pid);
2712#elif defined(_PATH_DEVNULL)
2723#include "moc_qprocess.cpp"
IOBluetoothL2CAPChannel * channel
static QString toNativeSeparators(const QString &pathName)
\inmodule QtCore \reentrant
virtual qint64 bytesToWrite() const
For buffered devices, this function returns the number of bytes waiting to be written.
virtual void close()
First emits aboutToClose(), then closes the device and sets its OpenMode to NotOpen.
void setCurrentReadChannel(int channel)
bool isEmpty() const noexcept
const_iterator constBegin() const noexcept
const_iterator constEnd() const noexcept
const_iterator ConstIterator
iterator insert(const Key &key, const T &value)
bool contains(const Key &key) const
const_iterator cend() const
size_type remove(const Key &key)
const_iterator cbegin() const
const_iterator constFind(const Key &key) const
const_iterator constBegin() const
const_iterator constEnd() const
Value prepareValue(const QString &value) const
static QProcessEnvironment fromList(const QStringList &list)
Key prepareName(const QString &name) const
QString valueToString(const Value &value) const
void insert(const QProcessEnvironmentPrivate &other)
QString nameToString(const Key &name) const
QStringList toList() const
QProcessEnvironment & operator=(const QProcessEnvironment &other)
Copies the contents of the other QProcessEnvironment object into this one.
QString value(const QString &name, const QString &defaultValue=QString()) const
Searches this QProcessEnvironment object for a variable identified by name and returns its value.
void remove(const QString &name)
Removes the environment variable identified by name from this QProcessEnvironment object.
QStringList toStringList() const
Converts this QProcessEnvironment object into a list of strings, one for each environment variable th...
void insert(const QString &name, const QString &value)
Inserts the environment variable of name name and contents value into this QProcessEnvironment object...
bool isEmpty() const
Returns true if this QProcessEnvironment object is empty: that is there are no key=value pairs set.
bool inheritsFromParent() const
Returns true if this QProcessEnvironment was constructed using {QProcessEnvironment::InheritFromParen...
bool contains(const QString &name) const
Returns true if the environment variable of name name is found in this QProcessEnvironment object.
QProcessEnvironment()
Creates a new QProcessEnvironment object.
void clear()
Removes all key=value pairs from this QProcessEnvironment object, making it empty.
Initialization
This enum contains a token that is used to disambiguate constructors.
~QProcessEnvironment()
Frees the resources associated with this QProcessEnvironment object.
static QProcessEnvironment systemEnvironment()
void detach()
If the shared data object's reference count is greater than 1, this function creates a deep copy of t...
const T * constData() const noexcept
Returns a const pointer to the shared data object.
T * data()
Returns a pointer to the shared data object.
constexpr qsizetype size() const noexcept
Returns the size of this string view, in UTF-16 code units (that is, surrogate pairs count as two for...
constexpr QChar at(qsizetype n) const noexcept
Returns the character at position n in this string view.
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
void clear()
Clears the contents of the string and makes it null.
QSet< QString >::iterator it
QList< QVariant > arguments
Combined button and popup list for selecting options.
QList< QString > QStringList
Constructs a string list that contains the given string, str.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char * destination
DBusConnection const char DBusError * error
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static ControlElement< T > * ptr(QWidget *widget)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLdouble GLdouble GLdouble GLdouble q
GLbitfield GLuint readBuffer
bool comparesEqual(const QProcessEnvironment &lhs, const QProcessEnvironment &rhs)
static void setError(QJsonObject *response, const QString &msg)
#define QRINGBUFFER_CHUNKSIZE
#define QStringLiteral(str)
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
QDeadlineTimer deadline(30s)