File Mapping
-
Hallo,
ich habe einen Shared Memory bereich für Prozesse im Speicher, jetzt möchte ich einen string genau hinter diese Struktur mappen. So habe ich es versucht funktioniert jedoch nicht ganz:
stat ist ein zeiger auf eine Struktur STRUKTUR *stat).
Und text ein zeiger auf char(char *text).HANDLE hmap=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(stat)*AnzProzesse,"map"); if(hmap==NULL){ printf("SM nicht erstellt, fehlercode %d",GetLastError()); getchar();return 1; } stat=(STATUS*)MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,sizeof(stat)*AnzProzesse); if(stat==NULL){ printf("stat zeigt auf NULL, fehlercode %d",GetLastError()); getchar();return 1; } text=(char*)MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,sizeof(text)); if(text==NULL){ printf("text zeigt auf NULL, fehlercode %d",GetLastError()); getchar();return 1; }
bringt keine Fehler, die Adresse die ich für Text kriege liegt jedoch ganz wo anders. stat startet bei Adresse(0x00030000) und text bei(0x000c0000).
gruß
Ggast
-
...
-
Weil ich das so interpretiert habe, aus tutorials, übungen usw. Ist das etwa nicht so? Es wird immer erklärt das dynamische Variablen hinter den allokierten Speicherbereich angehängt werden sollen, weil man nicht weiß wie groß die Eingabe wird(Benutzer).
Da fällt mir noch auf, es wird ja beim Mapping eine ganze Page(4096kb) reserviert, aber für den String kriege ich keine 4Mbyte. Müsste ich nicht durch das MapViewOfFile den Speicher(4mb), für den String kriegen? Außerdem liegt sie zwischen vielen anderen Strings, also daneben stehen die Strings aus meinem Programm, aus cout, printf usw. Merkwürdig finde ich.
gruß
-
...
-
Eine Page ist 4KB und nicht 4 MB. Und wie groß der Speicherbereich ist, gibst Du ja direkt an! Und ob der Bereich am Anfang oder Ende der Page liegt kannst Du auch nicht wissen.... deshalb darfst Du nur auf den von Dir angegebenen Bereich zugreifen!
-
Meine Frage war eigentlich nur, ob ich den String einfach hinter den, ebenfalls gemappten struct legen kann/könnte. zB durch die Parameter OffsetHigh und OffsetLow der MapViewOfFile() funktion, wie ich erfahren habe.
Die Idee war einfach das ich sicher gehen kann, das die Adressen(Speicher) aufeinnander Folgen, so das der String hinter dem Struct liegt und ihn nicht versehentlich überschreiben kann, falls der String einfach zu groß wird(durch Benutzereingabe).
Aber scheinbar geht das nicht. Dann wäre meine Frage schon beantwortet, mehr wollte ich nicht wissen.
Danke für die Antworten.
-
Interessant ist auch das ich für die struktur immer die gleiche Adresse(0x00030000) bekomme und für den String text immer eine andere.
Ich werde mich da lieber nochmal einlesen.
-
-->Ich habe ein wenig weiter gearbeitet und jetzt passiert genau das was ich vermutet habe. Der String hat eine andere Adresse, aber diese zeigt auf den Anfang des Structs(also 0x00030000) und überschreibt die Ids und den Status eines Prozesses mit dem String, und wenn der Prozess seine ID schreibt überschreibt er wieder den String usw.
Wie kann ich das beheben?
-
Zeig mal was "stat" ist bzw. wie diese Struktur fort definiert ist!
Und zeig uns auch was "text" ist bzw. wie dies definiert ist.Sonst kann man Dir hier nicht helfen....
-
nichts besonderes:
struct STATUS{ int status; int fertig; }; const int AnzProzesse=4; STATUS *stat; char *text; int main(){ // FileMapping(), MapViewOfFile usw. }
der Struct wird multipliziert, mal die Anzahl der Prozesse, so das jeder Prozess sein eigenen bereich hat. *char text gibt es nur einmal, und deshalb sollte er dahinter (hinter dem struct) gemappt werden.
-
Das "text" ist ja nur ein Pointer... Du kannst zwischen verschiedenen Prozessen keine Pointer austauschen.... sondern nur feste Strukturen wie z.B. in der Form:
struct STATUS{ int status; int fertig; char text[500]; };
Dies solltest Du zwischen den Prozessen austauschen, dann geht es...
-
Dann hätte jedoch jeder Prozess einen String in seinem Bereich. Das wäre nicht sinvoll.
Zum Verständnis in meinem Speicher ist die Struktur multipliziert mit den Prozessen und daher Variabel, wenn ich mehrere Prozesse starte vergrößert sich auch der Bereich!
Im speicher sieht es so aus:
Bsp.: 2 Prozesse
Speicher (4096 bytes) (start Adresse 0x00030000)--> stat -> Struct(8byte) stat+1 -> Struct(8byte) (text -> char(dynamisch))soll hier angehängt werden!
Gesamt genutzt 16bytes+text, bei 3 Prozessen 24bytes+text usw...
So habe ich mir das vorgestellt.
Dein Voschlag würde so aussehen:
Speicher (4096 bytes) (start Adresse 0x00030000)--> stat -> Struct(8byte) text -> char(dynamisch)(im struct natürlich, nur zum verständnis) stat+1 -> Struct(8byte) text -> char(dynamisch)
und wenn der Benutzer jetzt zuviel Zeichen eingibt als du annimst, dann überschreibt er den bereich des zweiten Prozesses! Und im int status würde irgendein String stehen, also eine groß interpretierte Zahl.
Und das versuche ich eigentlich zu vermeiden.
-
Ich verstehe nicht ganz was Du machen willst....
Zuerst mal: Jeder Prozess hat einen eigenen Speicherbereich. Durch das FileMapping kannst Du gemeinsame Speicherbereiche definieren... diese sind aber *immer* fix und nie dynamisch!
Das "char text[500]" war mit Absicht "fix"! hier kann man nix dynamisches machen (es gibt noch ATOM, aber das lassen wir mal außen vor)...
Warum willst Du überhaupt einen gemeinsamen Speicherbereich zwischen den Prozessen??? So ganz verstehe ich nicht, was Du willst...
-
@TE
Erkläre doch mal ganz genau was du machen möchtest...dann können wir die Zauberkugel vielleicht finden im Wald. Womöglich gibts dann ne elegantere Lösung.
-
Also wenn es interessiert, ich habe es jetzt hingekriegt:
Ich habe erfahren, ein Pointer geht immer eine Datenstruktur, also um das nächste Element weiter, wenn man ihn um eins erhöht.
Und da mein Pointer ans Ende der Mapping Struktur zeigen soll wäre die Lösung:
text = (char)stat+(sizeof(STATUS)*AnzProzesse);
Diese zeile addiert die Größe der Struktur STATUS(1x int, 2x bool = 6 bytes)* die Anzahl der Prozesse hier 4 also wären das -> 24 bytes.
Das heißt der pointer überspringt 4 strukturen und setzt sein Pointer so ans Ende.Nur der vollständigkeits halber...
-
Versteh immer noch nix...