4
votes

Le meilleur moyen en C ++ de lancer un autre processus?

Cela fait un moment que je n'ai pas eu à faire cela et dans le passé, j'ai utilisé "spawn" pour créer des processus.

Je souhaite maintenant lancer des processus depuis mon application de manière asynchrone afin que mon application continue de s'exécuter en arrière-plan et ne soit pas bloquée en lançant le processus.

Je souhaite également pouvoir communiquer avec les processus lancés. Quand je lance le processus, je lui enverrai l'identifiant du processus du lanceur afin que le processus lancé puisse communiquer avec le lanceur en utilisant son pid.

Quelle est la meilleure méthode à utiliser qui n'est spécifique à aucune plateforme / système d'exploitation, je recherche une solution multi-plateforme?

J'écris ceci en C ++, je ne veux pas d'une solution qui me lie à un produit sous licence tiers.

Je ne veux pas utiliser de threads, la solution doit être de créer de nouveaux processus.


13 commentaires

la communication avec pid est-elle nécessaire?


@iyasar, que suggéreriez-vous d'autre, je pensais que puisque le parent connaît son propre pid et peut le transmettre au processus nouvellement lancé, ce serait un moyen simple pour les deux de communiquer.


pourquoi ne pensez-vous pas que std :: thread avec des structures de données simultanées?


@iyasar, car comme je l'ai dit dans l'article, je veux des processus séparés PAS des threads.


Il n'y a pas de moyen standard de créer un processus parmi le système d'exploitation. Vous devez utiliser spawn / exec / fork (ou n'importe quel wrapper autour d'eux) sous unix et je ne sais pas quoi sous Windows.


Boost.Process si vous souhaitez une prise en charge multiplateforme.


@Gojita, je sais qu'il y a plusieurs façons de faire la même chose, ce que je veux, c'est une recommandation de la meilleure façon.


Les demandes d'outils / bibliothèques sont hors sujet ici.


@xaxxon, comment est-ce hors sujet? Le but de ce forum est d'obtenir de l'aide sur un problème de codage logiciel, ce qui est le cas.


La norme C ++ 11 ne connaît pas les processus. Vérifiez en lisant n3337 . Certaines bibliothèques de framework ( Boost , POCO , Qt ...) les connaissent.


C'est littéralement dans la liste des raisons hors sujet.


Avez-vous regardé openMPI?


J'ai téléchargé boost depuis le site web, mais désolé de dire que le téléchargement ne contient rien de prêt à l'emploi, il fait référence à des en-têtes qui n'existent pas dans le téléchargement.


3 Réponses :


2
votes

Essayez Boost.Process .

Boost.Process fournit un cadre flexible pour le langage de programmation C ++ pour gérer les programmes en cours d'exécution, également appelés processus. Il permet aux développeurs C ++ de faire ce que les développeurs Java peuvent faire avec java.lang.Runtime / java.lang.Process et les développeurs .NET peuvent faire avec System.Diagnostics.Process. Entre autres fonctionnalités, cela inclut la capacité de gérer le contexte d'exécution du processus en cours d'exécution, la possibilité de générer de nouveaux processus enfants et un moyen de communiquer avec eux à l'aide de flux C ++ standard et d'E / S asynchrones.

La bibliothèque est conçue de manière à faire abstraction transparente de tous les détails de gestion des processus à l'utilisateur, permettant un développement sans douleur d'applications multiplateformes. Cependant, comme de telles abstractions limitent souvent ce que le développeur peut faire, le framework permet un accès direct aux fonctionnalités spécifiques du système d'exploitation - perdant évidemment les fonctionnalités de portabilité de la bibliothèque.

Exemple de code à exécuter et attendre la fin du processus enfant du site:

bp::child c(bp::search_path("g++"), "main.cpp");

while (c.running())
    do_some_stuff();

c.wait(); //wait for the process to exit   
int result = c.exit_code();


7 commentaires

Je viens de télécharger la dernière version du site Web, ce n'est pas un bon début quand les en-têtes eux-mêmes sont pleins de références de chemin invalides, celles-ci sont assez simples à corriger ... aussi l'espace de noms :: boost ne semble pas être défini. Il y a tellement d'erreurs que je ne sais pas quelle était l'intention.


@SPlatten où (quel site?) Et qu'avez-vous installé (construit à partir de sources / binaires téléchargés / etc) et sur quelle plateforme avez-vous des problèmes?


J'ai cliqué sur le téléchargement du site boost affiché dans votre lien. Je travaille sur un Mac.


@Oliort, cette page semble être une version vieille de 10 ans du code, obsolète depuis longtemps. Pourquoi ne pas créer un lien vers la version mise à jour maintenant qu'elle est officiellement incluse dans Boost?


@SPlatten ce n'est pas "le site boost" cependant. boost.org/doc/libs/release/doc/html/ process.html est la dernière version et fait partie des versions normales de Boost.


Désolé les gars, juste googlé rapidement et collé, ne devrait pas se dépêcher. Modification du lien du commentaire @JonathanWakely.


Alors, où est le lien de téléchargement maintenant? ... Vous l'avez trouvé dl.bintray. com / boostorg / release / 1.69.0 / source



0
votes

Je vais brancher ma propre petite bibliothèque (en-tête unique):

PStreams vous permet d'exécuter un autre programme depuis votre application C ++ et de transférer des données entre les deux programmes similaires pour shell pipelines.

Dans le cas le plus simple, une classe PStreams est comme un wrapper C ++ pour les fonctions POSIX.2 popen (3) et pclose (3), en utilisant C ++ iostreams au lieu de la bibliothèque stdio de C.

La bibliothèque fournit des modèles de classe dans le style des iostreams standard qui peuvent être utilisés avec n'importe quel compilateur ISO C ++ sur une plate-forme POSIX. Les classes utilisent une classe streambuf qui utilise fork (2) et la famille de fonctions exec (2) pour créer un nouveau processus et crée jusqu'à trois tubes pour écrire / lire des données vers / depuis le processus.


2 commentaires

comment "sur une plate-forme posix" convient-il "qui n'est spécifique à aucune plate-forme"?


@xaxxon J'ai manqué cette partie, mais depuis quand "posix" est-il une plateforme spécifique? :-P Il y a un fork de pstreams pour Windows (mais il n'est ni pris en charge ni entretenu).



-1
votes

2 commentaires

Cela échoue à l'exigence "lancer les processus de mon application de manière asynchrone, donc mon application continue de s'exécuter en arrière-plan et ne se bloque pas en lançant le processus" .


std :: system renvoie généralement la valeur renvoyée par le programme appelé, donc il attend que le programme se termine.