Memory Segment



  • Mahlzeit,
    ich will ein Memory Segment erzeugen. Das klappt auch mit:

    int shmid;
      long key=5556;	// willkuerliche Zahl
      flags *addr;
    
      // shared memory Segment einrichten
      if ((shmid = shmget( key, 1024, 0666|IPC_CREAT)) == -1)
      {
         perror("shmget:");
         exit(EXIT_FAILURE);
      }
    
      // shared memory Segment an Adresse addr binden
      if ((addr = shmat(shmid, (flags *)0, 0)) == NULL)
      {
         perror("shmat:");
         shmctl(shmid, IPC_RMID, NULL);
         exit(-1);
      }
    

    Dammit kann ich denn Speicherbereich dann ipcs sehen. Nur möchte ich jetzttt die ersten und die letzten 512 MB jeweils an einen Prozess anbinden. Wäre jemand so nett und würde mir das mal ebend kurz erläutern.
    Kann ich das dann mit shmget machen? oder shmat? aber wie bestimmte ich dann die Grösse. Natürlich habe ich schon gesucht und auch selber geguckt allerdings bin ich entweder zu doof es rauszuelesen oder es ist nirgendwo beschrieben.



  • Ja, Prost Mahlzeit!!

    Also Du willst "die ersten 512 MB" (512000000 Byte), von was???!!!! Du richtest einen Shared Memory Bereich von 1024 Byte ein, wie ich das seh.

    Was willst Du genau machen? Du willst etwas an einen Prozess anbinden? Redest Du von dem Shared Memory Bereich, den bindest Du mit shmat() an den Prozess (at von attach). Dabei erhaelst Du einen Zeiger auf die Anfangsadresse des Bereiches. Den kannste dann zum schreiben oder lesen benutzen.

    Meine Herren, wenn Du so programmierst wie Du hier schreibst, wage ich zu bezweifeln, dass Du in absehbarer Zeit noch zum eigentlichen Problem in Deinem Programm vordringst vor lauter Syntaxfehler. 😉



  • man 2 shmat schrieb:

    If shmaddr is NULL, the system chooses a suitable (unused) address at which to attach the segment.

    wenn du die ersten 512 mb mit anderen prozessen teilen willst, müsstest du 0 bzw. NULL (was das gleiche ist) für den parameter "shmaddr" bei shmat angeben. und wie man leicht erkennen kann, klappt das nicht. die letzten 512 mb könnten funktionieren, wenn dort nicht etwas anderes schon liegt.
    die größe eines shared memory bereichs ist limitiert. man 2 man: shmget gibt dir informationen über die verschiedenen maxima und wie man sie verändert. im zweifelsfall musst du mehr als einen shared memory bereich verwenden, damit du insgesamt auf 512 mb kommst. bedenke aber immer, dass du nicht genau weißt, wie das layout des adressraums eines programmes aussieht. deshalb ist dein vorhaben gewagt. das feature mit NULL für "shmaddr" macht sogesehen durchaus sinn.

    Fabeltier schrieb:

    Meine Herren, wenn Du so programmierst wie Du hier schreibst, wage ich zu bezweifeln, dass Du in absehbarer Zeit noch zum eigentlichen Problem in Deinem Programm vordringst vor lauter Syntaxfehler.

    willst du deinen ausbruch an freundlichkeit erklären?



  • besserwisser schrieb:

    Fabeltier schrieb:

    Meine Herren, wenn Du so programmierst wie Du hier schreibst, wage ich zu bezweifeln, dass Du in absehbarer Zeit noch zum eigentlichen Problem in Deinem Programm vordringst vor lauter Syntaxfehler.

    willst du deinen ausbruch an freundlichkeit erklären?

    Ja. War ja nicht persoenlich gemeint, wenn das so aufgefasst wurde: sorry! Es is nur eben etwas schwer zu lesen. Vllt ist deutsch ja auch nicht die Muttersprache des OP sondern irgnedeine andere in der man einfach mal drei Konsonanten am Ende eines Wortes aneinander konkatenieren kann, vllt ist ihm ja auch der Hamster ueber die Tastatur gelaufen.. oder es gab tausend andere plausible Erklaerungen um so zu schreiben, wie zB hier:

    Dammit kann ich denn Speicherbereich dann ipcs sehen. Nur möchte ich jetzttt die ersten...

    Ich weiss auch nicht, aber einfach nen Text nochmal zu ueberfliegen, bevor ich auf "absenden" klicke, kann ja auch nich zuviel verlangt sein. Ansonsten faengts ja schon an beim erraten der Frage. 🙄


Log in to reply