Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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.

  • Autor

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).

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...

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() ?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.