mmap () mit LD_PRELOAD und boost :: interprocess funktioniert nicht

8

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%     
Martin 08.02.2013, 18:03
quelle

1 Antwort

7

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.

    
jmetcalfe 12.02.2013, 15:41
quelle

Tags und Links