File indexing completed on 2025-09-18 09:26:41
0001
0002
0003
0004
0005 #ifndef QPROCESS_H
0006 #define QPROCESS_H
0007
0008 #include <QtCore/qcompare.h>
0009 #include <QtCore/qiodevice.h>
0010 #include <QtCore/qstringlist.h>
0011 #include <QtCore/qshareddata.h>
0012
0013 #include <functional>
0014
0015 QT_REQUIRE_CONFIG(processenvironment);
0016
0017 #if defined(Q_OS_WIN) || defined(Q_QDOC)
0018 struct _PROCESS_INFORMATION;
0019 struct _SECURITY_ATTRIBUTES;
0020 struct _STARTUPINFOW;
0021 using Q_PROCESS_INFORMATION = _PROCESS_INFORMATION;
0022 using Q_SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
0023 using Q_STARTUPINFO = _STARTUPINFOW;
0024 #endif
0025
0026 QT_BEGIN_NAMESPACE
0027
0028 class QProcessPrivate;
0029 class QProcessEnvironmentPrivate;
0030
0031 class Q_CORE_EXPORT QProcessEnvironment
0032 {
0033 public:
0034 enum Initialization { InheritFromParent };
0035
0036 QProcessEnvironment();
0037 QProcessEnvironment(Initialization) noexcept;
0038 QProcessEnvironment(const QProcessEnvironment &other);
0039 ~QProcessEnvironment();
0040 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QProcessEnvironment)
0041 QProcessEnvironment &operator=(const QProcessEnvironment &other);
0042
0043 void swap(QProcessEnvironment &other) noexcept { d.swap(other.d); }
0044
0045 #if QT_CORE_REMOVED_SINCE(6, 8)
0046 bool operator==(const QProcessEnvironment &other) const;
0047 inline bool operator!=(const QProcessEnvironment &other) const
0048 { return !operator==(other); }
0049 #endif
0050
0051 bool isEmpty() const;
0052 [[nodiscard]] bool inheritsFromParent() const;
0053 void clear();
0054
0055 bool contains(const QString &name) const;
0056 void insert(const QString &name, const QString &value);
0057 void remove(const QString &name);
0058 QString value(const QString &name, const QString &defaultValue = QString()) const;
0059
0060 QStringList toStringList() const;
0061
0062 QStringList keys() const;
0063
0064 void insert(const QProcessEnvironment &e);
0065
0066 static QProcessEnvironment systemEnvironment();
0067
0068 private:
0069 friend Q_CORE_EXPORT bool comparesEqual(const QProcessEnvironment &lhs,
0070 const QProcessEnvironment &rhs);
0071 Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QProcessEnvironment)
0072 friend class QProcessPrivate;
0073 friend class QProcessEnvironmentPrivate;
0074 QSharedDataPointer<QProcessEnvironmentPrivate> d;
0075 };
0076
0077 Q_DECLARE_SHARED(QProcessEnvironment)
0078
0079 #if QT_CONFIG(process)
0080
0081 class Q_CORE_EXPORT QProcess : public QIODevice
0082 {
0083 Q_OBJECT
0084 public:
0085 enum ProcessError {
0086 FailedToStart,
0087 Crashed,
0088 Timedout,
0089 ReadError,
0090 WriteError,
0091 UnknownError
0092 };
0093 Q_ENUM(ProcessError)
0094
0095 enum ProcessState {
0096 NotRunning,
0097 Starting,
0098 Running
0099 };
0100 Q_ENUM(ProcessState)
0101
0102 enum ProcessChannel {
0103 StandardOutput,
0104 StandardError
0105 };
0106 Q_ENUM(ProcessChannel)
0107
0108 enum ProcessChannelMode {
0109 SeparateChannels,
0110 MergedChannels,
0111 ForwardedChannels,
0112 ForwardedOutputChannel,
0113 ForwardedErrorChannel
0114 };
0115 Q_ENUM(ProcessChannelMode)
0116
0117 enum InputChannelMode {
0118 ManagedInputChannel,
0119 ForwardedInputChannel
0120 };
0121 Q_ENUM(InputChannelMode)
0122
0123 enum ExitStatus {
0124 NormalExit,
0125 CrashExit
0126 };
0127 Q_ENUM(ExitStatus)
0128
0129 explicit QProcess(QObject *parent = nullptr);
0130 virtual ~QProcess();
0131
0132 void start(const QString &program, const QStringList &arguments = {}, OpenMode mode = ReadWrite);
0133 void start(OpenMode mode = ReadWrite);
0134 void startCommand(const QString &command, OpenMode mode = ReadWrite);
0135 bool startDetached(qint64 *pid = nullptr);
0136 bool open(OpenMode mode = ReadWrite) override;
0137
0138 QString program() const;
0139 void setProgram(const QString &program);
0140
0141 QStringList arguments() const;
0142 void setArguments(const QStringList & arguments);
0143
0144 ProcessChannelMode processChannelMode() const;
0145 void setProcessChannelMode(ProcessChannelMode mode);
0146 InputChannelMode inputChannelMode() const;
0147 void setInputChannelMode(InputChannelMode mode);
0148
0149 ProcessChannel readChannel() const;
0150 void setReadChannel(ProcessChannel channel);
0151
0152 void closeReadChannel(ProcessChannel channel);
0153 void closeWriteChannel();
0154
0155 void setStandardInputFile(const QString &fileName);
0156 void setStandardOutputFile(const QString &fileName, OpenMode mode = Truncate);
0157 void setStandardErrorFile(const QString &fileName, OpenMode mode = Truncate);
0158 void setStandardOutputProcess(QProcess *destination);
0159
0160 #if defined(Q_OS_WIN) || defined(Q_QDOC)
0161 QString nativeArguments() const;
0162 void setNativeArguments(const QString &arguments);
0163 struct CreateProcessArguments
0164 {
0165 const wchar_t *applicationName;
0166 wchar_t *arguments;
0167 Q_SECURITY_ATTRIBUTES *processAttributes;
0168 Q_SECURITY_ATTRIBUTES *threadAttributes;
0169 bool inheritHandles;
0170 unsigned long flags;
0171 void *environment;
0172 const wchar_t *currentDirectory;
0173 Q_STARTUPINFO *startupInfo;
0174 Q_PROCESS_INFORMATION *processInformation;
0175 };
0176 typedef std::function<void(CreateProcessArguments *)> CreateProcessArgumentModifier;
0177 CreateProcessArgumentModifier createProcessArgumentsModifier() const;
0178 void setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier);
0179 #endif
0180 #if defined(Q_OS_UNIX) || defined(Q_QDOC)
0181 std::function<void(void)> childProcessModifier() const;
0182 void setChildProcessModifier(const std::function<void(void)> &modifier);
0183 Q_NORETURN void failChildProcessModifier(const char *description, int error = 0) noexcept;
0184
0185 enum class UnixProcessFlag : quint32 {
0186 ResetSignalHandlers = 0x0001,
0187 IgnoreSigPipe = 0x0002,
0188
0189 CloseFileDescriptors = 0x0010,
0190 UseVFork = 0x0020,
0191 CreateNewSession = 0x0040,
0192 DisconnectControllingTerminal = 0x0080,
0193 ResetIds = 0x0100,
0194 DisableCoreDumps = 0x0200,
0195 };
0196 Q_DECLARE_FLAGS(UnixProcessFlags, UnixProcessFlag)
0197 struct UnixProcessParameters
0198 {
0199 UnixProcessFlags flags = {};
0200 int lowestFileDescriptorToClose = 0;
0201
0202 quint32 _reserved[6] {};
0203 };
0204 UnixProcessParameters unixProcessParameters() const noexcept;
0205 void setUnixProcessParameters(const UnixProcessParameters ¶ms);
0206 void setUnixProcessParameters(UnixProcessFlags flagsOnly);
0207 #endif
0208
0209 QString workingDirectory() const;
0210 void setWorkingDirectory(const QString &dir);
0211
0212 void setEnvironment(const QStringList &environment);
0213 QStringList environment() const;
0214 void setProcessEnvironment(const QProcessEnvironment &environment);
0215 QProcessEnvironment processEnvironment() const;
0216
0217 QProcess::ProcessError error() const;
0218 QProcess::ProcessState state() const;
0219
0220 qint64 processId() const;
0221
0222 bool waitForStarted(int msecs = 30000);
0223 bool waitForReadyRead(int msecs = 30000) override;
0224 bool waitForBytesWritten(int msecs = 30000) override;
0225 bool waitForFinished(int msecs = 30000);
0226
0227 QByteArray readAllStandardOutput();
0228 QByteArray readAllStandardError();
0229
0230 int exitCode() const;
0231 QProcess::ExitStatus exitStatus() const;
0232
0233
0234 qint64 bytesToWrite() const override;
0235 bool isSequential() const override;
0236 void close() override;
0237
0238 static int execute(const QString &program, const QStringList &arguments = {});
0239 static bool startDetached(const QString &program, const QStringList &arguments = {},
0240 const QString &workingDirectory = QString(), qint64 *pid = nullptr);
0241
0242 static QStringList systemEnvironment();
0243
0244 static QString nullDevice();
0245
0246 static QStringList splitCommand(QStringView command);
0247
0248 public Q_SLOTS:
0249 void terminate();
0250 void kill();
0251
0252 Q_SIGNALS:
0253 void started(QPrivateSignal);
0254 void finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit);
0255 void errorOccurred(QProcess::ProcessError error);
0256 void stateChanged(QProcess::ProcessState state, QPrivateSignal);
0257
0258 void readyReadStandardOutput(QPrivateSignal);
0259 void readyReadStandardError(QPrivateSignal);
0260
0261 protected:
0262 void setProcessState(ProcessState state);
0263
0264
0265 qint64 readData(char *data, qint64 maxlen) override;
0266 qint64 writeData(const char *data, qint64 len) override;
0267
0268 private:
0269 Q_DECLARE_PRIVATE(QProcess)
0270 Q_DISABLE_COPY(QProcess)
0271
0272 #if QT_VERSION < QT_VERSION_CHECK(7,0,0)
0273
0274
0275
0276 struct Use_setChildProcessModifier_Instead {};
0277 QT_DEPRECATED_X("Use setChildProcessModifier() instead")
0278 virtual Use_setChildProcessModifier_Instead setupChildProcess();
0279 #endif
0280
0281 Q_PRIVATE_SLOT(d_func(), bool _q_canReadStandardOutput())
0282 Q_PRIVATE_SLOT(d_func(), bool _q_canReadStandardError())
0283 #ifdef Q_OS_UNIX
0284 Q_PRIVATE_SLOT(d_func(), bool _q_canWrite())
0285 #endif
0286 Q_PRIVATE_SLOT(d_func(), bool _q_startupNotification())
0287 Q_PRIVATE_SLOT(d_func(), void _q_processDied())
0288 };
0289
0290 #ifdef Q_OS_UNIX
0291 Q_DECLARE_OPERATORS_FOR_FLAGS(QProcess::UnixProcessFlags)
0292 #endif
0293
0294 #endif
0295
0296 QT_END_NAMESPACE
0297
0298 #endif