Thomas2903 Geschrieben 16. Mai 2011 Geschrieben 16. Mai 2011 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 Zitieren
Guybrush Threepwood Geschrieben 17. Mai 2011 Geschrieben 17. Mai 2011 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. Zitieren
Pointerman Geschrieben 17. Mai 2011 Geschrieben 17. Mai 2011 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. Zitieren
Thomas2903 Geschrieben 17. Mai 2011 Autor Geschrieben 17. Mai 2011 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). Zitieren
frinky Geschrieben 17. Mai 2011 Geschrieben 17. Mai 2011 (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 17. Mai 2011 von frinky Zitieren
metux Geschrieben 8. Januar 2012 Geschrieben 8. Januar 2012 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() ? Zitieren
Empfohlene Beiträge
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.