shared memory



  • kurze frage zu sharedmemory.

    Wenn ich mir nen Block shmem mit bestimmter Größe hole, wird der dann gleich komplett für mich reserviert?

    Folgendes Szenario: Ich hole mir ein Segment von 20MB. Jetzt schreib ich sagen wir 15MB voll. Im Anschluß daran soll ein anderer Prozess einfach den shmem in ein File schreiben (der lädt ihn natürlich vorher auch in seinen Adressraum). Wenn ich jetzt bei dem Schreiben des Files im Textmodus einfach als Größe die 20MB angebe bekomme ich einen segfault. Wieso einen Segfault wenn das doch eigentlich mein Speicher ist? Bestimme ich vorher die Größe, also in diesem Fall 15MB, und schreib dann nur diese 15MB ins File, klappts.

    Ich hab auch vorher mal im schreibenden Prozess alles mit Nullen vollgeschrieben, aber keine Änderung.



  • weissnix schrieb:

    (der lädt ihn natürlich vorher auch in seinen Adressraum)

    Wieso das denn? Der Sinn von Shared Memory ist doch gerade, dass zwei Prozesse auf den gleichen Speicher zugreifen können.

    weissnix schrieb:

    Wenn ich jetzt bei dem Schreiben des Files im Textmodus einfach als Größe die 20MB angebe bekomme ich einen segfault.

    Was meinst du mit "Schreiben im Textmodus" und mit "als Größe die 20MB angebe"? Hier wäre etwas Quelltext hilfreich. 😉
    Bei einem Segmentation Fault vermute ich, dass etwas anderes schief läuft, vielleicht ist das Reservieren von 20MB Shared Memory fehlgeschlagen. Fragst du den Rückgabewert von shmget() und shmat() ab?

    Hier ein Beispiel aus meinem Buch "C und Linux", das funktioniert:

    /*
        sharedmem.c
    */
    
    # include <stdio.h>
    # include <sys/shm.h>
    # include <sys/ipc.h>
    # include <sys/wait.h>
    
    int main()
     {
      int shmem_id;
      char *buffer;
    
      if ((shmem_id = shmget(IPC_PRIVATE, 80,
           SHM_R | SHM_W)) == -1)
       {
        perror("sharedmem: shmget() failed");
        return(1);
       }
      if ((buffer = shmat(shmem_id, 0, 0)) == (char *)-1)
       {
        perror("sharedmem: shmat() failed");
        shmctl(shmem_id, IPC_RMID, 0);
        return(1);
       }
    
      buffer[0] = '\0';	   /* Puffer initialisieren */
    
      if (fork() == 0)
       {				    /* Kind-Prozess */
        sprintf(buffer, "Message from child process");
        shmdt(buffer);
        return(0);
       }
    
      wait(NULL);			  /* Eltern-Prozess */
      printf("Child process wrote into buffer: '%s'\n",
             buffer);
    
      shmdt(buffer);
      shmctl(shmem_id, IPC_RMID, 0);
      return(0);
     }
    

    Martin


Anmelden zum Antworten