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>
19#if defined(Q_OS_WIN) || defined(Q_QDOC)
20struct _PROCESS_INFORMATION;
21struct _SECURITY_ATTRIBUTES;
23using Q_PROCESS_INFORMATION = _PROCESS_INFORMATION;
24using Q_SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
25using Q_STARTUPINFO = _STARTUPINFOW;
36 enum Initialization { InheritFromParent };
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);
45 void swap(QProcessEnvironment &other)
noexcept { d.swap(other.d); }
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); }
54 [[nodiscard]]
bool inheritsFromParent()
const;
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;
62 QStringList toStringList()
const;
64 QStringList keys()
const;
66 void insert(
const QProcessEnvironment &e);
68 static QProcessEnvironment systemEnvironment();
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;
83class Q_CORE_EXPORT QProcess :
public QIODevice
104 enum ProcessChannel {
108 Q_ENUM(ProcessChannel)
110 enum ProcessChannelMode {
114 ForwardedOutputChannel,
115 ForwardedErrorChannel
117 Q_ENUM(ProcessChannelMode)
119 enum InputChannelMode {
121 ForwardedInputChannel
123 Q_ENUM(InputChannelMode)
131 explicit QProcess(QObject *parent =
nullptr);
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;
140 QString program()
const;
141 void setProgram(
const QString &program);
143 QStringList arguments()
const;
144 void setArguments(
const QStringList & arguments);
146 ProcessChannelMode processChannelMode()
const;
147 void setProcessChannelMode(ProcessChannelMode mode);
148 InputChannelMode inputChannelMode()
const;
149 void setInputChannelMode(InputChannelMode mode);
151 ProcessChannel readChannel()
const;
152 void setReadChannel(ProcessChannel channel);
154 void closeReadChannel(ProcessChannel channel);
155 void closeWriteChannel();
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);
162#if defined(Q_OS_WIN) || defined(Q_QDOC)
163 QString nativeArguments()
const;
164 void setNativeArguments(
const QString &arguments);
165 struct CreateProcessArguments
167 const wchar_t *applicationName;
169 Q_SECURITY_ATTRIBUTES *processAttributes;
170 Q_SECURITY_ATTRIBUTES *threadAttributes;
174 const wchar_t *currentDirectory;
175 Q_STARTUPINFO *startupInfo;
176 Q_PROCESS_INFORMATION *processInformation;
178 typedef std::function<
void(CreateProcessArguments *)> CreateProcessArgumentModifier;
179 CreateProcessArgumentModifier createProcessArgumentsModifier()
const;
180 void setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier);
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;
187 enum class UnixProcessFlag : quint32 {
188 ResetSignalHandlers = 0x0001,
189 IgnoreSigPipe = 0x0002,
191 CloseFileDescriptors = 0x0010,
193 CreateNewSession = 0x0040,
194 DisconnectControllingTerminal = 0x0080,
196 DisableCoreDumps = 0x0200,
198 Q_DECLARE_FLAGS(UnixProcessFlags, UnixProcessFlag)
199 struct UnixProcessParameters
201 UnixProcessFlags flags = {};
202 int lowestFileDescriptorToClose = 0;
204 quint32 _reserved[6] {};
206 UnixProcessParameters unixProcessParameters()
const noexcept;
207 void setUnixProcessParameters(
const UnixProcessParameters ¶ms);
208 void setUnixProcessParameters(UnixProcessFlags flagsOnly);
211 QString workingDirectory()
const;
212 void setWorkingDirectory(
const QString &dir);
214 void setEnvironment(
const QStringList &environment);
215 QStringList environment()
const;
216 void setProcessEnvironment(
const QProcessEnvironment &environment);
217 QProcessEnvironment processEnvironment()
const;
219 QProcess::ProcessError error()
const;
220 QProcess::ProcessState state()
const;
222 qint64 processId()
const;
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);
231#if QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
232 QT_CORE_INLINE_SINCE(6, 13)
233 bool waitForBytesWritten(
int msecs) override;
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;
244 QByteArray readAllStandardOutput();
245 QByteArray readAllStandardError();
247 int exitCode()
const;
248 QProcess::ExitStatus exitStatus()
const;
251 qint64 bytesToWrite()
const override;
252 bool isSequential()
const override;
253 void close() override;
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);
259 static QStringList systemEnvironment();
261 static QString nullDevice();
263 static QStringList splitCommand(QStringView command);
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);
275 void readyReadStandardOutput(QPrivateSignal);
276 void readyReadStandardError(QPrivateSignal);
279 void setProcessState(ProcessState state);
282 qint64 readData(
char *data, qint64 maxlen) override;
283 qint64 writeData(
const char *data, qint64 len) override;
286 Q_DECLARE_PRIVATE(QProcess)
287 Q_DISABLE_COPY(QProcess)
289#if QT_VERSION < QT_VERSION_CHECK(7
,0
,0
)
293 struct Use_setChildProcessModifier_Instead {};
294 QT_DEPRECATED_X(
"Use setChildProcessModifier() instead")
295 virtual Use_setChildProcessModifier_Instead setupChildProcess();
300Q_DECLARE_OPERATORS_FOR_FLAGS(QProcess::UnixProcessFlags)
303#if QT_CORE_INLINE_IMPL_SINCE(6
, 13
)
304bool QProcess::waitForStarted(
int msecs)
306 return waitForStarted(QDeadlineTimer(msecs));
309bool QProcess::waitForFinished(
int msecs)
311 return waitForFinished(QDeadlineTimer(msecs));
314#if QT_CORE_INLINE_IMPL_SINCE(6
, 13
) && QT_VERSION < QT_VERSION_CHECK(7
, 0
, 0
)
315bool QProcess::waitForBytesWritten(
int msecs)
317 return waitForBytesWritten(QDeadlineTimer(msecs));
320bool QProcess::waitForReadyRead(
int msecs)
322 return waitForReadyRead(QDeadlineTimer(msecs));
void insert(const QProcessEnvironmentPrivate &other)
Combined button and popup list for selecting options.
bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs)
QT_REQUIRE_CONFIG(processenvironment)