Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qprocess.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2023 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4// Qt-Security score:critical reason:execute-external-code
5
6#ifndef QPROCESS_H
7#define QPROCESS_H
8
9#include <QtCore/qcompare.h>
10#include <QtCore/qdeadlinetimer.h>
11#include <QtCore/qiodevice.h>
12#include <QtCore/qstringlist.h>
13#include <QtCore/qshareddata.h>
14
15#include <functional>
16
18
19#if defined(Q_OS_WIN) || defined(Q_QDOC)
20struct _PROCESS_INFORMATION;
21struct _SECURITY_ATTRIBUTES;
22struct _STARTUPINFOW;
23using Q_PROCESS_INFORMATION = _PROCESS_INFORMATION;
24using Q_SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
25using Q_STARTUPINFO = _STARTUPINFOW;
26#endif
27
28QT_BEGIN_NAMESPACE
29
30class QProcessPrivate;
32
33class Q_CORE_EXPORT QProcessEnvironment
34{
35public:
36 enum Initialization { InheritFromParent };
37
38 QProcessEnvironment();
39 QProcessEnvironment(Initialization) noexcept;
40 QProcessEnvironment(const QProcessEnvironment &other);
41 ~QProcessEnvironment();
42 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QProcessEnvironment)
43 QProcessEnvironment &operator=(const QProcessEnvironment &other);
44
45 void swap(QProcessEnvironment &other) noexcept { d.swap(other.d); }
46
47#if QT_CORE_REMOVED_SINCE(6, 8)
48 bool operator==(const QProcessEnvironment &other) const;
49 inline bool operator!=(const QProcessEnvironment &other) const
50 { return !operator==(other); }
51#endif
52
53 bool isEmpty() const;
54 [[nodiscard]] bool inheritsFromParent() const;
55 void clear();
56
57 bool contains(const QString &name) const;
58 void insert(const QString &name, const QString &value);
59 void remove(const QString &name);
60 QString value(const QString &name, const QString &defaultValue = QString()) const;
61
62 QStringList toStringList() const;
63
64 QStringList keys() const;
65
66 void insert(const QProcessEnvironment &e);
67
68 static QProcessEnvironment systemEnvironment();
69
70private:
71 friend Q_CORE_EXPORT bool comparesEqual(const QProcessEnvironment &lhs,
72 const QProcessEnvironment &rhs);
73 Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QProcessEnvironment)
74 friend class QProcessPrivate;
75 friend class QProcessEnvironmentPrivate;
76 QSharedDataPointer<QProcessEnvironmentPrivate> d;
77};
78
80
81#if QT_CONFIG(process)
82
83class Q_CORE_EXPORT QProcess : public QIODevice
84{
85 Q_OBJECT
86public:
87 enum ProcessError {
88 FailedToStart,
89 Crashed,
90 Timedout,
91 ReadError,
92 WriteError,
93 UnknownError
94 };
95 Q_ENUM(ProcessError)
96
97 enum ProcessState {
98 NotRunning,
99 Starting,
100 Running
101 };
102 Q_ENUM(ProcessState)
103
104 enum ProcessChannel {
105 StandardOutput,
106 StandardError
107 };
108 Q_ENUM(ProcessChannel)
109
110 enum ProcessChannelMode {
111 SeparateChannels,
112 MergedChannels,
113 ForwardedChannels,
114 ForwardedOutputChannel,
115 ForwardedErrorChannel
116 };
117 Q_ENUM(ProcessChannelMode)
118
119 enum InputChannelMode {
120 ManagedInputChannel,
121 ForwardedInputChannel
122 };
123 Q_ENUM(InputChannelMode)
124
125 enum ExitStatus {
126 NormalExit,
127 CrashExit
128 };
129 Q_ENUM(ExitStatus)
130
131 explicit QProcess(QObject *parent = nullptr);
132 virtual ~QProcess();
133
134 void start(const QString &program, const QStringList &arguments = {}, OpenMode mode = ReadWrite);
135 void start(OpenMode mode = ReadWrite);
136 void startCommand(const QString &command, OpenMode mode = ReadWrite);
137 bool startDetached(qint64 *pid = nullptr);
138 bool open(OpenMode mode = ReadWrite) override;
139
140 QString program() const;
141 void setProgram(const QString &program);
142
143 QStringList arguments() const;
144 void setArguments(const QStringList & arguments);
145
146 ProcessChannelMode processChannelMode() const;
147 void setProcessChannelMode(ProcessChannelMode mode);
148 InputChannelMode inputChannelMode() const;
149 void setInputChannelMode(InputChannelMode mode);
150
151 ProcessChannel readChannel() const;
152 void setReadChannel(ProcessChannel channel);
153
154 void closeReadChannel(ProcessChannel channel);
155 void closeWriteChannel();
156
157 void setStandardInputFile(const QString &fileName);
158 void setStandardOutputFile(const QString &fileName, OpenMode mode = Truncate);
159 void setStandardErrorFile(const QString &fileName, OpenMode mode = Truncate);
160 void setStandardOutputProcess(QProcess *destination);
161
162#if defined(Q_OS_WIN) || defined(Q_QDOC)
163 QString nativeArguments() const;
164 void setNativeArguments(const QString &arguments);
165 struct CreateProcessArguments
166 {
167 const wchar_t *applicationName;
168 wchar_t *arguments;
169 Q_SECURITY_ATTRIBUTES *processAttributes;
170 Q_SECURITY_ATTRIBUTES *threadAttributes;
171 bool inheritHandles;
172 unsigned long flags;
173 void *environment;
174 const wchar_t *currentDirectory;
175 Q_STARTUPINFO *startupInfo;
176 Q_PROCESS_INFORMATION *processInformation;
177 };
178 typedef std::function<void(CreateProcessArguments *)> CreateProcessArgumentModifier;
179 CreateProcessArgumentModifier createProcessArgumentsModifier() const;
180 void setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier);
181#endif // Q_OS_WIN || Q_QDOC
182#if defined(Q_OS_UNIX) || defined(Q_QDOC)
183 std::function<void(void)> childProcessModifier() const;
184 void setChildProcessModifier(const std::function<void(void)> &modifier);
185 Q_NORETURN void failChildProcessModifier(const char *description, int error = 0) noexcept;
186
187 enum class UnixProcessFlag : quint32 {
188 ResetSignalHandlers = 0x0001, // like POSIX_SPAWN_SETSIGDEF
189 IgnoreSigPipe = 0x0002,
190 // some room if we want to add IgnoreSigHup or so
191 CloseFileDescriptors = 0x0010,
192 UseVFork = 0x0020, // like POSIX_SPAWN_USEVFORK
193 CreateNewSession = 0x0040, // like POSIX_SPAWN_SETSID
194 DisconnectControllingTerminal = 0x0080,
195 ResetIds = 0x0100, // like POSIX_SPAWN_RESETIDS
196 DisableCoreDumps = 0x0200,
197 };
198 Q_DECLARE_FLAGS(UnixProcessFlags, UnixProcessFlag)
199 struct UnixProcessParameters
200 {
201 UnixProcessFlags flags = {};
202 int lowestFileDescriptorToClose = 0;
203
204 quint32 _reserved[6] {};
205 };
206 UnixProcessParameters unixProcessParameters() const noexcept;
207 void setUnixProcessParameters(const UnixProcessParameters &params);
208 void setUnixProcessParameters(UnixProcessFlags flagsOnly);
209#endif
210
211 QString workingDirectory() const;
212 void setWorkingDirectory(const QString &dir);
213
214 void setEnvironment(const QStringList &environment);
215 QStringList environment() const;
216 void setProcessEnvironment(const QProcessEnvironment &environment);
217 QProcessEnvironment processEnvironment() const;
218
219 QProcess::ProcessError error() const;
220 QProcess::ProcessState state() const;
221
222 qint64 processId() const;
223
224 using QIODevice::waitForBytesWritten;
225 using QIODevice::waitForReadyRead;
226 bool waitForBytesWritten(QDeadlineTimer deadline = std::chrono::seconds(30)) QT7_ONLY(override);
227 bool waitForStarted(QDeadlineTimer deadline = std::chrono::seconds(30));
228 bool waitForFinished(QDeadlineTimer deadline = std::chrono::seconds(30));
229 bool waitForReadyRead(QDeadlineTimer deadline = std::chrono::seconds(30)) QT7_ONLY(override);
230
231#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
232 QT_CORE_INLINE_SINCE(6, 13)
233 bool waitForBytesWritten(int msecs) override;
234#endif
235 QT_CORE_INLINE_SINCE(6, 13)
236 bool waitForStarted(int msecs);
237 QT_CORE_INLINE_SINCE(6, 13)
238 bool waitForFinished(int msecs);
239#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
240 QT_CORE_INLINE_SINCE(6, 13)
241 bool waitForReadyRead(int msecs) override;
242#endif
243
244 QByteArray readAllStandardOutput();
245 QByteArray readAllStandardError();
246
247 int exitCode() const;
248 QProcess::ExitStatus exitStatus() const;
249
250 // QIODevice
251 qint64 bytesToWrite() const override;
252 bool isSequential() const override;
253 void close() override;
254
255 static int execute(const QString &program, const QStringList &arguments = {});
256 static bool startDetached(const QString &program, const QStringList &arguments = {},
257 const QString &workingDirectory = QString(), qint64 *pid = nullptr);
258
259 static QStringList systemEnvironment();
260
261 static QString nullDevice();
262
263 static QStringList splitCommand(QStringView command);
264
265public Q_SLOTS:
266 void terminate();
267 void kill();
268
269Q_SIGNALS:
270 void started(QPrivateSignal);
271 void finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit);
272 void errorOccurred(QProcess::ProcessError error);
273 void stateChanged(QProcess::ProcessState state, QPrivateSignal);
274
275 void readyReadStandardOutput(QPrivateSignal);
276 void readyReadStandardError(QPrivateSignal);
277
278protected:
279 void setProcessState(ProcessState state);
280
281 // QIODevice
282 qint64 readData(char *data, qint64 maxlen) override;
283 qint64 writeData(const char *data, qint64 len) override;
284
285private:
286 Q_DECLARE_PRIVATE(QProcess)
287 Q_DISABLE_COPY(QProcess)
288
289#if QT_VERSION < QT_VERSION_CHECK(7,0,0)
290 // ### Qt7: Remove this struct and the virtual function; they're here only
291 // to cause build errors in Qt 5 code that wasn't updated to Qt 6's
292 // setChildProcessModifier()
293 struct Use_setChildProcessModifier_Instead {};
294 QT_DEPRECATED_X("Use setChildProcessModifier() instead")
295 virtual Use_setChildProcessModifier_Instead setupChildProcess();
296#endif
297};
298
299#ifdef Q_OS_UNIX
300Q_DECLARE_OPERATORS_FOR_FLAGS(QProcess::UnixProcessFlags)
301#endif
302
303#if QT_CORE_INLINE_IMPL_SINCE(6, 13)
304bool QProcess::waitForStarted(int msecs)
305{
306 return waitForStarted(QDeadlineTimer(msecs));
307}
308
309bool QProcess::waitForFinished(int msecs)
310{
311 return waitForFinished(QDeadlineTimer(msecs));
312}
313#endif
314#if QT_CORE_INLINE_IMPL_SINCE(6, 13) && QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
315bool QProcess::waitForBytesWritten(int msecs)
316{
317 return waitForBytesWritten(QDeadlineTimer(msecs));
318}
319
320bool QProcess::waitForReadyRead(int msecs)
321{
322 return waitForReadyRead(QDeadlineTimer(msecs));
323}
324#endif
325
326#else // !QT_CONFIG(process)
327
329{
330public:
331 Q_CORE_EXPORT static QStringList splitCommand(QStringView command);
332
333private:
334 QProcess() = delete;
336};
337
338#endif // QT_CONFIG(process)
339
340QT_END_NAMESPACE
341
342#endif // QPROCESS_H
void insert(const QProcessEnvironmentPrivate &other)
Definition qprocess.cpp:107
QStringList keys() const
Definition qprocess.cpp:96
\inmodule QtCore
Definition qprocess.h:34
Combined button and popup list for selecting options.
#define __has_include(x)
bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs)
QT_REQUIRE_CONFIG(processenvironment)