Accueil > > > CLASSE DE GESTION DE PROCESSUS
CLASSE DE GESTION DE PROCESSUS
Information sur la source
Description
Une question sur le forum revient très souvent: Comment lancer un processus et récupérer la sortie de celui-ci ? Cette classe est là pour répondre à cette problématique, mais fait aussi bien plus que cela. En effet, grâce à celle-ci vous pourrez: - Lancer un processus et attendre la fin de son exécution. - Lancer un process en parallèle, et possiblité de le "tuer" à tout moment. - Lancer un processus et mettre une limite de temps. - Lancer un processus et récupérer la sortie de celui-ci (récupération dans un flux, qui peut être converti en un std::string, voir directement écrit dans un fichier). Limitation: Système de type Unix uniquement. Techiquement, c'est essentiellement une utilisation de fork, des pipes, et de waitpid.
Source
- #include "Process.hh"
-
- /*!
- ** Exemple d'utilisation de la classe Sys::Process.
- */
-
- namespace
- {
- /*!
- ** Lance un simple "ls -la" et attends la fin de l'execution
- */
- void testLs()
- {
- Sys::Process process;
- process.setExecutable("ls");
- process.addArg("-la");
- process.setWorkingDirectory(".");
-
- std::cout << "Test script shell command: "
- << process.commandLine() << std::endl;
-
- process.run();
- int status = process.wait();
- std::cout << "Finish with status " << status << std::endl;
- }
-
- /*!
- ** Lance une commande de shell script (bash), et attend la fin
- ** de son exécution.
- */
- void testShellScript()
- {
- Sys::Process process;
- process.setExecutable("/bin/bash");
- process.addArg("-c").addArg("ls -laph --color | cat -ne");
- process.setWorkingDirectory(".");
-
- std::cout << "Test script shell command: "
- << process.commandLine() << std::endl;
-
- process.run();
- int status = process.wait();
- std::cout << "Finish with status " << status << std::endl;
- }
-
-
- /*!
- ** On exécute un ls -lph --color, et on met
- ** le résultat de l'exécution du process dans un buffer.
- ** Le buffer peut être un std::ostringstream qui peut ensuite
- ** être convertie en std::string, ou std::ofstream (l'écriture
- ** se fait alors directement dans un fichier).
- */
- void testLsWriteIntoBuffer()
- {
- Sys::Process process;
- process.setExecutable("ls");
- process.addArg("-lph").addArg("--color");
- process.setWorkingDirectory(".");
-
- std::ostringstream buff;
- process.setProcessOutput(buff);
-
- std::cout << "Test script shell command: "
- << process.commandLine() << std::endl;
-
- process.run();
- int status = process.wait();
- std::cout << "Finish with status " << status
- << ", result is: " << buff.str() << std::endl;
- }
-
- /*!
- ** On lance un processus très long (un sleep de 180 secondes).
- ** On attends une seconde, et on tue le processus car celui-ci
- ** met trop de temps à se terminer.
- */
- void testTerminateInfiniteLoop()
- {
- Sys::Process process;
- process.setExecutable("/bin/sh");
- process.addArg("-c").addArg("sleep 180");
-
- std::cout << "Test script shell command: "
- << process.commandLine() << std::endl;
-
- process.run();
- int status;
- process.timedWait(1, status);
- process.terminate();
- std::cout << "Finish with status " << status << std::endl;
- }
-
- /*!
- ** On lance un processus très long (un sleep de 15 secondes).
- ** Toute les 5 secondes on demande à l'utilisateur quoi faire.
- ** Celui-ci peut choisir d'attendre ou de tuer le processus.
- */
- void testTerminateInfiniteLoopWithChoice()
- {
- Sys::Process process;
- process.setExecutable("/bin/sh");
- process.addArg("-c").addArg("sleep 15");
- process.setNiceness(20); // Low priority, not mandatory
-
- std::cout << "Test script shell command: "
- << process.commandLine() << std::endl;
-
- process.run();
-
- int status;
- while (!process.timedWait(5, status))
- {
- std::cout << "The process is not responding\n"
- "1) Kill it\n2) Wait for it" << std::endl;
- int choice;
- std::cin >> choice;
- switch (choice)
- {
- case 1:
- std::cout << "Kill process" << std::endl;
- process.terminate();
- std::cout << "Aborted with status " << status << std::endl;
- return;
- case 2:
- std::cout << "Waiting for process" << std::endl;
- break;
- default:
- std::cout << "Unknow choice, waiting for process" << std::endl;
- }
- }
-
- std::cout << "Finish with status " << status << std::endl;
- }
-
- /*!
- ** On lance un processus très long (un cat de fichier assorti de sleeps
- ** pour ralentir volontairement le processus).
- ** On provoque l'arrêt de la tâche volontairement au bout de 2 secondes.
- ** Le buffer est alors rempli avec ce qui a pu être mis avant la fin du
- ** décompte.
- */
- void testTerminateInfiniteLoopWithOutputInBuffer()
- {
- Sys::Process process;
- process.setExecutable("/bin/sh");
- process.addArg("-c").addArg("for i in $(seq 1 5); do cat *.cc; sleep 1; done");
- process.setNiceness(20); // Low priority, not mandatory
-
- std::ostringstream buff;
- process.setProcessOutput(buff);
-
- std::cout << "Test script shell command: "
- << process.commandLine() << std::endl;
-
- process.run();
- int status = process.timedWait(2, status);
- process.terminate();
- std::cout << "Finish with status " << status << ", buff is: "
- << buff.str() << std::endl;
- }
- } //namespace
-
- int main()
- {
- testLs();
- testLsWriteIntoBuffer();
- testShellScript();
- testTerminateInfiniteLoop();
- testTerminateInfiniteLoopWithChoice();
- testTerminateInfiniteLoopWithOutputInBuffer();
-
- return 0;
- }
#include "Process.hh"
/*!
** Exemple d'utilisation de la classe Sys::Process.
*/
namespace
{
/*!
** Lance un simple "ls -la" et attends la fin de l'execution
*/
void testLs()
{
Sys::Process process;
process.setExecutable("ls");
process.addArg("-la");
process.setWorkingDirectory(".");
std::cout << "Test script shell command: "
<< process.commandLine() << std::endl;
process.run();
int status = process.wait();
std::cout << "Finish with status " << status << std::endl;
}
/*!
** Lance une commande de shell script (bash), et attend la fin
** de son exécution.
*/
void testShellScript()
{
Sys::Process process;
process.setExecutable("/bin/bash");
process.addArg("-c").addArg("ls -laph --color | cat -ne");
process.setWorkingDirectory(".");
std::cout << "Test script shell command: "
<< process.commandLine() << std::endl;
process.run();
int status = process.wait();
std::cout << "Finish with status " << status << std::endl;
}
/*!
** On exécute un ls -lph --color, et on met
** le résultat de l'exécution du process dans un buffer.
** Le buffer peut être un std::ostringstream qui peut ensuite
** être convertie en std::string, ou std::ofstream (l'écriture
** se fait alors directement dans un fichier).
*/
void testLsWriteIntoBuffer()
{
Sys::Process process;
process.setExecutable("ls");
process.addArg("-lph").addArg("--color");
process.setWorkingDirectory(".");
std::ostringstream buff;
process.setProcessOutput(buff);
std::cout << "Test script shell command: "
<< process.commandLine() << std::endl;
process.run();
int status = process.wait();
std::cout << "Finish with status " << status
<< ", result is: " << buff.str() << std::endl;
}
/*!
** On lance un processus très long (un sleep de 180 secondes).
** On attends une seconde, et on tue le processus car celui-ci
** met trop de temps à se terminer.
*/
void testTerminateInfiniteLoop()
{
Sys::Process process;
process.setExecutable("/bin/sh");
process.addArg("-c").addArg("sleep 180");
std::cout << "Test script shell command: "
<< process.commandLine() << std::endl;
process.run();
int status;
process.timedWait(1, status);
process.terminate();
std::cout << "Finish with status " << status << std::endl;
}
/*!
** On lance un processus très long (un sleep de 15 secondes).
** Toute les 5 secondes on demande à l'utilisateur quoi faire.
** Celui-ci peut choisir d'attendre ou de tuer le processus.
*/
void testTerminateInfiniteLoopWithChoice()
{
Sys::Process process;
process.setExecutable("/bin/sh");
process.addArg("-c").addArg("sleep 15");
process.setNiceness(20); // Low priority, not mandatory
std::cout << "Test script shell command: "
<< process.commandLine() << std::endl;
process.run();
int status;
while (!process.timedWait(5, status))
{
std::cout << "The process is not responding\n"
"1) Kill it\n2) Wait for it" << std::endl;
int choice;
std::cin >> choice;
switch (choice)
{
case 1:
std::cout << "Kill process" << std::endl;
process.terminate();
std::cout << "Aborted with status " << status << std::endl;
return;
case 2:
std::cout << "Waiting for process" << std::endl;
break;
default:
std::cout << "Unknow choice, waiting for process" << std::endl;
}
}
std::cout << "Finish with status " << status << std::endl;
}
/*!
** On lance un processus très long (un cat de fichier assorti de sleeps
** pour ralentir volontairement le processus).
** On provoque l'arrêt de la tâche volontairement au bout de 2 secondes.
** Le buffer est alors rempli avec ce qui a pu être mis avant la fin du
** décompte.
*/
void testTerminateInfiniteLoopWithOutputInBuffer()
{
Sys::Process process;
process.setExecutable("/bin/sh");
process.addArg("-c").addArg("for i in $(seq 1 5); do cat *.cc; sleep 1; done");
process.setNiceness(20); // Low priority, not mandatory
std::ostringstream buff;
process.setProcessOutput(buff);
std::cout << "Test script shell command: "
<< process.commandLine() << std::endl;
process.run();
int status = process.timedWait(2, status);
process.terminate();
std::cout << "Finish with status " << status << ", buff is: "
<< buff.str() << std::endl;
}
} //namespace
int main()
{
testLs();
testLsWriteIntoBuffer();
testShellScript();
testTerminateInfiniteLoop();
testTerminateInfiniteLoopWithChoice();
testTerminateInfiniteLoopWithOutputInBuffer();
return 0;
}
Conclusion
Toutes les remarques constructives sont les bienvenues.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
gestion de processus fifo lifo sjf rr en langague c++ [ par maris ]
je cherche une implemejtatiopn en c++ des algorithmes de gestion de processus: fifo, lifo, sjfet roun robinmercie
Attente de la fin d'un processus sous Unix [ par laetitiavincent ]
Bonsoir tout le mondeVoilà je voudrais lancer un processus et attendre qu'il soit fini pour que le programme continue. Sous windows, ca ne me pose pas
Gestion de tâche/processus [ par Sniperr ]
Bonjour,Je suis en train de créer un programme de surveillance me permettant de donner une alerte lorsque le processus "iexplore.exe" est lancé, ou lo
gestion d'un processus des archives [ par omario09 ]
bonjour a tous, bain je suis un débutant en programmation .net et je suis entrain d'effectuer un stage au saint d'une entreprise et mon theme c'est de
utilisation des boites aux lettres sous unix [ par amme88 ]
Bonjour, j'ai un petit problème en programmation si quelqu'un peux m'aider , ben je programme en utilisant java sous UNIX, alors mon problème et le
Gestion de processus [ par larbi84 ]
Bonjour, Mon programme Linux est le suivant : GESTION D'UN CENTRE D'IMPRESSION. En premier lieu, il faut créer un processus père qui à sont tour do
processus sous unix [ par atefensi ]
Je veux vous poser quelque question sur les processus sous unixJ'ai le programme suivantMain(){ int i=0 ;If(fork()==0){i=1 ;Exit(i) ;i=2 ;}Printf("%d"
Gestion et affichage de bitmaps (API Windows). [ par _michel ]
Bonjour à tous,J'ai un problème avec les bitamps:je voudrai conserver en mémoire pendant l'execution de mon programme la "capture d'écran", pour l'aff
|
Derniers Blogs
SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet [ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS.[ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS. par Patrick Guimonet
C'est un point peu mis en avant mais SharePoint 2013 a été l'occasion de remettre de l'ordre dans les modèles de sites. Tout d'abord, un certain nombre de modèles ont été tout simplement rendus obsolètes (cf. Fonctionnalités déco...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
PB PACMAN C++PB PACMAN C++ par garfield95
Cliquez pour lire la suite par garfield95
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|