Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

hallo!

Ich beschäftige mich mit Systemprogrammierung im Linux und habe folgendes Problem:

Wenn ich eine Shared Memory Segment erzeuge(shmget) und dieses an den Prozess anbinde (shmat), wie kann ich dann nachträglich dieses Segment vergrößern?

Ich erzeuge einen neuen Prozess (fork()), im Child Prozess will ich dann Daten in ein Array einlesen und dieses array dann im Shared Memory Speichern. Das Problem ist, dass ich nicht weiß wieviele Daten ich einlese. Das Shared Memory Segment soll also dynamisch wachsen können, der Vater soll dann Zugriff auf dieses Array haben.

Bei der Umsetzung fehlt mir etwas das Verständnis. Ich habe auch nirgendwo im Internet gefunden, wie ich ein Shared Memory Segment vergrößere...

lg Thomas

Geschrieben

Also ich weiß nicht wie das in dem Fall jetzt genau ist aber wenn du dir bei C++ mit new Speicher holst und diesen dann vergrößern willst musst du dir einen neuen größeren Speicherblock holen und die Daten aus dem alten Block darein kopieren.

Wenn es keine Funktion gibt um deinen Speicherblock zu vergrößern wird es wahrscheinlich genauso sein.

Geschrieben

Moin!

Muss es denn unbedingt ein Array sein? Du koenntest ja auch eine Liste nehmen (musst Du wahrscheinlich selber schreiben), die ihre Bestandteile auf mehrere Shared Memory Segmente verteilt. Dann kannst Du Dir das von Guybrush beschriebene Kopieren sparen.

Geschrieben

Ich muss C (ohne ++) verwenden.

Es muss ein Array sein. Das ist leider die Aufgabenstellung.

Wenn ich meine werte auf den Pointer *shared_memory schreiben und einfach shared_memory immer erhöhe, dann geht mir irgendwann der Shared Memory aus.

Genau hier liegt das Problem. Ich bin im Child Prozess, habe dann irgendwann zu wenig Shared Memory und will diesen vergrößern. Ich könnte über umwegen ein größeres Speichersegment anfordern, den Inhalt des alten rüberkopieren und so den Shared Memory immer Blockweise neu anfordern. Ist ein wenig umständlich das dann wirklich so zu realistieren. Die frage wäre eben, ob es eine shmget oder ähnliche Funktion gibt, wo ich das Speichersegment einfach vergrößere (ähnlich malloc/realloc).

Geschrieben (bearbeitet)
Die frage wäre eben, ob es eine shmget oder ähnliche Funktion gibt, wo ich das Speichersegment einfach vergrößere (ähnlich malloc/realloc).

Gibt es nicht. Du musst es manuell machen, indem Du den Inhalt des aktuellen Shared Memory-Bereichs temporaer in den Heap-Speicher des Prozesses kopierst, den ShMem mit shmdt() unattachest, neuen, groeszeren mit shmget() anforderst, in den Kontext des Prozesses mapst shmat() und bei Erfolg den Inhalt aus dem Heap-Speicher wieder zurueck in den neuen ShMem kopierst.

Bearbeitet von frinky
  • 7 Monate später...
Geschrieben

Warum willst Du überhaupt das veraltete sysv-shm ?

Das ist ein antikes Relikt aus Urzeiten, wo's noch keine (richtigen) MMUs gab.

Wie wärs mit mmap() und mremap() ?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...