9#include <QtCore/qcompare.h>
10#include <QtCore/qiodevice.h>
11#include <QtCore/qstringlist.h>
12#include <QtCore/qshareddata.h>
18#if defined(Q_OS_WIN) || defined(Q_QDOC)
19struct _PROCESS_INFORMATION;
20struct _SECURITY_ATTRIBUTES;
22using Q_PROCESS_INFORMATION = _PROCESS_INFORMATION;
23using Q_SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
24using Q_STARTUPINFO = _STARTUPINFOW;
35 enum Initialization { InheritFromParent };
37 QProcessEnvironment();
38 QProcessEnvironment(Initialization)
noexcept;
39 QProcessEnvironment(
const QProcessEnvironment &other);
40 ~QProcessEnvironment();
41 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QProcessEnvironment)
42 QProcessEnvironment &operator=(
const QProcessEnvironment &other);
44 void swap(QProcessEnvironment &other)
noexcept { d.swap(other.d); }
46#if QT_CORE_REMOVED_SINCE(6
, 8
)
47 bool operator==(
const QProcessEnvironment &other)
const;
48 inline bool operator!=(
const QProcessEnvironment &other)
const
49 {
return !operator==(other); }
53 [[nodiscard]]
bool inheritsFromParent()
const;
56 bool contains(
const QString &name)
const;
57 void insert(
const QString &name,
const QString &value);
58 void remove(
const QString &name);
59 QString value(
const QString &name,
const QString &defaultValue = QString())
const;
61 QStringList toStringList()
const;
63 QStringList keys()
const;
65 void insert(
const QProcessEnvironment &e);
67 static QProcessEnvironment systemEnvironment();
70 friend Q_CORE_EXPORT
bool comparesEqual(
const QProcessEnvironment &lhs,
71 const QProcessEnvironment &rhs);
72 Q_DECLARE_EQUALITY_COMPARABLE_NON_NOEXCEPT(QProcessEnvironment)
73 friend class QProcessPrivate;
74 friend class QProcessEnvironmentPrivate;
75 QSharedDataPointer<QProcessEnvironmentPrivate> d;
82class Q_CORE_EXPORT QProcess :
public QIODevice
103 enum ProcessChannel {
107 Q_ENUM(ProcessChannel)
109 enum ProcessChannelMode {
113 ForwardedOutputChannel,
114 ForwardedErrorChannel
116 Q_ENUM(ProcessChannelMode)
118 enum InputChannelMode {
120 ForwardedInputChannel
122 Q_ENUM(InputChannelMode)
130 explicit QProcess(QObject *parent =
nullptr);
133 void start(
const QString &program,
const QStringList &arguments = {}, OpenMode mode = ReadWrite);
134 void start(OpenMode mode = ReadWrite);
135 void startCommand(
const QString &command, OpenMode mode = ReadWrite);
136 bool startDetached(qint64 *pid =
nullptr);
137 bool open(OpenMode mode = ReadWrite) override;
139 QString program()
const;
140 void setProgram(
const QString &program);
142 QStringList arguments()
const;
143 void setArguments(
const QStringList & arguments);
145 ProcessChannelMode processChannelMode()
const;
146 void setProcessChannelMode(ProcessChannelMode mode);
147 InputChannelMode inputChannelMode()
const;
148 void setInputChannelMode(InputChannelMode mode);
150 ProcessChannel readChannel()
const;
151 void setReadChannel(ProcessChannel channel);
153 void closeReadChannel(ProcessChannel channel);
154 void closeWriteChannel();
156 void setStandardInputFile(
const QString &fileName);
157 void setStandardOutputFile(
const QString &fileName, OpenMode mode = Truncate);
158 void setStandardErrorFile(
const QString &fileName, OpenMode mode = Truncate);
159 void setStandardOutputProcess(QProcess *destination);
161#if defined(Q_OS_WIN) || defined(Q_QDOC)
162 QString nativeArguments()
const;
163 void setNativeArguments(
const QString &arguments);
164 struct CreateProcessArguments
166 const wchar_t *applicationName;
168 Q_SECURITY_ATTRIBUTES *processAttributes;
169 Q_SECURITY_ATTRIBUTES *threadAttributes;
173 const wchar_t *currentDirectory;
174 Q_STARTUPINFO *startupInfo;
175 Q_PROCESS_INFORMATION *processInformation;
177 typedef std::function<
void(CreateProcessArguments *)> CreateProcessArgumentModifier;
178 CreateProcessArgumentModifier createProcessArgumentsModifier()
const;
179 void setCreateProcessArgumentsModifier(CreateProcessArgumentModifier modifier);
181#if defined(Q_OS_UNIX) || defined(Q_QDOC)
182 std::function<
void(
void)> childProcessModifier()
const;
183 void setChildProcessModifier(
const std::function<
void(
void)> &modifier);
184 Q_NORETURN
void failChildProcessModifier(
const char *description,
int error = 0)
noexcept;
186 enum class UnixProcessFlag : quint32 {
187 ResetSignalHandlers = 0x0001,
188 IgnoreSigPipe = 0x0002,
190 CloseFileDescriptors = 0x0010,
192 CreateNewSession = 0x0040,
193 DisconnectControllingTerminal = 0x0080,
195 DisableCoreDumps = 0x0200,
197 Q_DECLARE_FLAGS(UnixProcessFlags, UnixProcessFlag)
198 struct UnixProcessParameters
200 UnixProcessFlags flags = {};
201 int lowestFileDescriptorToClose = 0;
203 quint32 _reserved[6] {};
205 UnixProcessParameters unixProcessParameters()
const noexcept;
206 void setUnixProcessParameters(
const UnixProcessParameters ¶ms);
207 void setUnixProcessParameters(UnixProcessFlags flagsOnly);
210 QString workingDirectory()
const;
211 void setWorkingDirectory(
const QString &dir);
213 void setEnvironment(
const QStringList &environment);
214 QStringList environment()
const;
215 void setProcessEnvironment(
const QProcessEnvironment &environment);
216 QProcessEnvironment processEnvironment()
const;
218 QProcess::ProcessError error()
const;
219 QProcess::ProcessState state()
const;
221 qint64 processId()
const;
223 bool waitForStarted(
int msecs = 30000);
224 bool waitForReadyRead(
int msecs = 30000) override;
225 bool waitForBytesWritten(
int msecs = 30000) override;
226 bool waitForFinished(
int msecs = 30000);
228 QByteArray readAllStandardOutput();
229 QByteArray readAllStandardError();
231 int exitCode()
const;
232 QProcess::ExitStatus exitStatus()
const;
235 qint64 bytesToWrite()
const override;
236 bool isSequential()
const override;
237 void close() override;
239 static int execute(
const QString &program,
const QStringList &arguments = {});
240 static bool startDetached(
const QString &program,
const QStringList &arguments = {},
241 const QString &workingDirectory = QString(), qint64 *pid =
nullptr);
243 static QStringList systemEnvironment();
245 static QString nullDevice();
247 static QStringList splitCommand(QStringView command);
254 void started(QPrivateSignal);
255 void finished(
int exitCode, QProcess::ExitStatus exitStatus = NormalExit);
256 void errorOccurred(QProcess::ProcessError error);
257 void stateChanged(QProcess::ProcessState state, QPrivateSignal);
259 void readyReadStandardOutput(QPrivateSignal);
260 void readyReadStandardError(QPrivateSignal);
263 void setProcessState(ProcessState state);
266 qint64 readData(
char *data, qint64 maxlen) override;
267 qint64 writeData(
const char *data, qint64 len) override;
270 Q_DECLARE_PRIVATE(QProcess)
271 Q_DISABLE_COPY(QProcess)
273#if QT_VERSION < QT_VERSION_CHECK(7
,0
,0
)
277 struct Use_setChildProcessModifier_Instead {};
278 QT_DEPRECATED_X(
"Use setChildProcessModifier() instead")
279 virtual Use_setChildProcessModifier_Instead setupChildProcess();
284Q_DECLARE_OPERATORS_FOR_FLAGS(QProcess::UnixProcessFlags)
void insert(const QProcessEnvironmentPrivate &other)
bool comparesEqual(const QFileInfo &lhs, const QFileInfo &rhs)
QT_REQUIRE_CONFIG(processenvironment)