QProcess Class
La classe QProcess permet de lancer des programmes externes et de communiquer avec eux. En savoir plus…
| En-tête : | #include <QProcess> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Hérite de : | QIODevice |
- Liste de tous les membres, y compris les membres hérités
- Membres obsolètes
- QProcess fait partie des modules Entrée/Sortie et Réseau.
Remarque : toutes les fonctions de cette classe sont réentrantes.
Types publics
| 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, …, DisableCoreDumps } |
| flags | UnixProcessFlags |
Fonctions publiques
| 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 |
Fonctions publiques réimplémentées
| 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 |
Slots publics
Signaux
| void | errorOccurred(QProcess::ProcessError error) |
| void | finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit) |
| void | readyReadStandardError() |
| void | readyReadStandardOutput() |
| void | started() |
| void | stateChanged(QProcess::ProcessState newState) |
Membres publics statiques
| 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() |
Fonctions protégées
| void | setProcessState(QProcess::ProcessState state) |
Fonctions protégées réimplémentées
| virtual qint64 | readData(char *data, qint64 maxlen) override |
Description détaillée
Lancement d'un processus
Pour démarrer un processus, transmettez le nom et les arguments de ligne de commande du programme que vous souhaitez exécuter en tant qu’arguments à la fonction start(). Les arguments sont fournis sous forme de chaînes de caractères individuelles dans un objet QStringList.
Vous pouvez également configurer l’exécution du programme à l’aide de ` setProgram()` et ` setArguments()`, puis appeler ` start()` ou ` open()`.
Par exemple, l'extrait de code suivant exécute l'exemple d'horloge analogique dans le style Fusion sur des plateformes X11 en passant des chaînes contenant « -style » et « fusion » comme deux éléments de la liste d'arguments :
QObject *parent = new QObject;
...
QString program = "./path/to/Qt/examples/widgets/analogclock";
QStringList arguments;
arguments << "-style" << "fusion";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program, arguments);QProcess passe alors à l’état « Starting » (en attente de démarrage), puis, une fois le programme lancé, il passe à l’état « Running » (en cours d’exécution) et émet la méthode started().
QProcess vous permet de traiter un processus comme un périphérique d'E/S séquentiel. Vous pouvez écrire dans le processus et y lire des données exactement comme vous accédez à une connexion réseau à l'aide de ` QTcpSocket`. Vous pouvez ensuite écrire dans l’entrée standard du processus en appelant ` write()` et lire la sortie standard en appelant ` read()`, ` readLine()` et ` getChar()`. Comme il hérite de ` QIODevice`, `QProcess` peut également être utilisé comme source d’entrée pour ` QXmlReader`, ou pour générer des données à télécharger à l’aide de ` QNetworkAccessManager`.
Lorsque le processus se termine, QProcess repasse à l’état « NotRunning » (l’état initial) et émet le signal « finished() ».
Le signal finished() fournit le code de sortie et l’état de sortie du processus en tant qu’arguments ; vous pouvez également appeler exitCode() pour obtenir le code de sortie du dernier processus qui s’est terminé, et exitStatus() pour obtenir son état de sortie. Si une erreur se produit à un moment quelconque, QProcess émettra le signal errorOccurred(). Vous pouvez également appeler error() pour connaître le type de la dernière erreur survenue, et state() pour connaître l'état actuel du processus.
Remarque : QProcess n’est pas pris en charge sous VxWorks, iOS, tvOS ou watchOS.
Recherche de l'exécutable
Le programme à exécuter peut être défini soit en appelant ` setProgram()``, soit directement dans l’appel ` start()`. L’effet de l’appel de ` start()` avec le nom du programme et les arguments est équivalent à l’appel de ` setProgram()` et ` setArguments()` avant cette fonction, puis à l’appel de la surcharge sans ces paramètres.
QProcess interprète le nom du programme de trois manières différentes, à l’instar du fonctionnement des shells Unix et de l’interpréteur de commandes Windows dans leurs propres lignes de commande :
- Si le nom du programme est un chemin absolu, c’est exactement l’exécutable qui sera lancé et QProcess n’effectue aucune recherche.
- Si le nom du programme est un chemin relatif comportant plusieurs composants (c'est-à-dire s'il contient au moins une barre oblique), le répertoire de départ à partir duquel ce chemin relatif est recherché dépend du système d'exploitation : sous Windows, il s'agit du répertoire de travail actuel du processus parent, tandis que sous Unix, c'est celui défini par la variable d'environnement setWorkingDirectory().
- Si le nom du programme est un simple nom de fichier sans barres obliques, le comportement dépend du système d’exploitation. Sur les systèmes Unix, QProcess effectuera la recherche à partir de la variable d’environnement `
PATH` ; sous Windows, la recherche est effectuée par le système d’exploitation et portera d’abord sur le répertoire courant du processus parent, puis sur la variable d’environnement `PATH` (voir la documentation de `CreateProcess` pour la liste complète).
Pour éviter tout comportement dépendant de la plate-forme ou tout problème lié à la manière dont l’application en cours a été lancée, il est conseillé de toujours passer un chemin absolu vers l’exécutable à lancer. Pour les binaires auxiliaires fournis avec l'application, on peut construire un tel chemin en commençant par QCoreApplication::applicationDirPath(). De même, pour exécuter explicitement un exécutable situé par rapport au répertoire défini par setWorkingDirectory(), utilisez un chemin d'accès au programme commençant par « ./ » ou « ../ », selon le cas.
Sous Windows, l’extension « .exe » n’est pas requise dans la plupart des cas, à l’exception de ceux décrits dans la documentation de CreateProcess. De plus, QProcess convertira les barres obliques avant de style Unix en barres obliques inversées de chemin d’accès Windows pour le nom du programme. Cela permet d’écrire du code utilisant QProcess de manière multiplateforme, comme le montrent les exemples ci-dessus.
QProcess ne prend pas en charge l’exécution directe des fonctions intégrées du shell Unix ou de l’interpréteur de commandes Windows, telles que la commande ` dir ` d’ cmd.exe ou ` export` du shell Bourne. Sous Unix, même si de nombreuses fonctions intégrées du shell sont également fournies sous forme d’exécutables séparés, leur comportement peut différer de celui des fonctions implémentées en tant que fonctions intégrées. Pour exécuter ces commandes, il convient de lancer explicitement l’interpréteur avec les options appropriées. Sur les systèmes Unix, lancez « /bin/sh » avec deux arguments : « -c » et une chaîne de caractères contenant la ligne de commande à exécuter. Sous Windows, en raison de la manière non standard dont cmd.exe analyse sa ligne de commande, utilisez setNativeArguments() (par exemple, « /c dir d: »).
Variables d’environnement
L’API QProcess propose des méthodes permettant de manipuler les variables d’environnement auxquelles le processus fils aura accès. Par défaut, le processus fils disposera d’une copie des variables d’environnement du processus actuel telles qu’elles existent au moment de l’appel de la fonction start(). Cela signifie que toute modification effectuée à l’aide de qputenv() avant cet appel sera répercutée dans l’environnement du processus fils. Notez que QProcess ne tente pas d’empêcher les conditions de concurrence avec des appels à ` qputenv()` effectués dans d’autres threads ; il est donc recommandé d’éviter d’appeler ` qputenv()` après le démarrage initial de l’application.
L’environnement d’un processus fils spécifique peut être modifié à l’aide des fonctions processEnvironment() et setProcessEnvironment(), qui utilisent la classe QProcessEnvironment. Par défaut, processEnvironment() renvoie un objet pour lequel QProcessEnvironment::inheritsFromParent() est vrai. La définition d’un environnement qui n’hérite pas de celui du processus parent entraînera l’utilisation par QProcess de cet environnement précis pour le processus fils lors de son démarrage.
Le scénario habituel consiste à partir de l’environnement actuel en appelant ` QProcessEnvironment::systemEnvironment()` (environnement), puis à ajouter, modifier ou supprimer des variables spécifiques. La liste de variables ainsi obtenue peut ensuite être appliquée à un `QProcess` à l’aide de ` setProcessEnvironment()`.
Il est possible de supprimer toutes les variables de l’environnement ou de partir d’un environnement vide, en utilisant le constructeur par défaut de `QProcessEnvironment()`. Cela n’est toutefois pas recommandé en dehors de conditions contrôlées et spécifiques au système, car il peut exister des variables système définies dans l’environnement du processus courant et nécessaires au bon fonctionnement du processus fils.
Sous Windows, QProcess copiera les variables d’environnement « "PATH" » et « "SystemRoot" » du processus actuel si elles n’étaient pas définies. Il n’est pas possible de les supprimer complètement, mais il est possible de leur attribuer des valeurs vides. Définir « "PATH" » sur une valeur vide sous Windows entraînera probablement l’échec du démarrage du processus fils.
Communication via les canaux
Les processus disposent de deux canaux de sortie prédéfinis : le canal de sortie standard (stdout) fournit la sortie console habituelle, et le canal d’erreur standard (stderr) fournit généralement les erreurs affichées par le processus. Ces canaux représentent deux flux de données distincts. Vous pouvez basculer entre eux en appelant ` setReadChannel()`. `QProcess` émet ` readyRead()` lorsque des données sont disponibles sur le canal de lecture actuel. Il émet également ` readyReadStandardOutput()` lorsque de nouvelles données de sortie standard sont disponibles, et ` readyReadStandardError()` lorsque de nouvelles données d’erreur standard sont disponibles. Au lieu d’appeler ` read()`, ` readLine()` ou ` getChar()`, vous pouvez lire explicitement toutes les données de l’un ou l’autre des deux canaux en appelant ` readAllStandardOutput()` ou ` readAllStandardError()`.
La terminologie utilisée pour les canaux peut prêter à confusion. Il faut savoir que les canaux de sortie du processus correspondent aux canaux de lecture de QProcess, tandis que les canaux d'entrée du processus correspondent aux canaux d'écriture de QProcess. En effet, ce que nous lisons à l'aide de QProcess correspond à la sortie du processus, et ce que nous écrivons devient l'entrée du processus.
QProcess peut fusionner les deux canaux de sortie, de sorte que les données de sortie standard et d’erreur standard du processus en cours d’exécution utilisent toutes deux le canal de sortie standard. Appelez ` setProcessChannelMode()` avec l’argument ` MergedChannels ` avant de lancer le processus pour activer cette fonctionnalité. Vous avez également la possibilité de rediriger la sortie du processus en cours d’exécution vers le processus principal appelant, en passant ForwardedChannels comme argument. Il est également possible de rediriger un seul des canaux de sortie — on utilise généralement ForwardedErrorChannel, mais ForwardedOutputChannel existe également. Notez que l’utilisation de la redirection de canaux est généralement déconseillée dans les applications GUI — vous devriez plutôt afficher les erreurs graphiquement.
Certains processus nécessitent des paramètres d'environnement spécifiques pour fonctionner. Vous pouvez définir des variables d'environnement pour votre processus en appelant ` setProcessEnvironment()`. Pour définir un répertoire de travail, appelez ` setWorkingDirectory()`. Par défaut, les processus s'exécutent dans le répertoire de travail actuel du processus appelant.
Le positionnement et l’ordre de superposition (Z-order) des fenêtres appartenant à des applications GUI lancées avec QProcess sont contrôlés par le système de fenêtrage sous-jacent. Pour les applications Qt 5, le positionnement peut être spécifié à l’aide de l’option de ligne de commande ` -qwindowgeometry ` ; les applications X11 acceptent généralement l’option de ligne de commande ` -geometry `.
API de processus synchrone
QProcess fournit un ensemble de fonctions permettant de l’utiliser sans boucle d’événements, en suspendant le thread appelant jusqu’à ce que certains signaux soient émis :
- waitForStarted() se bloque jusqu’à ce que le processus ait démarré.
- waitForReadyRead() se bloque jusqu’à ce que de nouvelles données soient disponibles pour la lecture sur le canal de lecture actuel.
- waitForBytesWritten() se bloque jusqu’à ce qu’une charge utile de données ait été écrite dans le processus.
- waitForFinished() se met en attente jusqu’à ce que le processus soit terminé.
L'appel de ces fonctions depuis le thread principal (le thread qui appelle ` QApplication::exec()`) peut entraîner le gel de votre interface utilisateur.
L'exemple suivant exécute gzip pour compresser la chaîne « Qt rocks ! », sans boucle d'événements :
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();Considérations de sécurité
Considérez le nom du programme, les arguments, l’environnement et le répertoire de travail comme des entrées malveillantes dès lors que l’un d’entre eux provient d’une source non fiable (le réseau, un fichier non fiable, une application contrôlée par d’autres utilisateurs). Un processus lancé par QProcess s’exécute avec tous les privilèges de l’application appelante.
Résolution du nom du programme
Dans la mesure du possible, transmettez un chemin absolu comme nom de programme. Un simple nom de fichier est résolu via la variable d’environnement ` PATH ` sous Unix, ou selon l’ordre de recherche du système d’exploitation sous Windows (qui inclut historiquement le répertoire courant, ainsi que ` PATH`), de sorte qu’un attaquant capable d’altérer ` PATH ` ou de placer un fichier dans un répertoire recherché choisit quel binaire s’exécute. Voir Finding the Executable pour plus de détails sur le processus de recherche des binaires.
Gestion des arguments
Transmettez les arguments sous forme d’éléments distincts d’une liste via start() ou setArguments() ; ne construisez jamais une chaîne de commande unique à partir d’éléments non fiables. Sous Unix, les arguments sont transmis tels quels au processus fils sous forme d’entrées individuelles de argv sans intervention du shell ; ainsi, des caractères tels que &, |, ; ou $ n’ont aucune signification particulière. Sous Windows, QProcess mettra correctement entre guillemets et échappera les arguments conformément aux règles définies par la fonction Win32 ` CommandLineToArgvW() `. Sur aucun des deux systèmes d’exploitation, QProcess n’utilisera automatiquement le shell.
Lorsque vous utilisez splitCommand() et startCommand(), veillez à ce que leurs règles de tokenisation et d’échappement diffèrent de celles des shells Windows et POSIX. Une entrée mal échappée ouvre la voie à une injection d’argument.
Lancement de shells et de fichiers batch
Sous Windows, ne transmettez pas d’arguments non fiables à un fichier batch (.bat ou .cmd) ni à cmd.exe. Préférez plutôt utiliser setNativeArguments() et procédez vous-même à leur mise entre guillemets et à leur échappement. QProcess met les arguments entre guillemets conformément aux règles de CommandLineToArgvW(), mais cmd.exe analyse sa ligne de commande différemment et reçoit les méta-caractères du shell %, ^, &, |, <, >, ( et ) sans échappement. Un argument tel que args&calc.exe passé à un script .cmd exécute donc calc.exe en tant que deuxième commande. Notez que sous Windows, tous les arguments sont combinés en interne en une seule chaîne de ligne de commande ; ainsi, même en passant les arguments séparément comme dans process.start("file.cmd", {"args", "&calc.exe"}), le problème n’est pas résolu. De nombreux outils installent des scripts batch (par exemple les wrappers npm, yarn ou gradle ), ce qui fait qu’il est facile de ne pas remarquer que la cible est un fichier batch.
Sous Unix, des problèmes similaires peuvent se poser si vous lancez explicitement le shell — par exemple process.start("/bin/sh", {"-c", "args&&malicious_binary"}) — : dans ce cas, c’est le shell, et non QProcess, qui analyse la chaîne -c et attribue à &&, ;, |, aux backticks et à $() leur signification habituelle, tout comme le fait cmd.exe sous Windows. Ici, la chaîne de fin &&malicious_binary exécute un deuxième programme après args; par conséquent, assembler cette chaîne -c à partir d’une entrée non fiable constitue une injection de commande.
Voir également QBuffer, QFile et QTcpSocket.
Documentation sur les types de membres
QProcess::CreateProcessArgumentModifier
Remarque : cette définition de type n'est disponible que sur Windows pour ordinateurs de bureau.
Sous Windows, QProcess utilise la fonction de l’API Win32 CreateProcess pour lancer des processus enfants. Bien que QProcess offre un moyen pratique de lancer des processus sans se soucier des détails liés à la plate-forme, il est parfois souhaitable d’ajuster avec précision les paramètres transmis à CreateProcess. Pour ce faire, il suffit de définir une fonction CreateProcessArgumentModifier et de la transmettre à setCreateProcessArgumentsModifier.
Une fonction ` CreateProcessArgumentModifier ` prend un paramètre : un pointeur vers une structure ` CreateProcessArguments `. Les membres de cette structure seront transmis à ` CreateProcess ` après l’appel de la fonction ` CreateProcessArgumentModifier `.
L’exemple suivant montre comment passer des indicateurs personnalisés à CreateProcess. Lors du lancement d’un processus de console B à partir d’un processus de console A, QProcess réutilise par défaut la fenêtre de console du processus A pour le processus B. Dans cet exemple, une nouvelle fenêtre de console avec un jeu de couleurs personnalisé est créée pour le processus fils B.
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");Voir également QProcess::CreateProcessArguments et setCreateProcessArgumentsModifier().
enum QProcess::ExitStatus
Cette énumération décrit les différents codes de sortie de QProcess.
| Constante | Valeur | Description |
|---|---|---|
QProcess::NormalExit | 0 | Le processus s'est terminé normalement. |
QProcess::CrashExit | 1 | Le processus s'est bloqué. |
Voir aussi exitStatus().
enum QProcess::InputChannelMode
Cette énumération décrit les modes des canaux d'entrée de processus de QProcess. Transmettez l'une de ces valeurs à la fonction setInputChannelMode() pour définir le mode actuel du canal d'écriture.
| Constante | Valeur | Description |
|---|---|---|
QProcess::ManagedInputChannel | 0 | QProcess gère l’entrée du processus en cours d’exécution. Il s’agit du mode de canal d’entrée par défaut de QProcess. |
QProcess::ForwardedInputChannel | 1 | QProcess transfère l’entrée du processus principal vers le processus en cours d’exécution. Le processus fils lit son entrée standard à partir de la même source que le processus principal. Notez que le processus principal ne doit pas tenter de lire son entrée standard tant que le processus fils est en cours d’exécution. |
Voir aussi ` setInputChannelMode()`.
enum QProcess::ProcessChannel
Cette énumération décrit les canaux de processus utilisés par le processus en cours d'exécution. Transmettez l'une de ces valeurs à la fonction ` setReadChannel()` pour définir le canal de lecture actuel de ` QProcess`.
| Constante | Valeur | Description |
|---|---|---|
QProcess::StandardOutput | 0 | La sortie standard (stdout) du processus en cours d'exécution. |
QProcess::StandardError | 1 | La sortie d'erreur standard (stderr) du processus en cours d'exécution. |
Voir aussi setReadChannel().
enum QProcess::ProcessChannelMode
Cette énumération décrit les modes de canal de sortie du processus de QProcess. Transmettez l'une de ces valeurs à la fonction setProcessChannelMode() pour définir le mode actuel du canal de lecture.
| Constante | Valeur | Description |
|---|---|---|
QProcess::SeparateChannels | 0 | QProcess gère la sortie du processus en cours d'exécution, en conservant les données de sortie standard et d'erreur standard dans des tampons internes distincts. Vous pouvez sélectionner le canal de lecture actuel d'QProcess en appelant la fonction setReadChannel(). Il s'agit du mode de canal par défaut de QProcess. |
QProcess::MergedChannels | 1 | QProcess fusionne la sortie du processus en cours d’exécution dans le canal de sortie standard (stdout). Le canal d’erreur standard (stderr) ne recevra aucune donnée. Les données de sortie standard et d’erreur standard du processus en cours d’exécution sont entrelacées. Pour les processus détachés, la sortie fusionnée du processus en cours d’exécution est redirigée vers le processus principal. |
QProcess::ForwardedChannels | 2 | QProcess transmet la sortie du processus en cours d'exécution au processus principal. Tout ce que le processus fils écrit dans sa sortie standard et son erreur standard sera écrit dans la sortie standard et l'erreur standard du processus principal. |
QProcess::ForwardedErrorChannel | 4 | QProcess gère la sortie standard du processus en cours d’exécution, mais transfère sa sortie d’erreur standard vers le processus principal. Cela reflète l’utilisation typique des outils en ligne de commande en tant que filtres, où la sortie standard est redirigée vers un autre processus ou un fichier, tandis que la sortie d’erreur standard est affichée sur la console à des fins de diagnostic. (Cette valeur a été introduite dans Qt 5.2.) |
QProcess::ForwardedOutputChannel | 3 | Complémentaire à `ForwardedErrorChannel`. (Cette valeur a été introduite dans Qt 5.2.) Remarque : Windows supprime intentionnellement la sortie des applications exclusivement graphiques vers les consoles héritées. Cela ne s'applique pas à la sortie redirigée vers des fichiers ou des tubes. Pour rediriger malgré tout la sortie des applications exclusivement graphiques vers la console, vous devez utiliser SeparateChannels et effectuer vous-même la redirection en lisant la sortie et en l'écrivant dans les canaux de sortie appropriés. |
Voir aussi ` setProcessChannelMode()` ().
enum QProcess::ProcessError
Cette énumération décrit les différents types d'erreurs signalées par QProcess.
| Constante | Valeur | Description |
|---|---|---|
QProcess::FailedToStart | 0 | Le processus n'a pas pu démarrer. Soit le programme appelé est introuvable, soit vous ne disposez pas des autorisations ou des ressources suffisantes pour l'exécuter. |
QProcess::Crashed | 1 | Le processus s'est bloqué quelque temps après avoir démarré correctement. |
QProcess::Timedout | 2 | La dernière fonction waitFor...() a expiré. L'état de QProcess reste inchangé, et vous pouvez essayer d'appeler à nouveau waitFor...(). |
QProcess::WriteError | 4 | Une erreur s'est produite lors de la tentative d'écriture dans le processus. Par exemple, le processus n'est peut-être pas en cours d'exécution, ou il a peut-être fermé son canal d'entrée. |
QProcess::ReadError | 3 | Une erreur s'est produite lors de la tentative de lecture à partir du processus. Par exemple, le processus n'est peut-être pas en cours d'exécution. |
QProcess::UnknownError | 5 | Une erreur inconnue s’est produite. Il s’agit de la valeur de retour par défaut de error(). |
Voir également error().
enum QProcess::ProcessState
Cette énumération décrit les différents états d’ QProcess.
| Constante | Valeur | Description |
|---|---|---|
QProcess::NotRunning | 0 | Le processus n'est pas en cours d'exécution. |
QProcess::Starting | 1 | Le processus est en cours de démarrage, mais le programme n’a pas encore été lancé. |
QProcess::Running | 2 | Le processus est en cours d'exécution et prêt pour la lecture et l'écriture. |
Voir aussi state().
[since 6.6] enum class QProcess::UnixProcessFlag
flags QProcess::UnixProcessFlags
Ces indicateurs peuvent être utilisés dans le champ « flags » (Paramètres de la liste de diffusion) de UnixProcessParameters.
| Constante | Valeur | Description |
|---|---|---|
QProcess::UnixProcessFlag::CloseFileDescriptors | 0x0010 | Ferme tous les descripteurs de fichiers dépassant le seuil défini par lowestFileDescriptorToClose, empêchant ainsi tout descripteur actuellement ouvert dans le processus parent de se propager accidentellement au processus enfant. Les descripteurs de fichiers stdin, stdout et stderr ne sont jamais fermés. |
QProcess::UnixProcessFlag::CreateNewSession (since Qt 6.7) | 0x0040 | Lance une nouvelle session de processus, en appelant ` setsid(2)`. Cela permet au processus fils de survivre à la session dans laquelle se trouve le processus actuel. Il s’agit de l’une des étapes effectuées par ` startDetached()` pour permettre au processus de se détacher, et c’est également l’une des étapes permettant de transformer un processus en démon. |
QProcess::UnixProcessFlag::DisconnectControllingTerminal (since Qt 6.7) | 0x0080 | Demande au processus de se déconnecter de son terminal de contrôle, s’il en possède un. S’il n’en possède pas, rien ne se passe. Les processus encore connectés à un terminal de contrôle peuvent recevoir un signal « Hang Up » (SIGHUP) si le terminal se ferme, ou l’un des autres signaux de contrôle du terminal (SIGTSTP, SIGTTIN, SIGTTOU). Notez que sur certains systèmes d’exploitation, un processus ne peut se déconnecter du terminal de contrôle que s’il est le « session leader », ce qui signifie que le drapeau ` CreateNewSession ` peut être requis. À l’instar de celui-ci, il s’agit de l’une des étapes permettant de démonsifier un processus. |
QProcess::UnixProcessFlag::IgnoreSigPipe | 0x0002 | Définit toujours le signal « SIGPIPE » comme ignoré (SIG_IGN), même si le drapeau ResetSignalHandlers a été activé. Par défaut, si le processus fils tente d’écrire sur sa sortie standard ou son erreur standard après la fermeture du canal correspondant avec QProcess::closeReadChannel(), il recevrait le signal « SIGPIPE » et se terminerait immédiatement ; avec ce drapeau, l’opération d’écriture échoue sans signal et le processus fils peut continuer son exécution. |
QProcess::UnixProcessFlag::ResetIds (since Qt 6.7) | 0x0100 | Supprime tout ID utilisateur ou groupe effectif conservé que le processus actuel pourrait encore posséder (voir setuid(2) et setgid(2), ainsi que QCoreApplication::setSetuidAllowed()). Ceci est utile si le processus actuel était setuid ou setgid et que l’on ne souhaite pas que le processus fils conserve les privilèges élevés. |
QProcess::UnixProcessFlag::ResetSignalHandlers | 0x0001 | Réinitialise tous les gestionnaires de signaux Unix à leur état par défaut (c’est-à-dire transmet SIG_DFL à signal(2)). Ce drapeau est utile pour garantir qu’aucun signal ignoré (SIG_IGN) n’affecte le comportement du processus fils. |
QProcess::UnixProcessFlag::UseVFork | 0x0020 | Demande à ` QProcess ` d’utiliser ` vfork(2) ` pour lancer le processus fils. Utilisez ce drapeau pour indiquer que la fonction de rappel définie avec ` setChildProcessModifier()` peut être exécutée en toute sécurité du côté du processus fils d’un ` vfork(2)` ; c’est-à-dire que la fonction de rappel ne modifie aucune variable non locale (directement ou via une fonction qu’elle appelle), ni ne tente de communiquer avec le processus parent. Le fait qu’ QProcess utilise effectivement vfork(2) et que vfork(2) diffère de la valeur standard fork(2) dépend de l’implémentation. |
QProcess::UnixProcessFlag::DisableCoreDumps (since Qt 6.9) | 0x0200 | Demande que QProcess désactive les vidages de mémoire dans le processus fils. Ceci est utile si l’exécutable en cours d’exécution est susceptible de planter, mais que les utilisateurs et les responsables de maintenance ne souhaitent pas générer de rapports de bogues pour ces conditions (par exemple, si l’exécutable est un processus de test). Ce paramètre n’affecte pas la fonction ` exitStatus()` du processus qui a planté. Il est implémenté en fixant à zéro la limite souple de la ressource de taille des vidages de mémoire du processus, ce qui signifie que l’application peut toujours annuler cette modification en augmentant cette valeur jusqu’à la limite stricte. |
Cette énumération a été introduite dans Qt 6.6.
Le type `UnixProcessFlags` est un `typedef` pour ` QFlags<UnixProcessFlag>`. Il stocke une combinaison OR de valeurs `UnixProcessFlag`.
Voir également setUnixProcessParameters() et unixProcessParameters().
Documentation des fonctions membres
[explicit] QProcess::QProcess(QObject *parent = nullptr)
Crée un objet QProcess avec l'parent on fournie.
[virtual noexcept] QProcess::~QProcess()
Détruit l'objet ` QProcess `, c'est-à-dire qu'il met fin au processus.
Notez que cette fonction ne renvoie rien tant que le processus n'est pas terminé.
QStringList QProcess::arguments() const
Renvoie les arguments de ligne de commande utilisés lors du dernier démarrage du processus.
Voir également setArguments() et start().
[override virtual] qint64 QProcess::bytesToWrite() const
Réimplémente : QIODevice::bytesToWrite() const.
[since 6.0] std::function<void ()> QProcess::childProcessModifier() const
Renvoie la fonction de modification précédemment définie via l'appel à ` setChildProcessModifier()`.
Remarque : cette fonction n'est disponible que sur les plateformes Unix.
Cette fonction a été introduite dans Qt 6.0.
Voir également setChildProcessModifier() et unixProcessParameters().
[override virtual] void QProcess::close()
Réimplémente : QIODevice::close().
Interrompt toute communication avec le processus et le force à s'arrêter. Après l'appel de cette fonction, QProcess n'émettra plus d'readyRead(), et il ne sera plus possible de lire ou d'écrire des données.
void QProcess::closeReadChannel(QProcess::ProcessChannel channel)
Ferme le canal de lecture channel. Une fois cette fonction appelée, QProcess ne recevra plus de données sur ce canal. Les données déjà reçues restent toutefois disponibles pour lecture.
Appelez cette fonction pour économiser de la mémoire si la sortie du processus ne vous intéresse pas.
Voir également closeWriteChannel() et setReadChannel().
void QProcess::closeWriteChannel()
Prévoit la fermeture du canal d'écriture de l'QProcess. Le canal se fermera une fois que toutes les données auront été écrites dans le processus. Après l'appel de cette fonction, toute tentative d'écriture dans le processus échouera.
La fermeture du canal d'écriture est nécessaire pour les programmes qui lisent des données d'entrée jusqu'à ce que le canal soit fermé. Par exemple, le programme « more » est utilisé pour afficher des données textuelles dans une console sous Unix et Windows. Cependant, il n'affichera pas les données textuelles tant que le canal d'écriture de ` QProcess` n'aura pas été fermé. Exemple :
QProcess more;
more.start("more");
more.write("Text to display");
more.closeWriteChannel();
// QProcess will emit readyRead() once "more" starts printingLe canal d’écriture est ouvert implicitement lors de l’appel de la fonction start().
Voir également closeReadChannel().
QProcess::CreateProcessArgumentModifier QProcess::createProcessArgumentsModifier() const
Renvoie une fonction de modification « CreateProcess » précédemment définie.
Remarque : cette fonction n'est disponible que sur la plate-forme Windows.
Voir également setCreateProcessArgumentsModifier() et QProcess::CreateProcessArgumentModifier.
QProcess::ProcessError QProcess::error() const
Renvoie le type de l'erreur qui s'est produite en dernier.
Voir également state().
[signal] void QProcess::errorOccurred(QProcess::ProcessError error)
Ce signal est émis lorsqu'une erreur survient au cours du processus. L'error, indiquée, décrit le type d'erreur qui s'est produite.
[static] int QProcess::execute(const QString &program, const QStringList &arguments = {})
Lance le programme program avec les arguments arguments dans un nouveau processus, attend qu'il se termine, puis renvoie le code de sortie du processus. Toutes les données que le nouveau processus écrit dans la console sont transmises au processus appelant.
L'environnement et le répertoire de travail sont hérités du processus appelant.
La gestion des arguments est identique à celle de la surcharge correspondante de la fonction start().
Si le processus ne peut pas être lancé, la valeur -2 est renvoyée. Si le processus plante, la valeur -1 est renvoyée. Sinon, le code de sortie du processus est renvoyé.
Voir également start().
int QProcess::exitCode() const
Renvoie le code de sortie du dernier processus qui s'est terminé.
Cette valeur n'est valide que si la fonction ` exitStatus()` renvoie ` NormalExit`.
QProcess::ExitStatus QProcess::exitStatus() const
Renvoie le code de sortie du dernier processus à s'être terminé.
Sous Windows, si le processus a été interrompu à l'aide de la fonction `TerminateProcess()` depuis une autre application, cette fonction renverra tout de même la valeur ` NormalExit `, sauf si le code de sortie est inférieur à 0.
[noexcept, since 6.7] void QProcess::failChildProcessModifier(const char *description, int error = 0)
Ces fonctions peuvent être utilisées au sein du jeu de modificateurs avec ` setChildProcessModifier()` pour signaler qu’une erreur s’est produite. Lorsque le modificateur appelle ces fonctions, ` QProcess ` émettra ` errorOccurred()` avec le code ` QProcess::FailedToStart ` dans le processus parent. La fonction ` description ` peut être utilisée pour inclure des informations dans ` errorString()` afin de faciliter le diagnostic du problème, généralement le nom de l’appel qui a échoué, à l’instar de la fonction de la bibliothèque C ` perror()`. De plus, le paramètre ` error ` peut être un code d’erreur ` <errno.h> ` dont le texte sera également inclus.
Par exemple, un modificateur de processus fils pourrait préparer un descripteur de fichier supplémentaire pour le processus fils de la manière suivante :
process.setChildProcessModifier([fd, &process]() {
if (dup2(fd, TargetFileDescriptor) < 0)
process.failChildProcessModifier(errno, "aux comm channel");
});
process.start();Où ` fd ` est un descripteur de fichier actuellement ouvert dans le processus parent. Si l’appel système ` dup2() ` a entraîné une condition d’ EBADF, le processus ` errorString()` pourrait afficher : « Erreur signalée par le modificateur du processus enfant : canal de communication aux : descripteur de fichier incorrect ».
Cette fonction ne revient pas à l’appelant. Son utilisation en dehors du modificateur enfant et sans l’objet QProcess correct entraîne un comportement indéfini.
Remarque : l’implémentation impose une limite de longueur d’environ 500 caractères pour le paramètre ` description `. Cela n’inclut pas le texte issu du code ` error `.
Cette fonction a été introduite dans Qt 6.7.
Voir aussi setChildProcessModifier() et setUnixProcessParameters().
[signal] void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus = NormalExit)
Ce signal est émis lorsque le processus s'arrête. exitCode correspond au code de sortie du processus (valable uniquement pour les sorties normales), et exitStatus correspond à l'état de sortie. Une fois le processus terminé, les tampons indiqués dans QProcess restent intacts. Vous pouvez toujours lire les données que le processus a pu écrire avant de s'arrêter.
Voir également exitStatus().
QProcess::InputChannelMode QProcess::inputChannelMode() const
Renvoie le mode du canal d'entrée standard de ` QProcess `.
Voir également setInputChannelMode() et InputChannelMode.
[override virtual] bool QProcess::isSequential() const
Réimplémente : QIODevice::isSequential() const.
[slot] void QProcess::kill()
Tue le processus en cours, ce qui provoque sa fermeture immédiate.
Sous Windows, la fonction kill() utilise TerminateProcess, tandis que sous Unix et macOS, le signal SIGKILL est envoyé au processus.
Voir aussi ` terminate()`.
QString QProcess::nativeArguments() const
Renvoie les arguments de ligne de commande natifs supplémentaires du programme.
Remarque : cette fonction n'est disponible que sur la plate-forme Windows.
Voir aussi setNativeArguments().
[static] QString QProcess::nullDevice()
Le périphérique nul du système d'exploitation.
Le chemin d'accès au fichier renvoyé utilise les séparateurs de répertoires natifs.
Voir également QProcess::setStandardInputFile(), QProcess::setStandardOutputFile() et QProcess::setStandardErrorFile().
[override virtual] bool QProcess::open(QIODeviceBase::OpenMode mode = ReadWrite)
Réimplémente : QIODevice::open(mode OpenMode de QIODeviceBase).
Lance le programme défini par setProgram() avec les arguments définis par setArguments(). Le paramètre OpenMode est défini sur mode.
Cette méthode est un alias de start() et n’existe que pour implémenter intégralement l’interface définie par QIODevice.
Renvoie ` true ` si le programme a été lancé.
Voir également start(), setProgram() et setArguments().
QProcess::ProcessChannelMode QProcess::processChannelMode() const
Renvoie le mode des canaux de sortie standard et d'erreur standard de QProcess.
Voir également setProcessChannelMode(), ProcessChannelMode et setReadChannel().
QProcessEnvironment QProcess::processEnvironment() const
Renvoie l'environnement que ` QProcess ` transmettra à son processus enfant. Si aucun environnement n'a été défini à l'aide de ` setProcessEnvironment()` (), cette méthode renvoie un objet indiquant que l'environnement sera hérité du processus parent.
Voir également setProcessEnvironment(), QProcessEnvironment::inheritsFromParent() et Environment variables.
qint64 QProcess::processId() const
Renvoie l'identifiant natif du processus en cours d'exécution, s'il est disponible. Si aucun processus n'est en cours d'exécution, la valeur « 0 » est renvoyée.
QString QProcess::program() const
Renvoie le programme avec lequel le processus a été lancé pour la dernière fois.
Voir également setProgram() et start().
QByteArray QProcess::readAllStandardError()
Quel que soit le canal de lecture actuel, cette fonction renvoie toutes les données disponibles provenant de l'erreur standard du processus sous la forme d'un objet ` QByteArray`.
Voir également readyReadStandardError(), readAllStandardOutput(), readChannel() et setReadChannel().
QByteArray QProcess::readAllStandardOutput()
Quel que soit le canal de lecture actuel, cette fonction renvoie toutes les données disponibles sur la sortie standard du processus sous la forme d’un objet ` QByteArray`.
Voir également readyReadStandardOutput(), readAllStandardError(), readChannel() et setReadChannel().
QProcess::ProcessChannel QProcess::readChannel() const
Renvoie le canal de lecture actuel de l'QProcess.
Voir également setReadChannel().
[override virtual protected] qint64 QProcess::readData(char *data, qint64 maxlen)
Réimplémente : QIODevice::readData(char *data, qint64 maxSize).
[private signal] void QProcess::readyReadStandardError()
Ce signal est émis lorsque le processus a mis à disposition de nouvelles données via son canal d'erreur standard (stderr). Il est émis quelle que soit l'read channel.
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux, mais ne peut pas être émis par l'utilisateur.
Voir également readAllStandardError() et readChannel().
[private signal] void QProcess::readyReadStandardOutput()
Ce signal est émis lorsque le processus a mis à disposition de nouvelles données via son canal de sortie standard (stdout). Il est émis quelle que soit l'read channel.
Remarque : il s’agit d’un signal privé. Il peut être utilisé dans les connexions de signaux, mais ne peut pas être émis par l’utilisateur.
Voir également readAllStandardOutput() et readChannel().
void QProcess::setArguments(const QStringList &arguments)
Définit l'arguments e à transmettre au programme appelé lors du lancement du processus. Cette fonction doit être appelée avant start().
Voir également start(), setProgram() et arguments().
[since 6.0] void QProcess::setChildProcessModifier(const std::function<void ()> &modifier)
Définit la fonction « modifier » pour le processus fils, sur les systèmes Unix (y compris macOS ; pour Windows, voir setCreateProcessArgumentsModifier()). La fonction contenue dans l'argument « modifier » sera appelée dans le processus fils une fois que « fork() » ou « vfork() » aura été exécuté et que « QProcess » aura configuré les descripteurs de fichiers standard pour le processus fils, mais avant « execve() », à l'intérieur de « start » ().
Voici un exemple de configuration d’un processus fils pour qu’il s’exécute sans privilèges :
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();
}Si la fonction de modification rencontre une condition d’échec, elle peut utiliser ` failChildProcessModifier()` pour signaler la situation à l’appelant de ` QProcess `. Elle peut également utiliser d’autres méthodes pour arrêter le processus, telles que ` _exit()` ou ` abort()`.
Certaines propriétés du processus fils, telles que la fermeture de tous les descripteurs de fichiers superflus ou la déconnexion du TTY de contrôle, peuvent être plus facilement mises en œuvre à l’aide de la fonction setUnixProcessParameters(), qui permet de détecter les échecs et de signaler une condition d’ FailedToStart. Le modificateur est utile pour modifier certaines propriétés peu courantes du processus fils, telles que la configuration de descripteurs de fichiers supplémentaires. Si un modificateur de processus fils et des paramètres de processus Unix sont tous deux définis, le modificateur est exécuté avant que ces paramètres ne soient appliqués.
Remarque : dans les applications multithread, cette fonction doit veiller à ne pas appeler de fonctions susceptibles de verrouiller des mutex pouvant être utilisés par d’autres threads (en général, il est conseillé de n’utiliser que des fonctions définies par POSIX comme « async-signal-safe »). La plupart des fonctions de l’API Qt ne sont pas sûres au sein de cette fonction de rappel, notamment ` qDebug()`, et peuvent entraîner des blocages.
Remarque : si l'indicateur UnixProcessParameters::UseVFork est défini via ` setUnixProcessParameters()`, ` QProcess ` peut utiliser la sémantique ` vfork() ` pour lancer le processus enfant ; cette fonction doit donc respecter des contraintes encore plus strictes. Premièrement, comme il partage toujours la mémoire avec le processus parent, il ne doit écrire dans aucune variable non locale et doit respecter une sémantique d’ordonnancement appropriée lors de la lecture de celles-ci, afin d’éviter les conflits d’accès. Deuxièmement, un nombre encore plus important de fonctions de bibliothèque risquent de se comporter de manière inappropriée ; par conséquent, cette fonction ne doit utiliser que des appels système de bas niveau, tels que read(), write(), setsid(), nice() et autres fonctions similaires.
Cette fonction a été introduite dans Qt 6.0.
Voir également childProcessModifier(), failChildProcessModifier() et setUnixProcessParameters().
void QProcess::setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier)
Définit l'modifier e pour l'appel d'API Win32 CreateProcess. Passez QProcess::CreateProcessArgumentModifier() pour supprimer une valeur précédemment définie.
Remarque : cette fonction n'est disponible que sur la plateforme Windows et nécessite C++11.
Voir également createProcessArgumentsModifier(), QProcess::CreateProcessArgumentModifier et setChildProcessModifier().
void QProcess::setInputChannelMode(QProcess::InputChannelMode mode)
Définit le mode du canal d'entrée standard de la fonction ` QProcess ` sur la valeur spécifiée par ` mode `. Ce mode sera utilisé lors du prochain appel à la fonction ` start()`.
Voir également inputChannelMode() et InputChannelMode.
void QProcess::setNativeArguments(const QString &arguments)
Définit des arguments s supplémentaires de ligne de commande natives pour le programme.
Sur les systèmes d'exploitation où l'API système permettant de transmettre des arguments s de ligne de commande à un sous-processus utilise nativement une seule chaîne de caractères, il est possible de concevoir des lignes de commande qui ne peuvent pas être transmises via l'API portable basée sur des listes de ` QProcess`. Dans de tels cas, cette fonction doit être utilisée pour définir une chaîne de caractères qui est ajoutée à la chaîne composée à partir de la liste d'arguments habituelle, en la séparant par un espace.
Remarque : cette fonction n’est disponible que sur la plate-forme Windows.
Voir également nativeArguments().
void QProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
Définit le mode des canaux de sortie standard et d'erreur standard de la fonction ` QProcess ` sur la valeur spécifiée ` mode `. Ce mode sera utilisé lors du prochain appel de la fonction ` start()`. Par exemple :
QProcess builder;
builder.setProcessChannelMode(QProcess::MergedChannels);
builder.start("make", QStringList() << "-j2");
if (!builder.waitForFinished())
qDebug() << "Make failed:" << builder.errorString();
sinon
qDebug() << "Make output:" << builder.readAll();Voir également processChannelMode(), ProcessChannelMode et setReadChannel().
void QProcess::setProcessEnvironment(const QProcessEnvironment &environment)
Définit la variable d'environnement « environment » que la fonction ` QProcess ` transmettra au processus fils.
Par exemple, le code suivant ajoute la variable d'environnement TMPDIR:
QProcess process;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable
process.setProcessEnvironment(env);
process.start("myapp");Notez que, sous Windows, les noms des variables d’environnement ne sont pas sensibles à la casse.
Voir également processEnvironment(), QProcessEnvironment::systemEnvironment() et Environment variables.
[protected] void QProcess::setProcessState(QProcess::ProcessState state)
Définit l'état actuel de l'QProcess sur la valeur state spécifiée.
Voir également state().
void QProcess::setProgram(const QString &program)
Définit l'program à utiliser lors du lancement du processus. Cette fonction doit être appelée avant ` start()`.
Si ` program ` est un chemin absolu, il spécifie l’exécutable exact qui sera lancé. Les chemins relatifs seront résolus selon les spécificités de la plate-forme, ce qui inclut la recherche dans la variable d’environnement ` PATH ` (voir Finding the Executable pour plus de détails).
Voir également start(), setArguments(), program() et QStandardPaths::findExecutable().
void QProcess::setReadChannel(QProcess::ProcessChannel channel)
Définit le canal de lecture actuel de l'QProcess sur le canal spécifié channel. Le canal d'entrée actuel est utilisé par les fonctions read(), readAll(), readLine() et getChar(). Il détermine également quel canal déclenche l'QProcess pour émettre readyRead().
Voir également readChannel().
void QProcess::setStandardErrorFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
Redirige l'erreur standard du processus vers le fichier fileName. Lorsque la redirection est active, le canal de lecture de l'erreur standard est fermé : toute tentative de lecture à l'aide de read() échouera systématiquement, tout comme readAllStandardError(). Le fichier sera mis en append si mode est défini sur Append ; dans le cas contraire, il sera tronqué.
Voir setStandardOutputFile() pour plus d’informations sur la manière dont le fichier est ouvert.
Remarque : si la fonction setProcessChannelMode() a été appelée avec l’argument QProcess::MergedChannels, cette fonction n’a aucun effet.
Voir également setStandardInputFile(), setStandardOutputFile() et setStandardOutputProcess().
void QProcess::setStandardInputFile(const QString &fileName)
Redirige l'entrée standard du processus vers le fichier indiqué par fileName. Lorsqu'une redirection d'entrée est en place, l'objet QProcess sera en mode lecture seule (l'appel de la fonction write() provoquera une erreur).
Pour que le processus lise immédiatement la fin de fichier (EOF), passez nullDevice() ici. Cette méthode est plus propre que d’utiliser closeWriteChannel() avant d’écrire des données, car elle peut être configurée avant le démarrage du processus.
Si le fichier fileName n’existe pas au moment où start() est appelé ou s’il n’est pas accessible en lecture, le lancement du processus échouera.
L'appel de `setStandardInputFile()` après le démarrage du processus n'a aucun effet.
Voir également setStandardOutputFile(), setStandardErrorFile() et setStandardOutputProcess().
void QProcess::setStandardOutputFile(const QString &fileName, QIODeviceBase::OpenMode mode = Truncate)
Redirige la sortie standard du processus vers le fichier fileName. Une fois la redirection mise en place, le canal de lecture de la sortie standard est fermé : toute tentative de lecture à l'aide de read() échouera systématiquement, tout comme readAllStandardOutput().
Pour ignorer toute la sortie standard du processus, passez ici nullDevice(). Cette méthode est plus efficace que de simplement ne jamais lire la sortie standard, car aucun tampon QProcess n’est rempli.
Si le fichier fileName n'existe pas au moment où start() est appelé, il sera créé. S'il ne peut pas être créé, le démarrage échouera.
Si le fichier existe et que mode est QIODeviceBase::Truncate, le fichier sera tronqué. Dans le cas contraire (si mode est QIODeviceBase::Append), le contenu sera ajouté à la fin du fichier.
L’appel de la fonction setStandardOutputFile() après le démarrage du processus n’a aucun effet.
Si fileName est une chaîne vide, la redirection de la sortie standard est désactivée. Cela est utile pour rétablir la sortie standard après une redirection.
Voir également setStandardInputFile(), setStandardErrorFile() et setStandardOutputProcess().
void QProcess::setStandardOutputProcess(QProcess *destination)
Redirige le flux de sortie standard de ce processus vers l'entrée standard du processus « destination ».
La commande shell suivante :
command1 | command2peut être réalisée avec ` QProcess ` à l'aide du code suivant :
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("command1");
process2.start("command2");[since 6.6] void QProcess::setUnixProcessParameters(const QProcess::UnixProcessParameters ¶ms)
Définit les paramètres et options supplémentaires du processus fils sur les systèmes Unix à la valeur « params ». Cette fonction peut être utilisée pour demander à « QProcess » de modifier le processus fils avant de lancer l'exécutable cible.
Cette fonction permet de modifier certaines propriétés du processus fils, telles que la fermeture de tous les descripteurs de fichiers superflus, la modification du niveau de priorité (nice) du processus fils ou la déconnexion du TTY de contrôle. Pour un contrôle plus fin du processus fils ou pour le modifier d’autres façons, utilisez la fonction ` setChildProcessModifier()`. Si un modificateur de processus fils et des paramètres de processus Unix sont tous deux définis, le modificateur est exécuté avant l’application de ces paramètres.
Remarque : cette fonction n’est disponible que sur les plateformes Unix.
Cette fonction a été introduite dans Qt 6.6.
Voir également ` unixProcessParameters()` et ` setChildProcessModifier()`.
[since 6.6] void QProcess::setUnixProcessParameters(QProcess::UnixProcessFlags flagsOnly)
Définit les paramètres supplémentaires du processus fils sur les systèmes Unix à « flagsOnly ». Cela revient à la surcharge où seul le champ « flags » est défini.
Remarque : cette fonction n'est disponible que sur les plateformes Unix.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.6.
Voir également ` unixProcessParameters()` et ` setChildProcessModifier()`.
void QProcess::setWorkingDirectory(const QString &dir)
Définit le répertoire de travail sur dir. La commande « QProcess » lancera le processus dans ce répertoire. Par défaut, le processus est lancé dans le répertoire de travail du processus appelant.
Voir également workingDirectory() et start().
[static] QStringList QProcess::splitCommand(QStringView command)
Divise la chaîne « command » en une liste de tokens et renvoie cette liste.
Les tokens contenant des espaces peuvent être placés entre guillemets doubles ; trois guillemets doubles consécutifs représentent le caractère « guillemet » lui-même.
void QProcess::start(const QString &program, const QStringList &arguments = {}, QIODeviceBase::OpenMode mode = ReadWrite)
Lance l’ program spécifié dans un nouveau processus, en lui transmettant les arguments de ligne de commande contenus dans ` arguments`. Voir ` setProgram()` pour plus d’informations sur la manière dont ` QProcess ` recherche l’exécutable à lancer. Le paramètre `OpenMode` est défini sur ` mode`. Aucun autre fractionnement des arguments n’est effectué.
L’objet ` QProcess ` passe immédiatement à l’état `Starting`. Si le processus démarre correctement, ` QProcess ` émet ` started()` ; dans le cas contraire, ` errorOccurred()` est émis. Notez que sur les plateformes capables de lancer des processus fils de manière synchrone (notamment Windows), ces signaux seront émis avant que cette fonction ne revienne et cet objet ` QProcess ` passera respectivement à l’état ` QProcess::Running ` ou ` QProcess::NotRunning `. Sur les autres plateformes, les signaux « started » () et « errorOccurred » () seront différés.
Appelez la fonction ` waitForStarted()` pour vous assurer que le processus a démarré (ou que son démarrage a échoué) et que ces signaux ont bien été émis. Vous pouvez appeler cette fonction en toute sécurité même si l'état de démarrage du processus est déjà connu, bien que le signal ne soit pas émis une nouvelle fois.
Windows : les arguments sont placés entre guillemets et concaténés en une ligne de commande compatible avec la fonction Windows ` CommandLineToArgvW() `. Pour les programmes ayant des exigences différentes en matière de mise entre guillemets de la ligne de commande, vous devez utiliser ` setNativeArguments()`. Un programme notable qui ne respecte pas les règles de ` CommandLineToArgvW() ` est `cmd.exe` et, par conséquent, tous les scripts batch.
Si l’objet ` QProcess ` exécute déjà un processus, un avertissement peut s’afficher sur la console, et le processus existant continuera à s’exécuter sans être affecté.
Remarque : le fait que le lancement du processus filsait abouti signifie uniquement que le système d’exploitation a réussi à créer le processus et à lui attribuer les ressources dont dispose chaque processus, telles que son identifiant de processus. Le processus fils peut se bloquer ou échouer très tôt et ne pas produire la sortie attendue. Sur la plupart des systèmes d’exploitation, cela peut inclure des erreurs de liaison dynamique.
Voir également processId(), started(), waitForStarted() et setNativeArguments().
void QProcess::start(QIODeviceBase::OpenMode mode = ReadWrite)
Lance le programme défini par ` setProgram()` avec les arguments définis par ` setArguments()`. Le paramètre `OpenMode` est défini sur ` mode`.
Il s'agit d'une fonction surchargée.
Voir également open(), setProgram() et setArguments().
[since 6.0] void QProcess::startCommand(const QString &command, QIODeviceBase::OpenMode mode = ReadWrite)
Lance la commande command dans un nouveau processus. Le paramètre OpenMode est défini sur « mode ».
command Il s'agit d'une chaîne de texte unique contenant à la fois le nom du programme et ses arguments. Les arguments sont séparés par un ou plusieurs espaces. Par exemple :
QProcess process;
process.startCommand("del /s *.txt");
// same as process.start("del", QStringList() << "/s" << "*.txt");
//...Les arguments contenant des espaces doivent être placés entre guillemets pour être correctement transmis au nouveau processus. Par exemple :
QProcess process;
process.startCommand("dir \"My Documents\"");Les guillemets littéraux dans la chaîne ` command ` sont représentés par des triples guillemets. Par exemple :
QProcess process;
process.startCommand("dir \"Epic 12\"\"\" Singles\"");Une fois la chaîne « command » fractionnée et débarrassée de ses guillemets, cette fonction se comporte comme la fonction « start() ».
Sur les systèmes d'exploitation où l'API système permettant de transmettre des arguments de ligne de commande à un sous-processus utilise nativement une seule chaîne de caractères (Windows), il est possible de concevoir des lignes de commande qui ne peuvent pas être transmises via l'API portable basée sur une liste de la fonction QProcess. Dans ces rares cas, vous devez utiliser les fonctions setProgram() et setNativeArguments() à la place de cette fonction.
Cette fonction a été introduite dans Qt 6.0.
Voir également splitCommand() et start().
bool QProcess::startDetached(qint64 *pid = nullptr)
Lance le programme défini par ` setProgram()` avec les arguments définis par ` setArguments()` dans un nouveau processus, puis se détache de celui-ci. Renvoie ` true ` en cas de succès ; sinon, renvoie ` false`. Si le processus appelant se termine, le processus détaché continuera à s'exécuter sans être affecté.
Unix : Le processus lancé s’exécutera dans sa propre session et se comportera comme un démon.
Le processus sera lancé dans le répertoire défini par ` setWorkingDirectory()` (). Si ` workingDirectory()` () est vide, le répertoire de travail est hérité du processus appelant.
Si la fonction aboutit, *pid est défini sur l’identifiant du processus lancé ; dans le cas contraire, il est défini sur -1. Notez que le processus fils peut se terminer et que le PID peut devenir invalide sans préavis. De plus, une fois le processus fils terminé, le même PID peut être réutilisé par un processus totalement différent. Le code utilisateur doit faire preuve de prudence lors de l’utilisation de cette variable, en particulier si l’on a l’intention de forcer l’arrêt du processus à l’aide des moyens fournis par le système d’exploitation.
Seuls les accesseurs de propriété suivants sont pris en charge par startDetached() :
- setArguments()
- setCreateProcessArgumentsModifier()
- setNativeArguments()
- setProcessEnvironment()
- setProgram()
- setStandardErrorFile()
- setStandardInputFile()
- setStandardOutputFile()
- setProcessChannelMode(QProcess::MergedChannels)
- setStandardOutputProcess()
- setWorkingDirectory()
Toutes les autres propriétés de l’objet ` QProcess ` sont ignorées.
Remarque : le processus appelé hérite de la fenêtre de console du processus appelant. Pour supprimer la sortie sur la console, redirigez la sortie standard et la sortie d'erreur vers QProcess::nullDevice().
Voir également start() et 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)
Lance le programme program avec les arguments arguments dans un nouveau processus, puis se détache de celui-ci. Renvoie true en cas de succès ; sinon, renvoie false. Si le processus appelant se termine, le processus détaché continuera à s'exécuter sans être affecté.
La gestion des arguments est identique à celle de la surcharge correspondante de start().
Le processus sera lancé dans le répertoire workingDirectory. Si workingDirectory est vide, le répertoire de travail est hérité du processus appelant.
Si la fonction aboutit, *pid est défini sur l'identifiant du processus lancé.
Cette fonction surcharge la fonction QProcess::startDetached().
Voir également start().
[private signal] void QProcess::started()
Ce signal est émis par ` QProcess ` lorsque le processus a démarré, et la fonction ` state()` renvoie ` Running`.
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux, mais ne peut pas être émis par l'utilisateur.
QProcess::ProcessState QProcess::state() const
Renvoie l'état actuel du processus.
Voir également stateChanged() et error().
[private signal] void QProcess::stateChanged(QProcess::ProcessState newState)
Ce signal est émis chaque fois que l'état de « QProcess » change. L'argument « newState » correspond à l'état vers lequel « QProcess » a changé.
Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux, mais ne peut pas être émis par l'utilisateur.
[static] QStringList QProcess::systemEnvironment()
Renvoie l'environnement du processus appelant sous la forme d'une liste de paires clé=valeur. Exemple :
QStringList environment = QProcess::systemEnvironment();
// environment = {"PATH=/usr/bin:/usr/local/bin",
// "USER=greg", "HOME=/home/greg"}Cette fonction ne met pas en cache l'environnement système. Il est donc possible d'obtenir une version mise à jour de l'environnement si des fonctions de bibliothèque C de bas niveau telles que setenv ou putenv ont été appelées.
Notez toutefois que des appels répétés à cette fonction recréeront la liste des variables d’environnement, ce qui constitue une opération non négligeable.
Remarque : pour le code nouveau, il est recommandé d’utiliser QProcessEnvironment::systemEnvironment()
Voir également QProcessEnvironment::systemEnvironment() et setProcessEnvironment().
[slot] void QProcess::terminate()
Tente de mettre fin au processus.
Le processus ne se ferme pas nécessairement à la suite de l'appel de cette fonction (il a la possibilité d'inviter l'utilisateur à enregistrer les fichiers non sauvegardés, etc.).
Sous Windows, la fonction `terminate()` envoie un message `WM_CLOSE` à toutes les fenêtres de niveau supérieur du processus, puis au thread principal du processus lui-même. Sous Unix et macOS, le signal ` SIGTERM ` est envoyé.
Les applications en console sous Windows qui n’exécutent pas de boucle d’événements, ou dont la boucle d’événements ne gère pas le message WM_CLOSE, ne peuvent être arrêtées qu’en appelant la fonction kill().
Voir également kill().
[noexcept, since 6.6] QProcess::UnixProcessParameters QProcess::unixProcessParameters() const
Renvoie l'objet ` UnixProcessParameters ` décrivant les indicateurs et paramètres supplémentaires qui seront appliqués au processus fils sur les systèmes Unix. Les paramètres par défaut correspondent à un objet ` UnixProcessParameters` créé par défaut.
Remarque : cette fonction n'est disponible que sur les plateformes Unix.
Cette fonction a été introduite dans Qt 6.6.
Voir également setUnixProcessParameters() et childProcessModifier().
[override virtual] bool QProcess::waitForBytesWritten(int msecs = 30000)
Réimplémentation de : QIODevice::waitForBytesWritten(int msecs).
bool QProcess::waitForFinished(int msecs = 30000)
Bloque jusqu’à ce que le processus soit terminé et que le signal ` finished()` ait été émis, ou jusqu’à ce que ` msecs ` millisecondes se soient écoulées.
Renvoie true si le processus s’est terminé ; sinon, renvoie false (si l’opération a dépassé le délai d’attente, si une erreur s’est produite ou si cet QProcess est déjà terminé).
Cette fonction peut s’exécuter sans boucle d’événements. Elle est utile lors de l’écriture d’applications non-GUI et lors de l’exécution d’opérations d’E/S dans un thread non-GUI.
Avertissement : l'appel de cette fonction depuis le thread principal (GUI) peut entraîner le gel de votre interface utilisateur.
Si msecs vaut -1, cette fonction n'aura pas de délai d'expiration.
Voir également finished(), waitForStarted(), waitForReadyRead() et waitForBytesWritten().
[override virtual] bool QProcess::waitForReadyRead(int msecs = 30000)
Réimplémentation de : QIODevice::waitForReadyRead(int msecs).
bool QProcess::waitForStarted(int msecs = 30000)
Bloque jusqu’à ce que le processus ait démarré et que le signal ` started()` ait été émis, ou jusqu’à ce que ` msecs ` millisecondes se soient écoulées.
Renvoie true si le processus a démarré avec succès ; sinon, renvoie false (si l'opération a dépassé le délai d'attente ou si une erreur s'est produite). Si le processus avait déjà démarré avec succès avant l'appel de cette fonction, celle-ci se termine immédiatement.
Cette fonction peut fonctionner sans boucle d’événements. Elle est utile lors de l’écriture d’applications non-GUI et lors de l’exécution d’opérations d’E/S dans un thread non-GUI.
Avertissement : l'appel de cette fonction depuis le thread principal (GUI) peut entraîner le gel de votre interface utilisateur.
Si msecs est égal à -1, cette fonction n’expire pas.
Voir également started(), waitForReadyRead(), waitForBytesWritten() et waitForFinished().
QString QProcess::workingDirectory() const
Si un répertoire de travail a été attribué à ` QProcess `, cette fonction renvoie le répertoire de travail dans lequel l'QProcess ra avant le démarrage du programme. Dans le cas contraire (c'est-à-dire si aucun répertoire n'a été attribué), une chaîne vide est renvoyée et ` QProcess ` utilisera alors le répertoire de travail actuel de l'application.
Voir également setWorkingDirectory().
© 2026 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.