Ich versuche, den ursprünglichen mmap()
Systemaufruf auf einer zuvor identifizierten fd durch LD_PRELOAD
zu ersetzen, so dass der aufrufende Prozess ein gemeinsam genutztes Speicherobjekt lesen kann, das zuvor von einem anderen Prozess mit boost::interprocess
erstellt wurde. Alles läuft gut, außer wenn ich endlich versuche, die gespeicherte Erinnerung zu lesen. In diesem Fall bricht der erste Prozess mit einem Segmentierungsfehler ab. Was könnte der Grund sein? Ich brauche keine Schreibrechte für das Shared-Memory-Objekt.
Dies ist der Code in der vorinstallierten Bibliothek:
%Vor%Der Code des Programms, das das Shared-Memory-Objekt erstellt, lautet:
%Vor%Der Code des Programms (welches segfaults) versucht, den gemeinsamen Speicher oben zu lesen, ist:
%Vor% Ihr Problem besteht darin, dass Sie tatsächlich eine Referenz auf eine lokale, aber leicht verschleierte Art und Weise zurückgeben. Ihre Übersteuerung mmap () hat eine interprocess::shared_memory_object
und interprocess::mapped_region
auf dem Stapel, die zerstört werden, wenn Sie zum Client zurückkehren. Während der Zerstörung heben die Boost-Wrapper den Speicherbereich auf, so dass es nicht länger gültig ist, in Ihrem Client-Code darauf zuzugreifen. Eine einfache Lösung wäre es, diese Variablen statisch zu machen, um den Seg-Fehler zu verhindern, obwohl abhängig von der Struktur Ihrer Anwendung eine kompliziertere Lösung erforderlich sein könnte.