Question

J'ai un projet composé de deux processus et j'ai besoin de transmettre des données entre eux de manière rapide et efficace.

Je sais que je pourrais utiliser des sockets pour le faire à l'aide de TCP, même si les deux processus existeront toujours sur le même ordinateur, mais cela ne semble pas être une solution très efficace.

Je vois beaucoup d'informations sur l'utilisation de " tuyaux " sur Linux. Cependant, je le souhaite principalement pour Windows et Linux (de préférence via une bibliothèque multiplate-forme), idéalement dans un coffre-fort, manière non bloquante.

Une autre chose importante est que je dois prendre en charge plusieurs instances de l’application entière (les deux processus), chacune avec sa propre copie indépendante des objets de communication.

Existe-t-il également un moyen multiplateforme de générer un nouveau processus?

Était-ce utile?

La solution

Pour IPC, Windows prend en charge les canaux nommés que fait , sauf que les noms de pipe suivent un format différent, à la différence de formats de chemin entre les deux systèmes d'exploitation. C’est quelque chose que vous pouvez surmonter avec une simple définition du préprocesseur. Les deux systèmes d'exploitation prennent également en charge les entrées / sorties non bloquantes sur les canalisations et le multiplexage des entrées-sorties avec select ().

Autres conseils

Jetez un coup d’œil à Boost.Interprocess

  

Boost.Interprocess simplifie l'utilisation des mécanismes communs de communication et de synchronisation interprocessus et en propose une vaste gamme:

     
      
  • Mémoire partagée.
  •   
  • Fichiers mappés en mémoire.
  •   
  • Sémaphores, mutex, variables de condition et types de mutex pouvant être mis à niveau pour les placer dans la mémoire partagée et dans les fichiers mappés en mémoire.
  •   
  • Versions nommées de ces objets de synchronisation, similaires à l'API semIX-open / CreateSemaphore UNIX / Windows.
  •   
  • Verrouillage du fichier.
  •   
  • pointeurs relatifs.
  •   
  • Files d'attente de messages.
  •   
     

Boost.Interprocess propose également des mécanismes interprocessus de niveau supérieur pour allouer de manière dynamique des parties d'une mémoire partagée ou un fichier mappé en mémoire (en général, pour allouer des parties d'un segment de mémoire de taille fixe). En utilisant ces mécanismes, Boost.Interprocess offre des outils utiles pour construire des objets C ++, y compris des conteneurs de type STL, dans la mémoire partagée et les fichiers mappés en mémoire:

     
      
  • Création dynamique d’objets anonymes et nommés dans une mémoire partagée ou un fichier mappé en mémoire.
  •   
  • Conteneurs de type STL compatibles avec la mémoire partagée / les fichiers mappés en mémoire.
  •   
  • Allocateurs de type STL prêts pour la mémoire partagée / les fichiers mappés en mémoire implémentant plusieurs modèles d'allocation de mémoire (comme le pooling).
  •   
     

Boost.Interprocess a été testé sur les compilateurs / plates-formes suivants:

     
      
  • Visual 7.1 Windows XP
  •   
  • Visual 8.0 Windows XP
  •   
  • GCC 4.1.1 MinGW
  •   
  • GCC 3.4.4 Cygwin
  •   
  • Intel 9.1 Windows XP
  •   
  • GCC 4.1.2 Linux
  •   
  • GCC 3.4.3 Solaris 11
  •   
  • GCC 4.0 MacOs 10.4.1
  •   

Un vieux TCP ordinaire devrait fonctionner assez efficacement; Si je comprends bien, les systèmes d’exploitation modernes détectent le moment où les deux extrémités d’une connexion TCP se trouvent sur le même ordinateur et acheminent ces données en interne via un mécanisme rapide et léger (de type canal) plutôt que via la pile TCP ordinaire.

Donc, si vous avez déjà du code qui fonctionne avec TCP, je vous prie de vous en tenir à cela et d’éviter de passer beaucoup de temps de développement supplémentaire sans trop rapporter.

C’est peut-être excessif, mais vous pouvez utiliser Apache Portable Runtime; ici sont les fonctions de fil et de processus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top