Klasse an externes Programm übergeben zwischen zwei Prozessen

03/10/2013 - 20:02 von Heinz-Mario Frühbeis | Report spam
Ich habe hier eine Libary lib_A mit einer Klasse classA. (In dieser
Klasse richte ich mein Programm ein.)
Dann noch eine Klasse classB.
classB hat ein privates Member für classA.

Dann eine Libary lib_B mit einer Klasse classC. Diese Klasse nehme ich
als SharedMemory.

Nun möchte ich, daß in classC ein Member ist, daß classB aufnehmen kann.
Und classC (als SharedMemory) soll für externe Programme dienen (die per
fork() und execlp() aufgerufen wurden), die dann das Member für classB
als Schnittstelle zu classA nutzen können.

Also quasi:
Externes Programm -> SharedMemory > Member für classB -> classB > Member
für classA

Ist das möglich? Wenn ja, wie?

H-MF
 

Lesen sie die antworten

#1 Marcel Müller
05/10/2013 - 09:05 | Warnen spam
On 03.10.13 20.02, Heinz-Mario Frühbeis wrote:
Ich habe hier eine Libary lib_A mit einer Klasse classA. (In dieser
Klasse richte ich mein Programm ein.)
Dann noch eine Klasse classB.
classB hat ein privates Member für classA.

Dann eine Libary lib_B mit einer Klasse classC. Diese Klasse nehme ich
als SharedMemory.



Du hast es aber gut vor.

Du weißt, dass der C++ Standard keine Kompatibilitàt von binàren
Speicherinhalten vorsieht? Kurzum, wenn die partizipierenden Anwendungen
nicht mit demselben Compiler in derselben Version und auch noch mit
denselben Parametern übersetzt wurden, kann es auf das Übelste knallen.

Nun möchte ich, daß in classC ein Member ist, daß classB aufnehmen kann.
Und classC (als SharedMemory) soll für externe Programme dienen (die per
fork() und execlp() aufgerufen wurden), die dann das Member für classB
als Schnittstelle zu classA nutzen können.



Bei fork() wird der private Speicher kopiert. Die beiden
Programminstanzen arbeiten danach zunàchst mal auf unabhàngigen Kopien
all ihrer Klassen weiter. Das funktioniert zusammen mit C++ sowieso nur
eingeschrànkt, da dabei die Copy-Konstruktoren umgangen werden. Solange
die Klassen keine Verweise auf externe Ressourcen, wie Shared Memory
enthalten, funktioniert es aber meist, weil das faktisch wie ein
Snapshot des laufenden Programms tickt.

Execlp hingegen beendet dein Programm und gibt all seinen Speicher frei.
Shared Memory kann übrig bleiben, wenn er noch anderwàrtig referenziert
wird.

Also quasi:
Externes Programm -> SharedMemory > Member für classB -> classB > Member
für classA

Ist das möglich? Wenn ja, wie?



Es ist unter bestimmten Umstànden möglich. Die Einschrànkungen sind aber
so dramatisch, dass kein Entwickler, der noch halbwegs bei Verstand ist,
sich das freiwillig antut. Zu den Einschrànkungen zàhlen:
- Compiler und Compiler-Optionen müssen übereinstimmen (ODR). Ggf. auch
#defines.
- Alle Klassen im Shared-Memory dürfen nur Referenzen auf Klassen
enthalten, deren Instanzen ebenfalls im Shared Memory liegen.
Damit sind die allermeisten Klassen aus der C++ Runtime raus. Sie dürfen
nicht als Member vorkommen.
- Die Klassen dürfen keinen statischen Member haben, da man die nicht in
einem bestimmten Shared-Memory-Segment platzieren kann - ich wüsste
zumindest nicht wie.
- Nicht nur Klassen, sondern alle Pointer dürfen nur auf Shared Memory
verweisen. Und das gilt rekursiv.
- Alle anderen Datentypen müssen PODs sein.
- Das gilt auch für die compilerinternen Datenstrukturen. Die
RTTI-Informationen, allen voran die VTables müssen ebenfalls im Shared
Memory liegen. Das kann klappen, wenn sie in einem Read-Only Segment
gelandet sind und zweimal /dasselbe/ Programm im Speicher làuft.
Sicherheitsfeatures wie ASLR könnten einem aber betràchtlich in die
Suppe spucken. Wenn nicht heute dann morgen beim nàchsten Kernel-Update.
Ein unterschiedliches Binary aus denselben Sourcen für die Klassen im
Shared-Memory aber sonst anderen Sourcen wàre bereits inkompatibel.
- Faktisch bedeutet die letzte Einschrànkung, dass nur nicht-polymorphe
Klassen, also solche ohne jede virtuelle Methode und damit ohne RTTI,
funktionieren.
Kurzum, das macht man nur, wenn es absolut nicht anders geht und wenn
man sehr genau weiß, was man tut.

Man tut gut daran, Shared Memory eher als Datei in einer RAM-Disk als
als Speicher zu betrachten. Niemand würde auf die Idee kommen, eine
Klasse einfach so in eine Datei zu schreiben. Man würde sie immer
/serialisieren/.

Wirf mal einen Blick auf
http://www.boost.org/doc/libs/1_47_...esses.html
speziell den Abschnitt "Limitations When Constructing Objects In Mapped
Regions".


Marcel

Ähnliche fragen