mein 1. projekt mit shared memory



  • Hallo,

    ich möchte eine Art "Server" mittels shared memory realisieren.

    aktueller Zustand:
    Es werden Daten von der seriellen Schnittstelle gelesen und je nach Adresse in eine Datei geschrieben.
    Da ich probleme mit dem Zugriff habe möchte ich alles (vorher Dateien) in einen shared Memory Bereich legen. Nur ein Programm schreibt in den Speicher, alle anderen lesen.

    Nun habe ich das Problem das ich nicht weiß wie ich Tabellen in den Speicher schreiben kann. Muss ich hier etwa immer die Anzahl der Bytes pro "Zeile" weiterzählen.

    Gruß
    worst_case



  • Also ist dein Problem nicht shared memory, sondern die Darstellung von Tabellen im Speicher?

    Naja, eine Tabelle ist doch nichts anderes als ein zweidimensionales Array (Zeilen/Spalten)



  • Hallo,

    rüdiger schrieb:

    Also ist dein Problem nicht shared memory, sondern die Darstellung von Tabellen im Speicher?

    Jein !

    int a(10);
    oder
    int a(10,10);

    ist denke ich, klar.
    Die Anzahl kann ich auch errechnen. int a(10,10) = 10x10x4(Int) benötigen 400 Byte. (Natürlich Sizeof benutzen).
    Nun könnte ich 400 Byte benutzen und pro Array im Shared Memory einen eigenen Schlüssel vergeben. (Hier 123)

    shmid = shmget (123,400,IPC_CREAT|0600);
    

    Somit hätte ich schon mal ein 2(3) dimensionales Array, das ich beliebig erweitern kann.

    Wie kann ich aber im Programm wieder auf das int(2,3) im shared memory zugreifen...........

    shmat
    

    ist klar. Aber ?
    Vielleicht sitze ich auch auf der Leitung ???:D
    Kann gut sein.

    Danke



  • Zunächst mal musst du nach dem shmget() den Shared-Memory-Block an deinen Prozess "anhängen":

    void *shm_addr = shmat(shmid, 0, 0);
    

    Bei einem einfachen Feld kannst du dann der Variablen diese Adresse zuweisen:

    int *feld;
    feld = (int *)shm_addr;
    feld[i] = xyz;
    

    Wie das bei einem 2-dimensionalen Feld geht, muss dir ein ANSI-C-Experte beantworten. 😉



  • Hallo Martin,

    danke für die schnelle Antwort, es war so "Ich saß auf der Leitung".
    Soweit so gut.
    Bei meinem ersten Test stellte ich fest das wenn der "Server" ein shared Memory erzeugt und abstürzt/beendet, dann kann ich weiter mit dem Client auf den Speicher zugreifen. Ich hätte gedacht das sich das shared Memory selbst löscht (nur falls vom Server nicht gelöscht wird).

    Weiß hier jemand mehr ??

    Das nächste: Wenn nun das shared Memory nicht gelöscht wird, und ich den "Server" erneut starte. Wird dann ein komplett neuer Bereich (mit selben Key) eingerichtet oder der noch vorhandene im Speicher benutzt/überschrieben ?? Sonst würde ich ja Speicherlöcher erzeugen.

    Fragen über Fragen 😕

    Danke



  • Solange dein Client den Speicher attached hat, gibt das Betriebssystem den Speicher nicht frei. Das wäre ja sonst fatal. Erst wenn das letzte Programm den Speicher frei gibt, wird er endgültig gelöscht.

    Wenn Du den Server neu startest und er versucht einen Shared-Memory-Bereich einzurichten, der bereits existiert (also mit dem selben Schlüssel), dann kommt es darauf an, welche Flags du übergibst, wie das Programm reagiert. Entweder wird das abgelehnt oder Du bekommst den vorhandenen Speicher (was ja genau das ist, was der Client macht). IPC_CREAT sagt, daß der Speicher angelegt werden soll, wenn er noch nicht existiert.

    Schau Dir einfach mal die man-page zu shmget an.

    Tntnet



  • Hallo,

    ich habe hier nochmals zum Thema shared Memory eine Frage.

    Ich erzeuge mehrere shared-memory mit verschiedenen Schlüsseln.
    Ich schreibe regemäßig ca. alle 20 Sekunden jeweils in einen der Speicherbereiche.
    Ist es nun besser sich die Adresse (ausgabe von shmat) zu merken und solange das Programm läuft immer mit der Adresse zu arbeiten, oder bei jedem schreib/leseversuch mit "shmat" die Adresse neu zu lesen ?

    Geschwindigkeit kann ja mehr oder weniger kein Unterschied sein.

    Mehr so..... weil das oder das eleganter usw. ist.

    Danke
    worst_case



  • Üblicherweise holt man sich die Adresse am Anfang einmalig und gibt sie erst wieder her, wenn das Programm beendet wird.

    Tntnet


Anmelden zum Antworten