QProcess Class
Die Klasse QProcess wird verwendet, um externe Programme zu starten und mit ihnen zu kommunizieren. Mehr...
Kopfzeile: | #include <QProcess> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Vererbt: | QIODevice |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- Ausgeschiedene Mitglieder
- QProcess ist Teil von Input/Output und Networking.
Hinweis: Alle Funktionen in dieser Klasse sind reentrant.
Öffentliche Typen
struct | CreateProcessArguments |
(since 6.6) struct | UnixProcessParameters |
CreateProcessArgumentModifier | |
enum | ExitStatus { NormalExit, CrashExit } |
enum | InputChannelMode { ManagedInputChannel, ForwardedInputChannel } |
enum | ProcessChannel { StandardOutput, StandardError } |
enum | ProcessChannelMode { SeparateChannels, MergedChannels, ForwardedChannels, ForwardedErrorChannel, ForwardedOutputChannel } |
enum | ProcessError { FailedToStart, Crashed, Timedout, WriteError, ReadError, UnknownError } |
enum | ProcessState { NotRunning, Starting, Running } |
(since 6.6) enum class | UnixProcessFlag { CloseFileDescriptors, CreateNewSession, DisconnectControllingTerminal, IgnoreSigPipe, ResetIds, …, UseVFork } |
flags | UnixProcessFlags |
Öffentliche Funktionen
QProcess(QObject *parent = nullptr) | |
virtual | ~QProcess() |
QStringList | arguments() const |
(since 6.0) std::function<void ()> | childProcessModifier() const |
void | closeReadChannel(QProcess::ProcessChannel channel) |
void | closeWriteChannel() |
QProcess::CreateProcessArgumentModifier | createProcessArgumentsModifier() const |
QProcess::ProcessError | error() const |
int | exitCode() const |
QProcess::ExitStatus | exitStatus() const |
(since 6.7) void | failChildProcessModifier(const char *description, int error = 0) |
QProcess::InputChannelMode | inputChannelMode() const |
QString | nativeArguments() const |
QProcess::ProcessChannelMode | processChannelMode() const |
QProcessEnvironment | processEnvironment() const |
qint64 | processId() const |
QString | program() const |
QByteArray | readAllStandardError() |
QByteArray | readAllStandardOutput() |
QProcess::ProcessChannel | readChannel() const |
void | setArguments(const QStringList &arguments) |
(since 6.0) void | setChildProcessModifier(const std::function<void ()> &modifier) |
void | setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier) |
void | setInputChannelMode(QProcess::InputChannelMode mode) |
void | setNativeArguments(const QString &arguments) |
void | setProcessChannelMode(QProcess::ProcessChannelMode mode) |
void | setProcessEnvironment(const QProcessEnvironment &environment) |
void | setProgram(const QString &program) |
void | setReadChannel(QProcess::ProcessChannel channel) |
void | setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate) |
void | setStandardInputFile(const QString &fileName) |
void | setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate) |
void | setStandardOutputProcess(QProcess *destination) |
(since 6.6) void | setUnixProcessParameters(const QProcess::UnixProcessParameters ¶ms) |
(since 6.6) void | setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly) |
void | setWorkingDirectory(const QString &dir) |
void | start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite) |
void | start(QIODeviceBase::OpenMode mode = ReadWrite) |
(since 6.0) void | startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite) |
bool | startDetached(qint64 *pid = nullptr) |
QProcess::ProcessState | state() const |
(since 6.6) QProcess::UnixProcessParameters | unixProcessParameters() const |
bool | waitForFinished(int msecs = 30000) |
bool | waitForStarted(int msecs = 30000) |
QString | workingDirectory() const |
Reimplementierte öffentliche Funktionen
virtual qint64 | bytesToWrite() const override |
virtual void | close() override |
virtual bool | isSequential() const override |
virtual bool | open(QIODeviceBase::OpenMode mode = ReadWrite) override |
virtual bool | waitForBytesWritten(int msecs = 30000) override |
virtual bool | waitForReadyRead(int msecs = 30000) override |
Öffentliche Slots
Signale
void | errorOccurred(QProcess::ProcessError error) |
void | finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit) |
void | readyReadStandardError() |
void | readyReadStandardOutput() |
void | started() |
void | stateChanged(QProcess::ProcessState newState) |
Statische öffentliche Mitglieder
int | execute(const QString &program, const QStringList &arguments = {}) |
QString | nullDevice() |
QStringList | splitCommand(QStringView command) |
bool | startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr) |
QStringList | systemEnvironment() |
Geschützte Funktionen
void | setProcessState(QProcess::ProcessState state) |
Reimplementierte geschützte Funktionen
virtual qint64 | readData(char *data, qint64 maxlen) override |
Detaillierte Beschreibung
Ausführen eines Prozesses
Um einen Prozess zu starten, übergeben Sie den Namen und die Befehlszeilenargumente des Programms, das Sie ausführen möchten, als Argumente an start(). Die Argumente werden als einzelne Zeichenketten in einem QStringList übergeben.
Alternativ können Sie das Programm auch mit setProgram() und setArguments() starten und dann start() oder open() aufrufen.
Der folgende Codeschnipsel führt beispielsweise das Analoguhr-Beispiel im Fusion-Stil auf X11-Plattformen aus, indem er Zeichenketten mit "-style" und "fusion" als zwei Elemente in der Liste der Argumente übergibt:
QObject *parent; ... QString program = "./path/to/Qt/examples/widgets/analogclock"; QStringList arguments; arguments << "-style" << "fusion"; QProcess *myProcess = new QProcess(parent); myProcess->start(program, arguments);
QProcess wechselt dann in den Zustand Starting, und wenn das Programm gestartet ist, wechselt QProcess in den Zustand Running und gibt started() aus.
QProcess erlaubt es Ihnen, einen Prozess als sequentielles E/A-Gerät zu behandeln. Sie können in den Prozess schreiben und von ihm lesen, so wie Sie mit QTcpSocket auf eine Netzwerkverbindung zugreifen würden. Sie können dann in die Standardeingabe des Prozesses schreiben, indem Sie write() aufrufen, und die Standardausgabe lesen, indem Sie read(), readLine() und getChar() aufrufen. Da er QIODevice erbt, kann QProcess auch als Eingabequelle für QXmlReader verwendet werden, oder um Daten zu erzeugen, die mit QNetworkAccessManager hochgeladen werden.
Wenn der Prozess beendet wird, tritt QProcess wieder in den Zustand NotRunning (den Ausgangszustand) ein und sendet finished().
Das Signal finished() liefert den Exit-Code und den Exit-Status des Prozesses als Argumente, und Sie können auch exitCode() aufrufen, um den Exit-Code des letzten beendeten Prozesses zu erhalten, und exitStatus(), um dessen Exit-Status zu erhalten. Wenn zu irgendeinem Zeitpunkt ein Fehler auftritt, gibt QProcess das Signal errorOccurred() aus. Sie können auch error() aufrufen, um den Typ des zuletzt aufgetretenen Fehlers zu ermitteln, und state(), um den aktuellen Prozessstatus zu ermitteln.
Hinweis: QProcess wird auf VxWorks, iOS, tvOS oder watchOS nicht unterstützt.
Finden der ausführbaren Datei
Das auszuführende Programm kann entweder durch den Aufruf setProgram() oder direkt im Aufruf start() festgelegt werden. Der Aufruf von start() mit dem Programmnamen und den Argumenten ist gleichbedeutend mit dem Aufruf von setProgram() und setArguments() vor dieser Funktion und dem anschließenden Aufruf der Überladung ohne diese Parameter.
QProcess interpretiert den Programmnamen auf eine von drei verschiedenen Arten, ähnlich wie Unix-Shells und der Windows-Befehlsinterpreter in ihren eigenen Befehlszeilen arbeiten:
- Handelt es sich bei dem Programmnamen um einen absoluten Pfad, dann wird genau diese ausführbare Datei gestartet und QProcess führt keine Suche durch.
- Wenn der Programmname ein relativer Pfad mit mehr als einer Pfadkomponente ist (d.h. er enthält mindestens einen Schrägstrich), ist das Startverzeichnis, in dem dieser relative Pfad gesucht wird, betriebssystemabhängig: unter Windows ist es das aktuelle Arbeitsverzeichnis des Elternprozesses, während es unter Unix dasjenige ist, das mit setWorkingDirectory() festgelegt wurde.
- Wenn der Programmname ein einfacher Dateiname ohne Schrägstriche ist, ist das Verhalten betriebssystemabhängig. Auf Unix-Systemen durchsucht QProcess die Umgebungsvariable
PATH
; unter Windows wird die Suche vom Betriebssystem durchgeführt, und zwar zuerst im aktuellen Verzeichnis des Elternprozesses und dann in der UmgebungsvariablenPATH
(eine vollständige Liste finden Sie in der Dokumentation zu CreateProcess ).
Um plattformabhängiges Verhalten oder Probleme mit der Art und Weise, wie die aktuelle Anwendung gestartet wurde, zu vermeiden, ist es ratsam, immer einen absoluten Pfad zu der zu startenden ausführbaren Datei zu übergeben. Für Hilfsbinärdateien, die mit der Anwendung ausgeliefert werden, kann man einen solchen Pfad konstruieren, der mit QCoreApplication::applicationDirPath() beginnt. Um explizit eine ausführbare Datei zu starten, die relativ zu dem mit setWorkingDirectory() festgelegten Verzeichnis gefunden werden soll, verwenden Sie einen Programmpfad, der mit "./" bzw. "../" beginnt.
Unter Windows ist das Suffix ".exe" für die meisten Anwendungen nicht erforderlich, mit Ausnahme derer, die in der CreateProcess-Dokumentation beschrieben sind. Außerdem wandelt QProcess die Schrägstriche im Unix-Stil in Windows-Pfad-Backslashes für den Programmnamen um. Dadurch kann Code, der QProcess verwendet, plattformübergreifend geschrieben werden, wie in den obigen Beispielen gezeigt.
QProcess unterstützt nicht die direkte Ausführung von eingebauten Funktionen der Unix-Shell oder des Windows-Befehlsinterpreters, wie z. B. den Befehl cmd.exe
's dir
oder den export
der Bourne-Shell. Unter Unix werden zwar viele Shell-Build-Ins auch als separate ausführbare Dateien bereitgestellt, aber ihr Verhalten kann sich von den als Build-Ins implementierten Funktionen unterscheiden. Um diese Befehle auszuführen, sollten Sie den Interpreter explizit mit geeigneten Optionen ausführen. Bei Unix-Systemen starten Sie "/bin/sh" mit zwei Argumenten: "-c" und eine Zeichenkette mit der auszuführenden Befehlszeile. Unter Windows verwenden Sie aufgrund der nicht standardisierten Art und Weise, wie cmd.exe
die Befehlszeile parst, setNativeArguments() (zum Beispiel "/c dir d:").
Umgebungsvariablen
Die QProcess-API bietet Methoden, um die Umgebungsvariablen zu manipulieren, die der Kindprozess sehen wird. Standardmäßig hat der Kindprozess eine Kopie der Umgebungsvariablen des aktuellen Prozesses, die zum Zeitpunkt des Aufrufs der Funktion start() existieren. Das bedeutet, dass alle Änderungen, die mit qputenv() vor diesem Aufruf durchgeführt wurden, in der Umgebung des Kindprozesses wiedergegeben werden. Beachten Sie, dass QProcess keinen Versuch unternimmt, Race Conditions mit qputenv() in anderen Threads zu verhindern. Es wird daher empfohlen, qputenv() nach dem ersten Start der Anwendung zu vermeiden.
Die Umgebung für ein bestimmtes Child kann mit den Funktionen processEnvironment() und setProcessEnvironment() geändert werden, die die Klasse QProcessEnvironment verwenden. Standardmäßig gibt processEnvironment() ein Objekt zurück, für das QProcessEnvironment::inheritsFromParent() wahr ist. Das Setzen einer Umgebung, die nicht vom Elternteil geerbt hat, führt dazu, dass QProcess genau diese Umgebung für das Kind verwendet, wenn es gestartet wird.
Das normale Szenario beginnt mit der aktuellen Umgebung durch den Aufruf von QProcessEnvironment::systemEnvironment() und fährt dann mit dem Hinzufügen, Ändern oder Entfernen bestimmter Variablen fort. Der resultierende Variablenplan kann dann mit setProcessEnvironment() auf einen QProcess angewendet werden.
Es ist möglich, alle Variablen aus der Umgebung zu entfernen oder mit einer leeren Umgebung zu beginnen, indem man den Standardkonstruktor QProcessEnvironment() verwendet. Dies ist außerhalb kontrollierter und systemspezifischer Bedingungen nicht ratsam, da es Systemvariablen geben kann, die in der aktuellen Prozessumgebung gesetzt sind und für die korrekte Ausführung des Kindprozesses erforderlich sind.
Unter Windows kopiert QProcess die Umgebungsvariablen "PATH"
und "SystemRoot"
des aktuellen Prozesses, wenn sie nicht gesetzt wurden. Es ist nicht möglich, sie vollständig zu deaktivieren, aber es ist möglich, sie auf leere Werte zu setzen. Wird "PATH"
unter Windows auf einen leeren Wert gesetzt, wird der Kindprozess wahrscheinlich nicht starten.
Kommunikation über Kanäle
Prozesse haben zwei vordefinierte Ausgabekanäle: Der Standard-Ausgabekanal (stdout
) liefert die reguläre Konsolenausgabe, und der Standard-Fehlerkanal (stderr
) liefert in der Regel die Fehler, die der Prozess ausgibt. Diese Kanäle stellen zwei separate Datenströme dar. Sie können zwischen ihnen umschalten, indem Sie setReadChannel() aufrufen. QProcess gibt readyRead() aus, wenn Daten auf dem aktuellen Lesekanal verfügbar sind. Es gibt auch readyReadStandardOutput() aus, wenn neue Standardausgabedaten verfügbar sind, und wenn neue Standardfehlerdaten verfügbar sind, wird readyReadStandardError() ausgegeben. Anstatt read(), readLine() oder getChar() aufzurufen, können Sie explizit alle Daten von einem der beiden Kanäle lesen, indem Sie readAllStandardOutput() oder readAllStandardError() aufrufen.
Die Terminologie für die Kanäle kann irreführend sein. Beachten Sie, dass die Ausgabekanäle des Prozesses den Lesekanälen von QProcess entsprechen, während die Eingabekanäle des Prozesses den Schreibkanälen von QProcess entsprechen. Das liegt daran, dass das, was wir mit QProcess lesen, die Ausgabe des Prozesses ist, und das, was wir schreiben, die Eingabe des Prozesses.
QProcess kann die beiden Ausgabekanäle zusammenführen, so dass die Standardausgabe und die Standardfehlerdaten des laufenden Prozesses beide den Standardausgabekanal verwenden. Rufen Sie setProcessChannelMode() mit MergedChannels auf, bevor Sie den Prozess starten, um diese Funktion zu aktivieren. Sie haben auch die Möglichkeit, die Ausgabe des laufenden Prozesses an den aufrufenden Hauptprozess weiterzuleiten, indem Sie ForwardedChannels als Argument übergeben. Es ist auch möglich, nur einen der Ausgabekanäle weiterzuleiten - normalerweise würde man ForwardedErrorChannel verwenden, aber es gibt auch ForwardedOutputChannel. Beachten Sie, dass die Weiterleitung von Kanälen in der Regel eine schlechte Idee für GUI-Anwendungen ist - Sie sollten Fehler stattdessen grafisch darstellen.
Bestimmte Prozesse benötigen spezielle Umgebungseinstellungen, um zu funktionieren. Sie können Umgebungsvariablen für Ihren Prozess setzen, indem Sie setProcessEnvironment() aufrufen. Um ein Arbeitsverzeichnis zu setzen, rufen Sie setWorkingDirectory() auf. Standardmäßig werden die Prozesse im aktuellen Arbeitsverzeichnis des aufrufenden Prozesses ausgeführt.
Die Positionierung und die Z-Reihenfolge von Fenstern, die zu GUI-Anwendungen gehören, die mit QProcess gestartet werden, werden durch das zugrundeliegende Windowing-System gesteuert. Für Qt 5-Anwendungen kann die Positionierung mit der Kommandozeilenoption -qwindowgeometry
festgelegt werden; X11-Anwendungen akzeptieren in der Regel die Kommandozeilenoption -geometry
.
Synchrone Prozess-API
QProcess bietet eine Reihe von Funktionen, die es ermöglichen, den Prozess ohne eine Ereignisschleife zu verwenden, indem der aufrufende Thread angehalten wird, bis bestimmte Signale ausgegeben werden:
- waitForStarted() blockiert, bis der Prozess gestartet ist.
- waitForReadyRead() blockiert, bis neue Daten zum Lesen auf dem aktuellen Lesekanal verfügbar sind.
- waitForBytesWritten() blockiert, bis eine Nutzlast an Daten in den Prozess geschrieben wurde.
- waitForFinished() blockiert, bis der Prozess beendet ist.
Der Aufruf dieser Funktionen vom Haupt-Thread (dem Thread, der QApplication::exec() aufruft) kann dazu führen, dass Ihre Benutzeroberfläche einfriert.
Das folgende Beispiel führt gzip
aus, um die Zeichenkette "Qt rocks!" zu komprimieren, ohne eine Ereignisschleife:
QProcess gzip; gzip.start("gzip", QStringList() << "-c"); if (!gzip.waitForStarted()) return false; gzip.write("Qt rocks!"); gzip.closeWriteChannel(); if (!gzip.waitForFinished()) return false; QByteArray result = gzip.readAll();
Siehe auch QBuffer, QFile, und QTcpSocket.
Dokumentation der Mitgliedstypen
QProcess::CreateProcessArgumentModifier
Hinweis: Diese Typisierung ist nur auf dem Windows-Desktop verfügbar.
Unter Windows verwendet QProcess die Win32-API-Funktion CreateProcess
, um Kindprozesse zu starten. Während QProcess eine bequeme Möglichkeit bietet, Prozesse zu starten, ohne sich um Plattformdetails zu kümmern, ist es in manchen Fällen wünschenswert, die Parameter, die an CreateProcess
übergeben werden, fein abzustimmen. Dies geschieht, indem man eine CreateProcessArgumentModifier
Funktion definiert und sie an setCreateProcessArgumentsModifier
übergibt.
Eine CreateProcessArgumentModifier
Funktion nimmt einen Parameter entgegen: einen Zeiger auf eine CreateProcessArguments
Struktur. Die Mitglieder dieser Struktur werden an CreateProcess
übergeben, nachdem die Funktion CreateProcessArgumentModifier
aufgerufen wurde.
Das folgende Beispiel zeigt, wie man benutzerdefinierte Flags an CreateProcess
übergibt. Wenn ein Konsolenprozess B von einem Konsolenprozess A gestartet wird, verwendet QProcess standardmäßig das Konsolenfenster von Prozess A für Prozess B wieder. In diesem Beispiel wird stattdessen ein neues Konsolenfenster mit einem eigenen Farbschema für den Kindprozess B erstellt.
QProcess process; process.setCreateProcessArgumentsModifier([] (QProcess::CreateProcessArguments *args) { args->flags |= CREATE_NEW_CONSOLE; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; args->startupInfo->dwFlags |= STARTF_USEFILLATTRIBUTE; args->startupInfo->dwFillAttribute = BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY; }); process.start("C:\\Windows\\System32\\cmd.exe", QStringList() << "/k" << "title" << "The Child Process");
Siehe auch QProcess::CreateProcessArguments und setCreateProcessArgumentsModifier().
enum QProcess::ExitStatus
Diese Aufzählung beschreibt die verschiedenen Exit-Status von QProcess.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::NormalExit | 0 | Der Prozess wurde normal beendet. |
QProcess::CrashExit | 1 | Der Prozess ist abgestürzt. |
Siehe auch exitStatus().
enum QProcess::InputChannelMode
Dieses Enum beschreibt die Prozesseingangskanalmodi von QProcess. Übergeben Sie einen dieser Werte an setInputChannelMode(), um den aktuellen Schreibkanalmodus einzustellen.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::ManagedInputChannel | 0 | QProcess verwaltet die Eingabe des laufenden Prozesses. Dies ist der Standard-Eingabekanalmodus von QProcess. |
QProcess::ForwardedInputChannel | 1 | QProcess leitet die Eingaben des Hauptprozesses an den laufenden Prozess weiter. Der Kindprozess liest seine Standardeingabe von der gleichen Quelle wie der Hauptprozess. Beachten Sie, dass der Hauptprozess nicht versuchen darf, seine Standardeingabe zu lesen, während der Kindprozess läuft. |
Siehe auch setInputChannelMode().
enum QProcess::ProcessChannel
Diese Aufzählung beschreibt die vom laufenden Prozess verwendeten Prozesskanäle. Übergeben Sie einen dieser Werte an setReadChannel(), um den aktuellen Lesekanal von QProcess einzustellen.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::StandardOutput | 0 | Die Standardausgabe (stdout) des laufenden Prozesses. |
QProcess::StandardError | 1 | Der Standardfehler (stderr) des laufenden Prozesses. |
Siehe auch setReadChannel().
enum QProcess::ProcessChannelMode
Diese Aufzählung beschreibt die Prozessausgangskanalmodi von QProcess. Übergeben Sie einen dieser Werte an setProcessChannelMode(), um den aktuellen Lesekanalmodus einzustellen.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::SeparateChannels | 0 | QProcess verwaltet die Ausgabe des laufenden Prozesses, wobei Standardausgabe- und Standardfehlerdaten in getrennten internen Puffern gehalten werden. Sie können den aktuellen Lesekanal von QProcess auswählen, indem Sie setReadChannel() aufrufen. Dies ist der Standardkanalmodus von QProcess. |
QProcess::MergedChannels | 1 | QProcess führt die Ausgabe des laufenden Prozesses in den Standardausgabekanal (stdout ) zusammen. Der Standard-Fehlerkanal (stderr ) empfängt keine Daten. Die Standardausgabe und die Standardfehlerdaten des laufenden Prozesses werden verschachtelt. Bei abgekoppelten Prozessen wird die zusammengefasste Ausgabe des laufenden Prozesses an den Hauptprozess weitergeleitet. |
QProcess::ForwardedChannels | 2 | QProcess leitet die Ausgabe des laufenden Prozesses an den Hauptprozess weiter. Alles, was der Kindprozess in seine Standardausgabe und Standardfehler schreibt, wird in die Standardausgabe und Standardfehler des Hauptprozesses geschrieben. |
QProcess::ForwardedErrorChannel | 4 | QProcess verwaltet die Standardausgabe des laufenden Prozesses, leitet aber dessen Standardfehler an den Hauptprozess weiter. Dies spiegelt die typische Verwendung von Kommandozeilenwerkzeugen als Filter wider, bei denen die Standardausgabe an einen anderen Prozess oder eine Datei weitergeleitet wird, während der Standardfehler zu Diagnosezwecken auf die Konsole ausgegeben wird. (Dieser Wert wurde in Qt 5.2 eingeführt.) |
QProcess::ForwardedOutputChannel | 3 | Komplementär zu ForwardedErrorChannel. (Dieser Wert wurde in Qt 5.2 eingeführt.) |
Hinweis: Windows unterdrückt absichtlich die Ausgabe von reinen GUI-Anwendungen an geerbte Konsolen. Dies gilt nicht für Ausgaben, die in Dateien oder Pipes umgeleitet werden. Um die Ausgabe von reinen GUI-Anwendungen auf der Konsole trotzdem weiterzuleiten, müssen Sie SeparateChannels verwenden und die Weiterleitung selbst vornehmen, indem Sie die Ausgabe lesen und in die entsprechenden Ausgabekanäle schreiben.
Siehe auch setProcessChannelMode().
enum QProcess::ProcessError
Diese Aufzählung beschreibt die verschiedenen Arten von Fehlern, die von QProcess gemeldet werden.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::FailedToStart | 0 | Der Prozess konnte nicht gestartet werden. Entweder fehlt das aufgerufene Programm, oder Sie haben nicht genügend Berechtigungen oder Ressourcen, um das Programm aufzurufen. |
QProcess::Crashed | 1 | Der Prozess ist einige Zeit nach dem erfolgreichen Start abgestürzt. |
QProcess::Timedout | 2 | Die letzte waitFor...()-Funktion hat eine Zeitüberschreitung verursacht. Der Zustand von QProcess ist unverändert, und Sie können versuchen, waitFor...() erneut aufzurufen. |
QProcess::WriteError | 4 | Beim Versuch, in den Prozess zu schreiben, ist ein Fehler aufgetreten. Der Prozess läuft beispielsweise nicht, oder er hat seinen Eingabekanal geschlossen. |
QProcess::ReadError | 3 | Ein Fehler trat auf, als versucht wurde, von dem Prozess zu lesen. Zum Beispiel könnte der Prozess nicht laufen. |
QProcess::UnknownError | 5 | Ein unbekannter Fehler ist aufgetreten. Dies ist der Standardrückgabewert von error(). |
Siehe auch error().
enum QProcess::ProcessState
Diese Aufzählung beschreibt die verschiedenen Zustände von QProcess.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::NotRunning | 0 | Der Prozess läuft nicht. |
QProcess::Starting | 1 | Der Prozess wird gestartet, aber das Programm ist noch nicht aufgerufen worden. |
QProcess::Running | 2 | Der Prozess läuft und ist bereit zum Lesen und Schreiben. |
Siehe auch state().
[since 6.6]
enum class QProcess::UnixProcessFlag
flags QProcess::UnixProcessFlags
Diese Flags können im Feld flags
von UnixProcessParameters verwendet werden.
Konstante | Wert | Beschreibung |
---|---|---|
QProcess::UnixProcessFlag::CloseFileDescriptors | 0x0010 | Schließt alle Dateideskriptoren oberhalb des durch lowestFileDescriptorToClose definierten Schwellenwerts und verhindert, dass ein aktuell geöffneter Deskriptor im Elternprozess versehentlich an den Kindprozess weitergegeben wird. Die Dateideskriptoren stdin , stdout und stderr werden nie geschlossen. |
QProcess::UnixProcessFlag::CreateNewSession (since Qt 6.7) | 0x0040 | Startet eine neue Prozess-Sitzung, indem er setsid(2) aufruft. Dies ermöglicht es dem Kindprozess, die Sitzung, in der sich der aktuelle Prozess befindet, zu überleben. Dies ist einer der Schritte, die startDetached() unternimmt, um dem Prozess das Trennen zu ermöglichen, und ist auch einer der Schritte, um einen Prozess zu dämonisieren. |
QProcess::UnixProcessFlag::DisconnectControllingTerminal (since Qt 6.7) | 0x0080 | Verlangt, dass der Prozess die Verbindung zu seinem Kontrollterminal trennt, falls er eines hat. Wenn er keins hat, passiert nichts. Prozesse, die noch mit einem kontrollierenden Terminal verbunden sind, können ein Signal zum Aufhängen (SIGHUP ) erhalten, wenn das Terminal geschlossen wird, oder eines der anderen Terminal-Kontrollsignale (SIGTSTP , SIGTTIN , SIGTTOU ). Beachten Sie, dass auf einigen Betriebssystemen ein Prozess nur dann die Verbindung zum kontrollierenden Terminal trennen kann, wenn er der Sitzungsleiter ist, was bedeutet, dass das CreateNewSession Flag erforderlich sein kann. Dies ist einer der Schritte zur Daemonisierung eines Prozesses. |
QProcess::UnixProcessFlag::IgnoreSigPipe | 0x0002 | Setzt das Signal SIGPIPE immer auf ignoriert (SIG_IGN ), auch wenn das Flag ResetSignalHandlers gesetzt wurde. Wenn der untergeordnete Prozess versucht, auf seine Standardausgabe oder Standardfehler zu schreiben, nachdem der entsprechende Kanal mit QProcess::closeReadChannel() geschlossen wurde, würde er standardmäßig das Signal SIGPIPE erhalten und sofort beendet werden; mit diesem Flag schlägt der Schreibvorgang ohne Signal fehl und der untergeordnete Prozess kann weiter ausgeführt werden. |
QProcess::UnixProcessFlag::ResetIds (since Qt 6.7) | 0x0100 | Verwirft jede zurückbehaltene, effektive Benutzer- oder Gruppen-ID, die der aktuelle Prozess möglicherweise noch hat (siehe setuid(2) und setgid(2) , sowie QCoreApplication::setSetuidAllowed()). Dies ist nützlich, wenn der aktuelle Prozess setuid oder setgid war und nicht möchte, dass der Kindprozess die erhöhten Privilegien beibehält. |
QProcess::UnixProcessFlag::ResetSignalHandlers | 0x0001 | Setzt alle Unix-Signalhandler auf ihren Standardzustand zurück (d.h. übergibt SIG_DFL an signal(2) ). Dieses Flag ist nützlich, um sicherzustellen, dass ein ignoriertes (SIG_IGN ) Signal das Verhalten des Kindprozesses nicht beeinflusst. |
QProcess::UnixProcessFlag::UseVFork | 0x0020 | Fordert QProcess auf, vfork(2) zu verwenden, um den Kindprozess zu starten. Verwenden Sie dieses Flag, um anzuzeigen, dass die mit setChildProcessModifier() gesetzte Callback-Funktion sicher in der Child-Seite eines vfork(2) ausgeführt werden kann, d.h. der Callback verändert keine nicht-lokalen Variablen (direkt oder durch eine von ihm aufgerufene Funktion) und versucht nicht, mit dem Elternprozess zu kommunizieren. Es ist implementierungsabhängig, ob QProcess tatsächlich vfork(2) verwendet und ob vfork(2) sich vom Standard fork(2) unterscheidet. |
Diese Aufzählung wurde in Qt 6.6 eingeführt.
Der Typ UnixProcessFlags ist ein Typedef für QFlags<UnixProcessFlag>. Er speichert eine OR-Kombination von UnixProcessFlag-Werten.
Siehe auch setUnixProcessParameters() und unixProcessParameters().
Dokumentation der Mitgliedsfunktionen
[explicit]
QProcess::QProcess(QObject *parent = nullptr)
Konstruiert ein QProcess-Objekt mit der angegebenen parent.
[virtual noexcept]
QProcess::~QProcess()
Zerstört das Objekt QProcess, d.h. beendet den Prozess.
Beachten Sie, dass diese Funktion nicht zurückkehrt, bevor der Prozess beendet ist.
QStringList QProcess::arguments() const
Gibt die Befehlszeilenargumente zurück, mit denen der Prozess zuletzt gestartet wurde.
Siehe auch setArguments() und start().
[override virtual]
qint64 QProcess::bytesToWrite() const
Reimplements: QIODevice::bytesToWrite() const.
[since 6.0]
std::function<void ()> QProcess::childProcessModifier() const
Gibt die Modifikatorfunktion zurück, die zuvor durch den Aufruf von setChildProcessModifier() festgelegt wurde.
Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch setChildProcessModifier() und unixProcessParameters().
[override virtual]
void QProcess::close()
Reimplements: QIODevice::close().
Schließt die gesamte Kommunikation mit dem Prozess und beendet ihn. Nach dem Aufruf dieser Funktion wird QProcess nicht mehr readyRead() ausgeben, und es können keine Daten mehr gelesen oder geschrieben werden.
void QProcess::closeReadChannel(QProcess::ProcessChannel channel)
Schließt den Lesekanal channel. Nach dem Aufruf dieser Funktion empfängt QProcess keine Daten mehr auf diesem Kanal. Alle bereits empfangenen Daten stehen weiterhin zum Lesen zur Verfügung.
Rufen Sie diese Funktion auf, um Speicher zu sparen, wenn Sie nicht an der Ausgabe des Prozesses interessiert sind.
Siehe auch closeWriteChannel() und setReadChannel().
void QProcess::closeWriteChannel()
Legt fest, dass der Schreibkanal von QProcess geschlossen werden soll. Der Kanal wird geschlossen, sobald alle Daten in den Prozess geschrieben worden sind. Nach dem Aufruf dieser Funktion schlagen alle Versuche, in den Prozess zu schreiben, fehl.
Das Schließen des Schreibkanals ist für Programme notwendig, die Eingabedaten lesen, bis der Kanal geschlossen wurde. Zum Beispiel wird das Programm "more" verwendet, um Textdaten in einer Konsole sowohl unter Unix als auch unter Windows anzuzeigen. Es zeigt die Textdaten jedoch erst an, wenn der Schreibkanal von QProcess geschlossen wurde. Beispiel:
QProcess more; more.start("more"); more.write("Text to display"); more.closeWriteChannel(); // QProcess will emit readyRead() once "more" starts printing
Der Schreibkanal wird implizit geöffnet, wenn start() aufgerufen wird.
Siehe auch closeReadChannel().
QProcess::CreateProcessArgumentModifier QProcess::createProcessArgumentsModifier() const
Gibt eine zuvor eingestellte CreateProcess
Modifikatorfunktion zurück.
Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar.
Siehe auch setCreateProcessArgumentsModifier() und QProcess::CreateProcessArgumentModifier.
QProcess::ProcessError QProcess::error() const
Gibt den Typ des zuletzt aufgetretenen Fehlers zurück.
Siehe auch state().
[signal]
void QProcess::errorOccurred(QProcess::ProcessError error)
Dieses Signal wird ausgegeben, wenn ein Fehler im Prozess auftritt. Die angegebene error beschreibt die Art des aufgetretenen Fehlers.
[static]
int QProcess::execute(const QString &program, const QStringList &arguments = {})
Startet das Programm program mit den Argumenten arguments in einem neuen Prozess, wartet auf dessen Beendigung und gibt dann den Exit-Code des Prozesses zurück. Alle Daten, die der neue Prozess auf die Konsole schreibt, werden an den aufrufenden Prozess weitergeleitet.
Die Umgebung und das Arbeitsverzeichnis werden vom aufrufenden Prozess geerbt.
Die Behandlung der Argumente ist identisch mit der entsprechenden start()-Überladung.
Wenn der Prozess nicht gestartet werden kann, wird -2 zurückgegeben. Wenn der Prozess abstürzt, wird -1 zurückgegeben. Andernfalls wird der Exit-Code des Prozesses zurückgegeben.
Siehe auch start().
int QProcess::exitCode() const
Gibt den Exit-Code des letzten beendeten Prozesses zurück.
Dieser Wert ist nur gültig, wenn exitStatus() NormalExit zurückgibt.
QProcess::ExitStatus QProcess::exitStatus() const
Gibt den Exit-Status des letzten beendeten Prozesses zurück.
Wenn der Prozess unter Windows mit TerminateProcess() aus einer anderen Anwendung beendet wurde, gibt diese Funktion dennoch NormalExit zurück, es sei denn, der Exit-Code ist kleiner als 0.
[noexcept, since 6.7]
void QProcess::failChildProcessModifier(const char *description, int error = 0)
Diese Funktionen können innerhalb des Modifizierungssatzes mit setChildProcessModifier() verwendet werden, um anzuzeigen, dass eine Fehlerbedingung aufgetreten ist. Wenn der Modifikator diese Funktionen aufruft, sendet QProcess errorOccurred () mit dem Code QProcess::FailedToStart an den übergeordneten Prozess. description kann verwendet werden, um einige Informationen in errorString() aufzunehmen, die bei der Diagnose des Problems helfen, normalerweise den Namen des fehlgeschlagenen Aufrufs, ähnlich wie bei der C Library-Funktion perror()
. Zusätzlich kann der Parameter error ein <errno.h>
Fehlercode sein, dessen Textform ebenfalls aufgenommen wird.
Zum Beispiel könnte ein Child-Modifikator auf diese Weise einen zusätzlichen Dateideskriptor für den Child-Prozess vorbereiten:
process.setChildProcessModifier([fd, &process]() { if (dup2(fd, TargetFileDescriptor) < 0) process.failChildProcessModifier(errno, "aux comm channel"); }); process.start();
Wobei fd
ein aktuell im Elternprozess geöffneter Dateideskriptor ist. Wenn der Systemaufruf dup2()
zu einer EBADF
Bedingung führte, könnte der Prozess errorString() lauten: "Child process modifier reported error: aux comm channel: Schlechter Dateideskriptor".
Diese Funktion kehrt nicht zum Aufrufer zurück. Die Verwendung dieser Funktion an einem anderen Ort als im Child-Modifier und mit dem korrekten QProcess Objekt ist undefiniertes Verhalten.
Hinweis: Die Implementierung begrenzt die Länge des Parameters description auf etwa 500 Zeichen. Dies beinhaltet nicht den Text aus dem error Code.
Diese Funktion wurde in Qt 6.7 eingeführt.
Siehe auch setChildProcessModifier() und setUnixProcessParameters().
[signal]
void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit)
Dieses Signal wird ausgegeben, wenn der Prozess beendet wird. exitCode ist der Exit-Code des Prozesses (nur gültig für normale Exits), und exitStatus ist der Exit-Status. Nachdem der Prozess beendet wurde, sind die Puffer in QProcess noch intakt. Sie können immer noch alle Daten lesen, die der Prozess geschrieben hat, bevor er beendet wurde.
Siehe auch exitStatus().
QProcess::InputChannelMode QProcess::inputChannelMode() const
Gibt den Kanalmodus des Standard-Eingabekanals QProcess zurück.
Siehe auch setInputChannelMode() und InputChannelMode.
[override virtual]
bool QProcess::isSequential() const
Reimplements: QIODevice::isSequential() const.
[slot]
void QProcess::kill()
Beendet den aktuellen Prozess, wodurch er sofort beendet wird.
Unter Windows verwendet kill() TerminateProcess, unter Unix und macOS wird das Signal SIGKILL an den Prozess gesendet.
Siehe auch terminate().
QString QProcess::nativeArguments() const
Gibt die zusätzlichen nativen Befehlszeilenargumente für das Programm zurück.
Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar.
Siehe auch setNativeArguments().
[static]
QString QProcess::nullDevice()
Das Null-Gerät des Betriebssystems.
Der zurückgegebene Dateipfad verwendet native Verzeichnistrennzeichen.
Siehe auch QProcess::setStandardInputFile(), QProcess::setStandardOutputFile(), und QProcess::setStandardErrorFile().
[override virtual]
bool QProcess::open(QIODeviceBase::OpenMode mode = ReadWrite)
Reimplements: QIODevice::open(QIODeviceBase::OpenMode-Modus).
Startet das mit setProgram() eingestellte Programm mit den mit setArguments() eingestellten Argumenten. Der OpenMode wird auf mode gesetzt.
Diese Methode ist ein Alias für start() und existiert nur, um die durch QIODevice definierte Schnittstelle vollständig zu implementieren.
Gibt true
zurück, wenn das Programm gestartet wurde.
Siehe auch start(), setProgram(), und setArguments().
QProcess::ProcessChannelMode QProcess::processChannelMode() const
Gibt den Kanalmodus der Standardausgabe- und Standardfehlerkanäle von QProcess zurück.
Siehe auch setProcessChannelMode(), ProcessChannelMode, und setReadChannel().
QProcessEnvironment QProcess::processEnvironment() const
Gibt die Umgebung zurück, die QProcess an seinen Kindprozess weitergeben wird. Wenn keine Umgebung mit setProcessEnvironment() gesetzt wurde, gibt diese Methode ein Objekt zurück, das anzeigt, dass die Umgebung vom Elternprozess geerbt wird.
Siehe auch setProcessEnvironment(), QProcessEnvironment::inheritsFromParent(), und Environment variables.
qint64 QProcess::processId() const
Gibt die systemeigene Prozesskennung für den laufenden Prozess zurück, sofern verfügbar. Wenn derzeit kein Prozess läuft, wird 0
zurückgegeben.
QString QProcess::program() const
Gibt das Programm zurück, mit dem der Prozess zuletzt gestartet wurde.
Siehe auch setProgram() und start().
QByteArray QProcess::readAllStandardError()
Unabhängig vom aktuellen Lesekanal gibt diese Funktion alle verfügbaren Daten aus dem Standardfehler des Prozesses als QByteArray zurück.
Siehe auch readyReadStandardError(), readAllStandardOutput(), readChannel(), und setReadChannel().
QByteArray QProcess::readAllStandardOutput()
Unabhängig vom aktuellen Lesekanal gibt diese Funktion alle verfügbaren Daten von der Standardausgabe des Prozesses als QByteArray zurück.
Siehe auch readyReadStandardOutput(), readAllStandardError(), readChannel(), und setReadChannel().
QProcess::ProcessChannel QProcess::readChannel() const
Gibt den aktuellen Lesekanal des QProcess zurück.
Siehe auch setReadChannel().
[override virtual protected]
qint64 QProcess::readData(char *data, qint64 maxlen)
Reimplements: QIODevice::readData(char *data, qint64 maxSize).
[private signal]
void QProcess::readyReadStandardError()
Dieses Signal wird ausgegeben, wenn der Prozess neue Daten über seinen Standard-Fehlerkanal (stderr
) zur Verfügung gestellt hat. Es wird unabhängig von der aktuellen read channel ausgegeben.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, kann aber nicht vom Benutzer ausgegeben werden.
Siehe auch readAllStandardError() und readChannel().
[private signal]
void QProcess::readyReadStandardOutput()
Dieses Signal wird ausgegeben, wenn der Prozess neue Daten über seinen Standardausgabekanal (stdout
) zur Verfügung gestellt hat. Es wird unabhängig von der aktuellen read channel ausgegeben.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
Siehe auch readAllStandardOutput() und readChannel().
void QProcess::setArguments(const QStringList &arguments)
Legt die arguments fest, die beim Starten des Prozesses an das aufgerufene Programm übergeben wird. Diese Funktion muss vor start() aufgerufen werden.
Siehe auch start(), setProgram(), und arguments().
[since 6.0]
void QProcess::setChildProcessModifier(const std::function<void ()> &modifier)
Setzt die Funktion modifier für den Kindprozess, für Unix-Systeme (einschließlich macOS; für Windows, siehe setCreateProcessArgumentsModifier()). Die im Argument modifier enthaltene Funktion wird im Kindprozess aufgerufen, nachdem fork()
oder vfork()
abgeschlossen ist und QProcess die Standard-Dateideskriptoren für den Kindprozess eingerichtet hat, jedoch vor execve()
, innerhalb von start().
Das folgende Beispiel zeigt, wie ein Kindprozess so eingerichtet wird, dass er ohne Privilegien läuft:
void runSandboxed(const QString &name, const QStringList &arguments) { QProcess proc; proc.setChildProcessModifier([] { // Drop all privileges in the child process, and enter // a chroot jail. ::setgroups(0, nullptr); ::chroot("/run/safedir"); ::chdir("/"); ::setgid(safeGid); ::setuid(safeUid); ::umask(077); }); proc.start(name, arguments); proc.waitForFinished(); }
Wenn die Modifizierungsfunktion eine Fehlerbedingung erfährt, kann sie failChildProcessModifier() verwenden, um die Situation an den QProcess Aufrufer zu melden. Alternativ kann sie auch andere Methoden zum Anhalten des Prozesses verwenden, wie _exit()
oder abort()
.
Bestimmte Eigenschaften des Kindprozesses, wie z. B. das Schließen aller fremden Dateideskriptoren oder das Trennen der Verbindung zum steuernden TTY, lassen sich leichter durch die Verwendung von setUnixProcessParameters() erreichen, das einen Fehler erkennen und einen FailedToStart Zustand melden kann. Der Modifikator ist nützlich, um bestimmte ungewöhnliche Eigenschaften des Kindprozesses zu ändern, wie z.B. zusätzliche Dateideskriptoren einzurichten. Wenn sowohl ein Kindprozess-Modifikator als auch Unix-Prozessparameter gesetzt sind, wird der Modifikator ausgeführt, bevor diese Parameter angewendet werden.
Hinweis: In Multithread-Anwendungen muss diese Funktion darauf achten, dass sie keine Funktionen aufruft, die Mutexe sperren, die möglicherweise in anderen Threads verwendet wurden (im Allgemeinen wird empfohlen, nur Funktionen zu verwenden, die von POSIX als "async-signal-safe" definiert sind). Der größte Teil der Qt API ist innerhalb dieses Callbacks unsicher, einschließlich qDebug(), und kann zu Deadlocks führen.
Hinweis: Wenn das UnixProcessParameters::UseVFork-Flag über setUnixProcessParameters() gesetzt ist, kann QProcess die Semantik von vfork()
verwenden, um den Kindprozess zu starten, so dass diese Funktion noch strengere Einschränkungen befolgen muss. Erstens darf sie, da sie sich den Speicher immer noch mit dem Elternprozess teilt, nicht in nicht-lokale Variablen schreiben und muss beim Lesen aus diesen Variablen die richtige Ordnungssemantik einhalten, um Datenrennen zu vermeiden. Zweitens können sich noch mehr Bibliotheksfunktionen daneben benehmen; daher sollte diese Funktion nur Low-Level-Systemaufrufe verwenden, wie read()
, write()
, setsid()
, nice()
, und ähnliche.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch childProcessModifier(), failChildProcessModifier(), und setUnixProcessParameters().
void QProcess::setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)
Setzt die modifier für den Win32-API-Aufruf CreateProcess
. Übergeben Sie QProcess::CreateProcessArgumentModifier()
, um einen zuvor gesetzten Wert zu entfernen.
Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar und erfordert C++11.
Siehe auch createProcessArgumentsModifier(), QProcess::CreateProcessArgumentModifier, und setChildProcessModifier().
void QProcess::setInputChannelMode(QProcess::InputChannelMode mode)
Setzt den Kanalmodus des Standard-Eingabekanals QProcess auf den angegebenen mode. Dieser Modus wird verwendet, wenn start() das nächste Mal aufgerufen wird.
Siehe auch inputChannelMode() und InputChannelMode.
void QProcess::setNativeArguments(const QString &arguments)
Dies ist eine überladene Funktion.
Setzt zusätzliche native Befehlszeilen arguments für das Programm.
Auf Betriebssystemen, bei denen die System-API für die Übergabe von Befehlszeilen arguments an einen Unterprozess nativ eine einzelne Zeichenkette verwendet, kann man sich Befehlszeilen vorstellen, die nicht über QProcess's portable listenbasierte API übergeben werden können. In solchen Fällen muss diese Funktion verwendet werden, um eine Zeichenkette zu setzen, die an die aus der üblichen Argumentliste zusammengesetzte Zeichenkette angehängt wird, wobei ein Leerzeichen als Begrenzung dient.
Hinweis: Diese Funktion ist nur auf der Windows-Plattform verfügbar.
Siehe auch nativeArguments().
void QProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
Setzt den Kanalmodus der Standardausgabe- und Standardfehlerkanäle von QProcess auf den angegebenen mode. Dieser Modus wird verwendet, wenn start() das nächste Mal aufgerufen wird. Zum Beispiel:
QProcess builder; builder.setProcessChannelMode(QProcess::MergedChannels); builder.start("make", QStringList()<< "-j2");if (!builder.waitForFinished()) qDebug() << "Make failed:" << builder.errorString(); sonst qDebug() << "Make output:" << builder.readAll();
Siehe auch processChannelMode(), ProcessChannelMode, und setReadChannel().
void QProcess::setProcessEnvironment(const QProcessEnvironment &environment)
Legt die environment fest, die QProcess an den Kindprozess weitergibt.
Der folgende Code fügt zum Beispiel die Umgebungsvariable TMPDIR
hinzu:
QProcess process; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable process.setProcessEnvironment(env); process.start("myapp");
Beachten Sie, dass unter Windows die Groß- und Kleinschreibung bei der Benennung von Umgebungsvariablen nicht beachtet wird.
Siehe auch processEnvironment(), QProcessEnvironment::systemEnvironment(), und Environment variables.
[protected]
void QProcess::setProcessState(QProcess::ProcessState state)
Setzt den aktuellen Zustand von QProcess auf den angegebenen state.
Siehe auch state().
void QProcess::setProgram(const QString &program)
Legt die program fest, die beim Starten des Prozesses verwendet werden soll. Diese Funktion muss vor start() aufgerufen werden.
Wenn program ein absoluter Pfad ist, gibt er die genaue ausführbare Datei an, die gestartet wird. Relative Pfade werden auf plattformspezifische Weise aufgelöst, einschließlich der Suche in der Umgebungsvariablen PATH
(siehe Finding the Executable für Details).
Siehe auch start(), setArguments(), program(), und QStandardPaths::findExecutable().
void QProcess::setReadChannel(QProcess::ProcessChannel channel)
Setzt den aktuellen Lesekanal von QProcess auf den angegebenen channel. Der aktuelle Eingangskanal wird von den Funktionen read(), readAll(), readLine() und getChar() verwendet. Er bestimmt auch, welcher Kanal QProcess zur Ausgabe von readyRead() veranlasst.
Siehe auch readChannel().
void QProcess::setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
Leitet den Standardfehler des Prozesses an die Datei fileName um. Wenn die Umleitung eingerichtet ist, wird der Standardfehler-Lesekanal geschlossen: Das Lesen aus der Datei mit read() wird immer fehlschlagen, ebenso wie readAllStandardError(). Die Datei wird angehängt, wenn mode Append ist, andernfalls wird sie abgeschnitten.
Siehe setStandardOutputFile() für weitere Informationen zum Öffnen der Datei.
Hinweis: Wenn setProcessChannelMode() mit dem Argument QProcess::MergedChannels aufgerufen wurde, hat diese Funktion keine Wirkung.
Siehe auch setStandardInputFile(), setStandardOutputFile(), und setStandardOutputProcess().
void QProcess::setStandardInputFile(const QString &fileName)
Leitet die Standardeingabe des Prozesses zu der durch fileName angegebenen Datei um. Wenn eine Eingabeumleitung vorhanden ist, befindet sich das Objekt QProcess im Nur-Lese-Modus (der Aufruf von write() führt zu einem Fehler).
Um den Prozess zu veranlassen, EOF sofort zu lesen, übergeben Sie hier nullDevice(). Dies ist sauberer als die Verwendung von closeWriteChannel() vor dem Schreiben von Daten, da es vor dem Start des Prozesses eingerichtet werden kann.
Wenn die Datei fileName zum Zeitpunkt des Aufrufs von start() nicht existiert oder nicht lesbar ist, schlägt das Starten des Prozesses fehl.
Der Aufruf von setStandardInputFile() nach dem Start des Prozesses hat keine Auswirkungen.
Siehe auch setStandardOutputFile(), setStandardErrorFile(), und setStandardOutputProcess().
void QProcess::setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
Leitet die Standardausgabe des Prozesses in die Datei fileName um. Wenn die Umleitung eingerichtet ist, ist der Lesekanal für die Standardausgabe geschlossen: das Lesen mit read() wird immer fehlschlagen, ebenso wie readAllStandardOutput().
Um alle Standardausgaben des Prozesses zu verwerfen, übergeben Sie hier nullDevice(). Dies ist effizienter, als die Standardausgabe einfach nie zu lesen, da keine QProcess Puffer gefüllt werden.
Wenn die Datei fileName zum Zeitpunkt des Aufrufs von start() noch nicht existiert, wird sie erstellt. Wenn sie nicht erstellt werden kann, schlägt der Start fehl.
Wenn die Datei existiert und mode gleich QIODeviceBase::Truncate ist, wird die Datei abgeschnitten. Andernfalls (wenn mode gleich QIODeviceBase::Append ist), wird die Datei angehängt.
Der Aufruf von setStandardOutputFile() nach dem Start des Prozesses hat keine Auswirkungen.
Wenn fileName eine leere Zeichenkette ist, wird die Umleitung der Standardausgabe beendet. Dies ist nützlich, um die Standardausgabe nach einer Umleitung wiederherzustellen.
Siehe auch setStandardInputFile(), setStandardErrorFile(), und setStandardOutputProcess().
void QProcess::setStandardOutputProcess(QProcess *destination)
Leitet den Standardausgabestrom dieses Prozesses an die Standardeingabe des Prozesses destination weiter.
Der folgende Shell-Befehl:
command1 | command2
Kann mit QProcess mit folgendem Code ausgeführt werden:
QProcess process1; QProcess process2; process1.setStandardOutputProcess(&process2); process1.start("command1"); process2.start("command2");
[since 6.6]
void QProcess::setUnixProcessParameters(const QProcess::UnixProcessParameters ¶ms)
Setzt die zusätzlichen Einstellungen und Parameter für den Kindprozess auf Unix-Systemen auf params. Diese Funktion kann verwendet werden, um QProcess aufzufordern, den Kindprozess zu ändern, bevor das ausführbare Zielprogramm gestartet wird.
Diese Funktion kann verwendet werden, um bestimmte Eigenschaften des Kindprozesses zu ändern, wie z.B. das Schließen aller fremden Dateideskriptoren, das Ändern des Nice-Levels des Kindprozesses oder das Trennen der Verbindung mit dem steuernden TTY. Für eine feinere Kontrolle des Kindprozesses oder um ihn auf andere Weise zu verändern, verwenden Sie die Funktion setChildProcessModifier(). Wenn sowohl ein Kindprozessmodifikator als auch Unix-Prozessparameter gesetzt sind, wird der Modifikator ausgeführt, bevor diese Parameter angewendet werden.
Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch unixProcessParameters() und setChildProcessModifier().
[since 6.6]
void QProcess::setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly)
Dies ist eine überladene Funktion.
Setzt die zusätzlichen Einstellungen für den Kindprozess auf Unix-Systemen auf flagsOnly. Dies ist dasselbe wie die Überladung, bei der nur das Feld flags
gesetzt ist.
Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch unixProcessParameters() und setChildProcessModifier().
void QProcess::setWorkingDirectory(const QString &dir)
Setzt das Arbeitsverzeichnis auf dir. QProcess startet den Prozess in diesem Verzeichnis. Das Standardverhalten ist, den Prozess im Arbeitsverzeichnis des aufrufenden Prozesses zu starten.
Siehe auch workingDirectory() und start().
[static]
QStringList QProcess::splitCommand(QStringView command)
Zerlegt die Zeichenkette command in eine Liste von Token und gibt die Liste zurück.
Zeichen mit Leerzeichen können von doppelten Anführungszeichen umgeben sein; drei aufeinanderfolgende doppelte Anführungszeichen stellen das Anführungszeichen selbst dar.
void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
Startet die angegebene program in einem neuen Prozess und übergibt die Befehlszeilenargumente in arguments. Siehe setProgram() für Informationen darüber, wie QProcess nach der auszuführenden Datei sucht. Der OpenMode wird auf mode gesetzt. Es wird keine weitere Aufteilung der Argumente vorgenommen.
Das Objekt QProcess geht sofort in den Zustand Starting über. Wenn der Prozess erfolgreich startet, gibt QProcess started () aus; andernfalls wird errorOccurred() ausgegeben. Beachten Sie, dass auf Plattformen, die in der Lage sind, Kindprozesse synchron zu starten (insbesondere Windows), diese Signale ausgegeben werden, bevor diese Funktion zurückkehrt, und dieses QProcess Objekt entweder in den Zustand QProcess::Running oder QProcess::NotRunning übergeht. Auf anderen Plattformen werden die Signale started() und errorOccurred() verzögert ausgegeben.
Rufen Sie waitForStarted() auf, um sicherzustellen, dass der Prozess gestartet wurde (oder nicht gestartet werden konnte) und diese Signale ausgegeben wurden. Es ist sicher, diese Funktion auch dann aufzurufen, wenn der Startzustand des Prozesses bereits bekannt ist, obwohl das Signal nicht erneut ausgegeben wird.
Fenster: Die Argumente werden in Anführungszeichen gesetzt und zu einer Befehlszeile verbunden, die mit der Windows-Funktion CommandLineToArgvW()
kompatibel ist. Für Programme, die andere Anforderungen an die Anführungszeichen in der Befehlszeile haben, müssen Sie setNativeArguments() verwenden. Ein bemerkenswertes Programm, das sich nicht an die Regeln von CommandLineToArgvW()
hält, ist cmd.exe und folglich auch alle Batch-Skripte.
Wenn das Objekt QProcess bereits einen Prozess ausführt, wird möglicherweise eine Warnung auf der Konsole ausgegeben, und der bestehende Prozess läuft unbeeinflusst weiter.
Hinweis: Ein erfolgreicher Start des Kindprozesses bedeutet nur, dass das Betriebssystem den Prozess erfolgreich erstellt und die Ressourcen zugewiesen hat, die jeder Prozess hat, wie z. B. seine Prozess-ID. Der Kindprozess kann abstürzen oder anderweitig sehr früh scheitern und somit nicht die erwartete Ausgabe produzieren. Auf den meisten Betriebssystemen kann dies dynamische Verknüpfungsfehler einschließen.
Siehe auch processId(), started(), waitForStarted(), und setNativeArguments().
void QProcess::start(QIODeviceBase::OpenMode mode = ReadWrite)
Dies ist eine überladene Funktion.
Startet das mit setProgram() eingestellte Programm mit den mit setArguments() eingestellten Argumenten. Der OpenMode wird auf mode gesetzt.
Siehe auch open(), setProgram(), und setArguments().
[since 6.0]
void QProcess::startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)
Startet den Befehl command in einem neuen Prozess. Der OpenMode ist auf mode eingestellt.
command ist eine einzelne Textzeichenfolge, die sowohl den Programmnamen als auch die Argumente enthält. Die Argumente werden durch ein oder mehrere Leerzeichen getrennt. Ein Beispiel:
QProcess process; process.startCommand("del /s *.txt"); // same as process.start("del", QStringList() << "/s" << "*.txt"); ...
Argumente, die Leerzeichen enthalten, müssen in Anführungszeichen gesetzt werden, damit sie korrekt an den neuen Prozess übergeben werden. Ein Beispiel:
QProcess process; process.startCommand("dir \"My Documents\"");
Wörtliche Anführungszeichen in der Zeichenfolge command werden durch dreifache Anführungszeichen dargestellt. Ein Beispiel:
QProcess process; process.startCommand("dir \"Epic 12\"\"\" Singles\"");
Nachdem die Zeichenfolge command geteilt und aus den Anführungszeichen entfernt wurde, verhält sich diese Funktion wie start().
Auf Betriebssystemen, bei denen die System-API für die Übergabe von Befehlszeilenargumenten an einen Unterprozess von Haus aus eine einzelne Zeichenkette verwendet (Windows), kann es vorkommen, dass Befehlszeilen nicht über die portable listenbasierte API von QProcess übergeben werden können. In diesen seltenen Fällen müssen Sie setProgram() und setNativeArguments() anstelle dieser Funktion verwenden.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch splitCommand() und start().
bool QProcess::startDetached(qint64 *pid = nullptr)
Startet das mit setProgram() eingestellte Programm mit den mit setArguments() eingestellten Argumenten in einem neuen Prozess und trennt sich von diesem. Gibt bei Erfolg true
zurück, andernfalls false
. Wenn der aufrufende Prozess beendet wird, läuft der abgelöste Prozess unbeeinflusst weiter.
Unix: Der gestartete Prozess wird in seiner eigenen Sitzung ausgeführt und verhält sich wie ein Daemon.
Der Prozess wird in dem Verzeichnis gestartet, das durch setWorkingDirectory() festgelegt wurde. Wenn workingDirectory() leer ist, wird das Arbeitsverzeichnis vom aufrufenden Prozess geerbt.
Wenn die Funktion erfolgreich ist, wird *pid auf die Prozesskennung des gestarteten Prozesses gesetzt; andernfalls wird sie auf -1 gesetzt. Beachten Sie, dass der Kindprozess beendet werden kann und die PID ohne Vorankündigung ungültig werden kann. Außerdem kann nach dem Beenden des Kindprozesses dieselbe PID wiederverwendet und von einem völlig anderen Prozess verwendet werden. Benutzercode sollte bei der Verwendung dieser Variablen vorsichtig sein, insbesondere wenn man beabsichtigt, den Prozess mit Betriebssystemmitteln zu beenden.
Nur die folgenden Property Setter werden von startDetached() unterstützt:
- setArguments()
- setCreateProcessArgumentsModifier()
- setNativeArguments()
- setProcessEnvironment()
- setProgram()
- setStandardErrorFile()
- setStandardInputFile()
- setStandardOutputFile()
- setProcessChannelMode(QProcess::MergedChannels)
- setStandardOutputProcess()
- setWorkingDirectory()
Alle anderen Eigenschaften des QProcess Objekts werden ignoriert.
Hinweis: Der aufgerufene Prozess erbt das Konsolenfenster des aufrufenden Prozesses. Um die Konsolenausgabe zu unterdrücken, leiten Sie die Standard-/Fehlerausgabe an QProcess::nullDevice() um.
Siehe auch start() und startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory, qint64 *pid).
[static]
bool QProcess::startDetached(const QString &program, const QStringList &arguments = {}, const QString &workingDirectory = QString(), qint64 *pid = nullptr)
Diese Funktion überlastet startDetached().
Startet das Programm program mit den Argumenten arguments in einem neuen Prozess und trennt sich von ihm. Gibt bei Erfolg true
zurück, andernfalls false
. Wenn der aufrufende Prozess beendet wird, läuft der abgetrennte Prozess unbeeinflusst weiter.
Die Argumentbehandlung ist identisch mit der entsprechenden start() Überladung.
Der Prozess wird in dem Verzeichnis workingDirectory gestartet. Wenn workingDirectory leer ist, wird das Arbeitsverzeichnis vom aufrufenden Prozess geerbt.
Wenn die Funktion erfolgreich ist, wird *pid auf die Prozesskennung des gestarteten Prozesses gesetzt.
Siehe auch start().
[private signal]
void QProcess::started()
Dieses Signal wird von QProcess ausgegeben, wenn der Prozess gestartet ist, und state() gibt Running zurück.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
QProcess::ProcessState QProcess::state() const
Gibt den aktuellen Status des Prozesses zurück.
Siehe auch stateChanged() und error().
[private signal]
void QProcess::stateChanged(QProcess::ProcessState newState)
Dieses Signal wird ausgegeben, wenn sich der Zustand von QProcess ändert. Das Argument newState ist der Zustand, in den QProcess gewechselt hat.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
[static]
QStringList QProcess::systemEnvironment()
Gibt die Umgebung des aufrufenden Prozesses als eine Liste von Schlüssel=Wert-Paaren zurück. Beispiel:
QStringList environment = QProcess::systemEnvironment(); // environment = {"PATH=/usr/bin:/usr/local/bin", // "USER=greg", "HOME=/home/greg"}
Diese Funktion speichert die Systemumgebung nicht im Cache. Daher ist es möglich, eine aktualisierte Version der Umgebung zu erhalten, wenn Low-Level-C-Bibliotheksfunktionen wie setenv
oder putenv
aufgerufen wurden.
Beachten Sie jedoch, dass bei wiederholten Aufrufen dieser Funktion die Liste der Umgebungsvariablen neu erstellt wird, was eine nicht triviale Operation ist.
Hinweis: Für neuen Code wird empfohlen, QProcessEnvironment::systemEnvironment() zu verwenden.
Siehe auch QProcessEnvironment::systemEnvironment() und setProcessEnvironment().
[slot]
void QProcess::terminate()
Versucht, den Prozess zu beenden.
Der Prozess darf durch den Aufruf dieser Funktion nicht beendet werden (er erhält die Möglichkeit, den Benutzer nach ungespeicherten Dateien usw. zu fragen).
Unter Windows sendet terminate() eine WM_CLOSE-Nachricht an alle Top-Level-Fenster des Prozesses und dann an den Hauptthread des Prozesses selbst. Unter Unix und macOS wird das Signal SIGTERM
gesendet.
Konsolenanwendungen unter Windows, die keine Ereignisschleife ausführen oder deren Ereignisschleife die WM_CLOSE-Nachricht nicht verarbeitet, können nur durch den Aufruf von kill() beendet werden.
Siehe auch kill().
[noexcept, since 6.6]
QProcess::UnixProcessParameters QProcess::unixProcessParameters() const
Gibt das Objekt UnixProcessParameters zurück, das zusätzliche Flags und Einstellungen beschreibt, die auf Unix-Systemen auf den Kindprozess angewendet werden. Die Standardeinstellungen entsprechen einem standardmäßig konstruierten UnixProcessParameters.
Hinweis: Diese Funktion ist nur auf Unix-Plattformen verfügbar.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch setUnixProcessParameters() und childProcessModifier().
[override virtual]
bool QProcess::waitForBytesWritten(int msecs = 30000)
Reimplements: QIODevice::waitForBytesWritten(int msecs).
bool QProcess::waitForFinished(int msecs = 30000)
Blockiert, bis der Prozess beendet ist und das Signal finished() ausgegeben wurde, oder bis msecs Millisekunden vergangen sind.
Gibt true
zurück, wenn der Prozess beendet wurde; andernfalls wird false
zurückgegeben (wenn der Vorgang eine Zeitüberschreitung hatte, ein Fehler auftrat oder dieser QProcess bereits beendet ist).
Diese Funktion kann ohne eine Ereignisschleife arbeiten. Sie ist nützlich beim Schreiben von Nicht-GUI-Anwendungen und bei der Durchführung von E/A-Operationen in einem Nicht-GUI-Thread.
Warnung: Der Aufruf dieser Funktion aus dem Haupt-Thread (GUI-Thread) kann dazu führen, dass Ihre Benutzeroberfläche einfriert.
Wenn msecs -1 ist, wird diese Funktion nicht abgebrochen.
Siehe auch finished(), waitForStarted(), waitForReadyRead(), und waitForBytesWritten().
[override virtual]
bool QProcess::waitForReadyRead(int msecs = 30000)
Reimplements: QIODevice::waitForReadyRead(int msecs).
bool QProcess::waitForStarted(int msecs = 30000)
Blockiert, bis der Prozess gestartet wurde und das Signal started() ausgegeben wurde oder bis msecs Millisekunden vergangen sind.
Gibt true
zurück, wenn der Prozess erfolgreich gestartet wurde; andernfalls wird false
zurückgegeben (wenn der Vorgang eine Zeitüberschreitung hatte oder ein Fehler auftrat). Wenn der Prozess bereits vor dieser Funktion erfolgreich gestartet wurde, kehrt sie sofort zurück.
Diese Funktion kann ohne eine Ereignisschleife arbeiten. Sie ist nützlich beim Schreiben von Nicht-GUI-Anwendungen und bei der Durchführung von E/A-Operationen in einem Nicht-GUI-Thread.
Warnung: Der Aufruf dieser Funktion aus dem Haupt-Thread (GUI-Thread) kann zum Einfrieren der Benutzeroberfläche führen.
Wenn msecs -1 ist, wird diese Funktion nicht abgebrochen.
Siehe auch started(), waitForReadyRead(), waitForBytesWritten(), und waitForFinished().
QString QProcess::workingDirectory() const
Wenn QProcess ein Arbeitsverzeichnis zugewiesen wurde, gibt diese Funktion das Arbeitsverzeichnis zurück, in das QProcess vor dem Programmstart wechselt. Andernfalls (d.h. wenn kein Verzeichnis zugewiesen wurde) wird eine leere Zeichenkette zurückgegeben, und QProcess verwendet stattdessen das aktuelle Arbeitsverzeichnis der Anwendung.
Siehe auch setWorkingDirectory().
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.