Inter process communication zu C++, Beispiele gesucht

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
sirnoname
User
Beiträge: 5
Registriert: Sonntag 24. Februar 2013, 13:10

Hallo Community,

ich bräuchte einen Rat. Ich bin ein noob in python und habe wenig praktische Erfahrung mit den Bibliotheken.
Das Ziel: ich habe ein Script in einem Spiel mit Daten und diese Daten sollen in mein C++ Programm gelangen.
Dazu verwende ich in C++ memory mapped files mit IPC.
Phython bietet hier ebenfalls mmap aber die Beispiele sind verwirrend. Dort MUSS eine Datei auf der Festplatte angelegt werden die dann gemapped wird. Diesen Map kann man dann "anscheinend" als shared memory für IPC hernehmen.
Uns da steigt mein Verständnis leider aus, da ich keine Datei mappen will sondern nur eine globale virtuelle MMF anlegen will.

Kann mir hier jemand weiterhelfen wie man IPC ohne locale Datei durchführt und vor allem: Was für einen Namen hat dieses MMF im globalen Windows Bereich?

Grüße,
SirNoName
BlackJack

@sirnoname: Wie kommst Du darauf das eine Datei existieren auf der Festplatte existieren muss? Man braucht ein Dateihandle, aber zumindest unter Unix ist verdammt vieles eine Datei was nicht auf einem Massenspeicher existieren muss.

(Anonyme) `mmap()`-Objekte *alleine* können allerdings soweit ich das sehe nur zur Kommunikation mit Kindprozessen verwendet werden, und da auch nur innerhalb von Python. Denn Dateihandles sind prozessspezifisch, können also nicht von einem Prozess an einen anderen, unabhängigen weitergegeben werden.

Unter Linux würde ich `shm_open()` und Co verwenden um ein Dateihandle auf einen Speicherbereich mit einem *Namen* zu bekommen und den dann `mmap()`\pen. Entweder über ein Erweiterungsmodul (ich glaube da gibt es eines) oder per `ctypes`. Allerdings scheint das alles ziemlich plattformabhängig zu sein. Zusätzlich gibt es noch die Synchronisationsfrage. Ich würde da wohl einfach IPC über Sockets verwenden solange es nicht *messbare* Gründe dagegen gibt.
sirnoname
User
Beiträge: 5
Registriert: Sonntag 24. Februar 2013, 13:10

Ich komme darauf da beim open Befehl sofort eine Datei erzeugt wird.
Ich verwende dieses Tut:
http://blog.schmichael.com/2011/05/15/s ... sing-mmap/
und dieses Tut:
http://www.codeproject.com/Articles/118 ... -C-Part-II
sirnoname
User
Beiträge: 5
Registriert: Sonntag 24. Februar 2013, 13:10

Leider scheint das embedded python in dem Spiel irgendeinen Hau zu haben.
Wenn ich die mmap importiere geht das.
Wenn ich sie verwende kann das Spiel das Skript nicht mehr laden und mangels debug Output kann ich nicht sagen warum.
Kann man eine Debug Ausgabe per Kommando in eine Datei erzwingen?
BlackJack

@sirnoname: Ja `open()` erzeugt eine Datei. Wenn man einen Pfad angibt, der auf einer Festplatte liegt, dann wird diese Datei auch auf der Festplatte angelegt. Wenn man einen Pfad auf ein Dateisystem anlegt, dass im Speicher liegt, wird keine Datei auf der Festplatte angelegt. Bei meinem System wäre das Beispielsweise unter ``/run/shm/``, wo man solche Dateien anlegen könnte.

Aber wir haben ja von `mmap()` gesprochen, und da muss man ja keine Dateihandles angeben die durch `open()` erstellt wurden. Wie schon gesagt: Unter Linux würde ich `shm_open()` verwenden.

An der Stelle ist die Beschreibung von Shared Memory und MMAP unter Linux von dem zweiten Link den Du gepostet hast übrigens total falsch. Eben weil das Dateihandle für MMAP gar keines von einer Datei auf einer Festplatte sein muss. „Datei” kann in Linux alles mögliche sein, nicht umsonst gibt es den Spruch, unter Unix ist letztendlich fast alles eine Datei. Selbst wenn eine Datei auf einer Festplatte dahinter steht, muss auch nicht alles auf die Platte geschrieben werden. Solange genug Speicher für den Disk-Cache frei ist, können die Daten im RAM bleiben. Wenn dafür nicht genug freier Speicher ist, dann müsste auch unter Windows der geteilte RAM in die Auslagerungsdatei geschrieben werden, und landet dadurch auf der Festplatte.

Wo willst Du eine Debug-Ausgabe erzwingen? Ich würde das `logging`-Modul verwenden und damit in eine Datei loggen. Zur Sicherheit ein ``try``/``except`` um den Hauptcode und im Ausnahmefall die Ausnahme mit ``logging.exception()`` loggen.
sirnoname
User
Beiträge: 5
Registriert: Sonntag 24. Februar 2013, 13:10

Hallo BlackJack,

erstmal Danke für die exakte Erklärung. Bin leider nur Windowsianer, wenngleich sich das mit W8 wohl ändern wird. Auch das Spiel ist ein Windows Spiel und hat phyton als embedded Scipt Sprache integriert. Dabei liegt dann noch ein gepacktes python33, wozu auch immer.
Wo in Windows ein Pfad für memory existiert kann ich nur aus den C++ Beispielen ersehen, vermutlich /Global/irgendwas.

Aber primär muss ich erstmal eine interpreter debug Ausgabe erhalten. Wenn ich Bibliotheken importiere dann klappt dies. Wenn ich z.B. import mmpa falsch schreibe lädt das Spiel das script nicht, wenn ich import mmap schreibe lädt das Script im Spiel. Wenn ich allerdings einer der Befehle von mmap verwende lädt nichts mehr. Dazu möchte ich gerne einen Hinweis was der Interpreter nicht versteht. Kann man das per Flag oder Modul bekommen? Deine Beispiele sind ja eher eine Log Datei und ich vermute das das komplette script nicht geladen und ausgeführt wird weil dort ein Fehler ist.
Das Spiel lädt sich selbst, dann alle Scripte in einem bestimmten Verzeichnis. Source Code vom Spiel liegt nicht vor.

Gruß,
SirNoName
BlackJack

@sirnoname: Das komplette Skript wird nur dann nicht „geladen” wenn es einen Syntaxfehler enthält. Ansonsten ist Python eine sehr dynamische Programmiersprache — ``import``, ``def``, ``class``, und so weiter sind alles ausführbare Anweisungen die zur Laufzeit ausgeführt werden. Ob ein Syntaxfehler enthalten ist, kann man durch importieren heraus finden. Also zum Beispiel durch einen Aufruf des Interpreters auf diese Weise: python3 -c 'import modulname'

Wenn dabei kein `SyntaxError` kommt, dann ist es grundsätzlich ausführbar und man kann nur noch Laufzeitfehler haben. Wenn man den Loggingteil fehlerfrei hinbekommt, kann man diese Laufzeitfehler in eine Datei protokollieren lassen.

Muss es denn unbedingt IPC über Shared Memory sein? Und falls ja, muss es unbedingt mit `mmap` sein? Wenn Du eh auf eine Plattform beschränkt bist, könntest Du doch auch versuchen das zu verwenden was die API von dem System dafür anbietet. Mit `ctypes` kann man fast alles machen was man mit C auch machen könnte. Notfalls schreibt man eine kleine DLL in C und bindet die mit `ctypes` ein.
sirnoname
User
Beiträge: 5
Registriert: Sonntag 24. Februar 2013, 13:10

Das mit dem Syntax nehme ich auch an.
Bevor ich mich in neue Gebiete stürze will ich eine Ausgabe was an meinem Syntax nicht stimmt. Wie kann ich eine solche Fehlermeldung vom Syntax in eine Datei erzwingen? Wo wäre ein Fehlerlog?
BlackJack

@sirnoname: Ob und wo es ein Fehlerprotokoll gibt ist Sache des Spiels würde ich mal sagen. Python selber schreibt so etwas nicht, denn das ist ja kein Dienst oder Anwendung. Ob es einen Syntaxfehler gibt, kann man wie gesagt ganz einfach durch importieren in Python heraus finden. Also nicht in dem Spiel, sondern ganz normal in einem Interpreter, der die passende Version hat.
Antworten