Ich brauche zwei verschiedene Programme, um an einem einzigen Datensatz zu arbeiten. Ich habe eine Netzwerk (UDP) Verbindung zwischen ihnen einrichten können, aber ich möchte die Übertragung der gesamten Daten mit allen Mitteln vermeiden.
Es klingt ein wenig absurd, aber ist es möglich, eine Art Zeiger zwischen diesen beiden Programmen zu teilen, so dass, wenn man es aktualisiert, kann der andere einfach den Zeiger bekommen und anfangen, ihn zu benutzen ??
Ich benutze Ubuntu 9.10
Sie sprechen über IPC - Interprocess Communication. Es gibt viele Möglichkeiten.
Eins ist eine Speicherabbilddatei. Es kommt dem nahe, was du beschrieben hast. Es ist aber möglicherweise nicht der optimale Ansatz für Ihre Anforderungen. Lesen Sie auf dem IPC nach, um etwas Tiefe zu bekommen.
Was Sie suchen, wird normalerweise "Shared Memory-Segment" genannt, und wie Sie darauf zugreifen, ist plattformspezifisch.
Auf POSIX-Systemen (die meisten Unix / Linux-Systeme) verwenden Sie die APIs shm _ * () in sys / shm.h.
In Win32 ist dies mit Speicherabbilddateien geschehen, daher verwenden Sie CreateFileMapping () / MapViewOfFile () usw.
Ich bin mir nicht sicher über Macs, aber Sie können wahrscheinlich auch shm _ * () dort verwenden.
Shared Memory kann die höchste verfügbare Bandbreite an IPCs bieten, aber es ist auch ein bisschen mühsam zu verwalten - Sie müssen den Zugriff auf den Shared Memory synchronisieren, genau wie bei Threads. Wenn Sie wirklich diese rohe Bandbreite benötigen, ist es die beste, die es gibt - aber ein Design, das diese Art von Bandbreite benötigt, ist oft eines mit einer schlecht gewählten Trennlinie zwischen den Prozessen, in diesem Fall kann es sein unnötig schwierig sein, damit es gut funktioniert.
Beachten Sie auch, dass Pipes (für ein Beispiel) viel einfacher zu bedienen sind und immer noch eine ziemlich große Bandbreite haben - sie verwenden (normalerweise) immer noch einen vom Kernel zugewiesenen Puffer im Speicher, automatisieren aber den Zugriff darauf. Der Verlust der Bandbreite ist darauf zurückzuführen, dass die automatische Synchronisation einen sehr pessimistischen Sperralgorithmus erfordert. Das verursacht aber immer noch keinen großen Overhead ...
POSIX Shared Memory-Funktionen für Unix-Varianten. IBM Mainframes (370 / xa / esa / Zos) können cross-memory Dienste auf niedriger Ebene nutzen. Sie müssen auch überlegen, ob Ihre App über einen einzelnen Prozessor hinaus skaliert oder nicht.
Vielleicht ist die Verwendung von "memcached" als Broker zwischen Ihren beiden Prozessen möglicherweise besser, dann kann jeder Prozess die Schlüssel untereinander austauschen.
Ihre Beschränkung auf 1024 Kb pro Schlüssel / Wert-Paar oder weniger, aber unmittelbare Vorteile sind Interoperabilität, Stabilität und die zukünftige Fähigkeit, mehrere Prozesse auf mehreren Maschinen miteinander zu verbinden.
Nein, tut mir leid. Ich habe vor langer Zeit von einem experimentellen Betriebssystem gehört, das einen sehr großen Adressraum hatte, wo Teile davon auf einer Maschine und andere Teile auf anderen Maschinen waren. Es hätte genau erlaubt, was du fragst ...
Hinweis: Ich gehe davon aus, dass die 2 Programme auf verschiedenen Rechnern laufen. Wenn es sich einfach um verschiedene Prozesse handelt, können Sie benannte Abschnitte verwenden, um Daten gemeinsam zu nutzen.
Abgesehen von der Tatsache, dass möglich ist , wird Interprozess-Kommunikation niemals durch die gemeinsame Nutzung von Ressourcen - ganz zu schweigen von Speicherbereichen - durchgeführt. Das ist ein richtiges Rezept für eine Katastrophe.
Die richtige IPC wird mit geeigneten Kommunikationsmitteln wie Sockets durchgeführt. Sharing Memory ist nie der Weg zu gehen.
Tags und Links c++ linux pointers ubuntu-9.10