mmap array in struct
-
Liebe C/C++ Community,
ich habe eine kleine Frage bezüglich Shared Memory. Ich muss Shared Memory mittels mmap realisieren. Mein Problem ist nun wie folgt: Ich soll folgende Struktur
typedef struct { unsigned int parts; /* Number of slices per axis */ unsigned int size; /* Length of the square of each node */ int generations; /* Number of generations to calculate */ GolNode **subNodes; //.... Synchronization stuff char **playField; } GolData;
in dem Shared Memory abbilden. Wie mache ich das nun? Wenn ich Speicher mittels
GolData *bData; bData = mmap(NULL, sizeof(GolData), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
anfordere bekomme ich wie erwartet Speicher für die Struktur. Nun kann ich aber nicht einfach mit malloc Speicher für die zwei 2D-Arrays anlegen da dieser ja auf dem Heap liegt und wenn ich dann später 2 Prozesse forke würde das ja nicht funktionieren. Es muss also wieder Speicher im Shared Memory angelegt werden wie mache ich das nun am besten?
Bitte um eure Hilfe!!
Vielen Dank,
badhazelnoot
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
sind diese beiden 2D arrays wirklich dynamisch? Oder steht die Größe fest?
Auf jeden fall musst du das shared Memory segment so groß anfordern, dass die komplette struktur samt den beiden 2D Arrays darin platz findet.
Und die zeiger für die beiden Arrays müssen dann halt innerhalb des segmentes zeigen.
-
Hi firefly,
danke für deine Antwort! Aber das was du mir sagst ist mir durchaus bewusst und im Grunde auch mein Problem. Ich weiß eben nicht wie ich das am Besten mache, dass ich die Struktur in das Segment lege und dann noch die beiden Arrays reinlege und dann die Pointer von der Struktur auf die beiden Arrays zeigen lasse. Sicher könnte man das ganze rechnerisch lösen aber das kann es doch auch nicht sein! Oder?
lg
bh
-
Du hast doch nach dem (erfolgreichen) mmap nichts anderes als
die Adresse eines Speicherbereichs. Genau wie in malloc.
Ich würde das über die Größe der arrays (bzw. des structs)
ausrechnen und dann mit Zeigern arbeiten.
-
Shared Memory legt man ja normalerweise an, damit andere Prozesse auch darauf zugreifen können. die Startadresse des Shared Memory Blocks kann aber bei jedem beteiligten Prozeß anders sein, deshalb im Shared Memory nur mit Offsets und nicht mit Pointern arbeiten