malloc in shared memory
-
hallo,
ich steh vor folgendem problem ich hab einen shared memory als array ausstruct shmdata { long id; char text[32]; char* data; };
zusammengebastelt
der zugriff auf id und text funktioniert bei data bekomme ich allerdings probleme.
shm[i].data = "irgendwas" funktioniert noch aber wenn ich versuche einen anderen char* wert abzuspeichern bekommen die anderen anwedungen nur datenmüll bzw. garnix herraus.
Mit sprintf klappts auch nicht.
Ich vermut mal das ich erst speicher allokieren muss aber wie? Mit date = malloc(sizeof(... hat keinen erfolg gebracht.
bin grad ziemlich ratlosgruß
-
Einen Zeiger kannst Du nicht im shared memory speichern, bzw. er zeigt nur in dem Prozess auf was sinnvolles, der den Zeiger angelegt hat. Da musst Du so etwas definieren:
struct shmdata { long id; char text[32]; char data[512]; };
dann kannst Du mit strncpy oder memcpy data füllen. Dynamisch geht hier nicht.
-
und da gibt es keine Möglichkeit den point auf einen Teil im Shared Mem zeigen zulassen?
-
Dein Malloc gibt doch eine Adresse zurück. Darauf kannst du dann id und text[32] addieren und dann hast du doch dein data (?).
-
shm[i].data = (char*)malloc(sizeof(long) + sizeof(char[32]) );
hat nicht funktioniert oder muss ich alles zählen was davor steht?
shm ist als shm* shmdata initalisiert worden.
-
Um auf das shared memory zuzugreifen, musst Du den Speicher in den eigenen Adressraum mappen. Ein Prozess mappt den aber möglicherweise auf eine andere Adresse als ein anderer. Das bedeutet, daß selbst Zeiger in den shared memory keine Gültigkeit in dem anderen Prozess haben. Du könntest aber mit Offsets arbeiten. Du speicherst dann nicht die Adresse sondern den Offset von der Startadresse des shared memory Segmentes. Das gilt dann auch in dem anderen Prozess.
Hier ein Auszug aus der Man-page zu shmat:
Using shmat() with shmaddr equal to NULL is the preferred, portable way of attaching a shared memory segment. Be aware that the shared memory segment attached in this way may be attached at different addresses in different processes. Therefore, any pointers maintained within the shared memory must be made relative (typically to the starting address of the segment), rather than absolute.
Tntnet
-
ok wenn ich das jetzt richtig verstehe dan müsste ich um shm[5].data was reinzuschreiben alle vorherigen (0-5) long, char[32] und char* werte summieren und das ist dann der ziel berich meines neuen data feldes?
-
killerzunge schrieb:
shm[i].data = (char*)malloc(sizeof(long) + sizeof(char[32]) );
hat nicht funktioniert oder muss ich alles zählen was davor steht?
shm ist als shm* shmdata initalisiert worden.Natürlich funktioniert das so nicht, da du mit man: malloc(3) nur Speicher einnerhalb eines Prozesses anlegst, auf den andere Prozesse keinen Zugriff haben.
(übrigens caste den Rückgabewert von malloc nicht!)
Du musst den String also irgend wie in dem Shared Memory ablegen, den du mit shmget angelegt hast.