2009-08-05 6 views
4

Ich habe ein Projekt, das aus zwei Prozessen besteht und ich muss einige Daten schnell und effizient zwischen ihnen austauschen.C++ mehrere Prozesse?

Ich bin mir bewusst, dass ich Sockets verwenden konnte, um dies mithilfe von TCP zu tun, obwohl beide Prozesse immer auf demselben Computer vorhanden sind, jedoch scheint dies keine sehr effiziente Lösung zu sein.

Ich sehe viele Informationen über die Verwendung von "Pipes" unter Linux. Allerdings möchte ich dies primär für Windows und Linux (vorzugsweise über eine plattformübergreifende Bibliothek), idealerweise in einem typensicheren, nicht blockierenden Verfahren.

Eine weitere wichtige Sache ist, dass ich mehrere Instanzen der gesamten Anwendung (d. H. Beide Prozesse) unterstützen muss, jede mit ihrer eigenen unabhängigen Kopie der Kommunikationsobjekte.

Gibt es auch einen plattformübergreifenden Weg, um einen neuen Prozess hervorzubringen?

Antwort

7

Für IPC, Windows supports named pipes genau wie Linux does, mit der Ausnahme, dass die Pipe-Namen aufgrund des unterschiedlichen Pfadformats zwischen den beiden Betriebssystemen einem anderen Format folgen. Dies ist etwas, was Sie mit einfachen Präprozessor-Definitionen überwinden könnten. Beide Betriebssysteme unterstützen auch nicht blockierende IO auf Pipes und IO-Multiplexing mit select().

1

Es mag übertrieben sein, aber Sie könnten die Apache Portable Runtime verwenden; here sind die Thread- und Prozessfunktionen.

12

Werfen Sie einen Blick auf Boost.Interprocess

Boost.Interprocess die Verwendung gemeinsamer Interprozess-Kommunikation und Synchronisationsmechanismen vereinfacht und bietet eine breite Palette von ihnen:

  • Shared Memory.
  • Speicherkarten-Dateien.
  • Semaphore, Mutexe, Zustandsvariablen und aktualisierbare Mutextypen, um sie im gemeinsam genutzten Speicher und im Speicher abzulegen.
  • Benannte Versionen dieser Synchronisationsobjekte, ähnlich UNIX/Windows sem_open/CreateSemaphore API.
  • Dateisperrung.
  • Relative Zeiger.
  • Nachrichtenwarteschlangen.

Boost.Interprocess bietet auch höherer Ebene Inter Mechanismen dynamisch Teile eines gemeinsamen Speichers oder einer Speicherabbilddatei zuzuweisen (im allgemeinen werden Teile mit einer festen Größe Speichersegment zuzuordnen). Mit Hilfe dieser Mechanismen bietet Boost.Interprocess nützliche Werkzeuge C++ Objekte zu konstruieren, einschließlich STL-ähnlichen Behälter, in Shared Memory und Memory-Mapped-Dateien:

  • Dynamische Erstellung von anonymen und benannte Objekte in einem gemeinsam genutzten Speicher oder Speicherabbilddatei .
  • STL-ähnliche Container, die mit Shared Memory/Memory-Mapped-Dateien kompatibel sind.
  • STL-ähnliche Zuweiser bereit für Shared Memory/Memory-Mapped-Dateien implementieren mehrere Speicherzuordnungsmuster (wie Pooling).

Boost.Interprocess wurde in den folgenden Compilern/Plattformen getestet:

  • Visuelle 7.1 Windows XP
  • von 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
+2

boost :: interprocess hat eine Dummy-Implementierung in Windows, die busy-waits für alles verwendet. Ich würde es nicht selbst empfehlen. – bdonlan

2

Plain alten TCP sollte ziemlich effizient arbeiten; Wie ich es verstehe, werden moderne Betriebssysteme erkennen, wenn sich beide Enden einer TCP-Verbindung auf derselben Maschine befinden, und diese Daten intern durch einen schnellen, leichten (rohrartigen) Mechanismus statt durch den normalen TCP-Stapel leiten.

Also, wenn Sie bereits Code haben, der über TCP funktioniert, sage ich, bleiben Sie dabei und vermeiden Sie viel zusätzliche Entwicklungszeit für nicht viel Auszahlung.

+0

Welches OS hat das, was du gesagt hast? Bitte teilen Sie mit mir. – Test

+0

Wenn Linux, ich bin mir sicher, nicht, weil Pakete von tcpdump erfasst werden können, während 2 auf demselben Rechner endet. – Test

+0

Mein Beitrag basiert hauptsächlich auf einer Konversation, die ich mit RobSeace auf der Unix Sockets FAQ Seite hatte, Sie können es hier lesen: http://www.developerweb.net/forum/showthread.php?t=5154 In Insbesondere, dieses Zitat von Rob: "Ja, Unix-Domain-Sockets wäre viel effizienter, umgehen eine Menge der Kernel-TCP/IP-Stack Sachen, die nicht mit lokalen IPC notwendig ist ... (Obwohl, wenn Sie 127.0.0.1, die meisten verwenden Moderne Systeme sollten auch die Loopback-Schnittstelle optimieren ...) " –