begin process at 2013 05 23 19:56:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Linux

 > CLASSE DE GESTION DE PROCESSUS

CLASSE DE GESTION DE PROCESSUS


 Information sur la source

Note :
Aucune note
Catégorie :Applications Linux Classé sous :Gestion, Processus, Unix Niveau :Initié Date de création :20/07/2012 Vu / téléchargé :2 764 / 89

Auteur : CptPingu

Ecrire un message privé
Site perso
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   process
    • main.ccTélécharger ce fichier [Réservé aux membres club]4 884 octets
    • MakefileTélécharger ce fichier [Réservé aux membres club]544 octets
    • Process.ccTélécharger ce fichier [Réservé aux membres club]5 107 octets
    • Process.hhTélécharger ce fichier [Réservé aux membres club]5 320 octets
    • Process.hxxTélécharger ce fichier [Réservé aux membres club]1 183 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip GÉNÉRATEUR DE TEXTES ALÉATOIRES COHÉRENTS (CHAÎNES DE MARKOV...
ALIGNER TEXTE CONSOLE
Source avec Zip Source avec une capture COMPILATEUR DE PSEUDO PASCAL

 Sources de la même categorie

Source avec Zip TRAITEMENT D'IMAGE PGM par Jios
Source avec une capture COLORIMÈTRE NUMÉRIQUE LINUX par valchek
Source avec Zip TRAITEMENTS D'IMAGES AU FORMAT PGM AVEC LES ALGORITHMES DE C... par lemout
Source avec Zip ALGORITHME ACO INTERFACE GTK par RyBeN
Source avec Zip COMPRESSER SES SAUVEGARDES SMSBACKUPRESTORE (ANDROID) EN C A... par ThalLab

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
UNIX : LISTER LE NOMBRE DE PROCESSUS TOURNANT SUR LA MACHINE par jojo930
GESTION DE LE MÉMOIRE UTILISÉE PAR UN PROCESSUS par lilxam
Source avec Zip DAEMON UNIX-LIKE par xtremejames183
Source avec Zip Source avec une capture [C/WIN32] CTRLALTDEL : UN GESTIONNAIRE DE PROCESSUS. par deck_bsd

Commentaires et avis

Commentaire de gillescadiou le 22/07/2012 01:27:40


  Monsieur,

            Je suis tout autant satisfait de trouver sur le site une base de travail et surtout, ce qui est rare, sans faute d'orthographe. Tous travaux conjugués, je pense faire
un logiciel utile , mais dans le monde du libre " GPL, ... "  Je suis souvent perdu dans
ce que les initiés appellent "classes" , qui normalement doivent simplifier les chose, mais
comment et surtout , où trouver ces fameuses classes.  Mon contact : breizh.gilles@gmail.com

Kenavo

 Ajouter un commentaire


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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales