Shared Memory- es will einfach nicht!



  • Hallo miteinander!

    Ich habe ein kleines Problem mit Shared- Memory. Im folgenden Code halte ich mich genau an Tutorials, trotzdem geht irgendwas daneben.

    Sieht hier jemand den Fehler? Ich möchte dem Pointer data Shared Memory der Größe von shared_data_t zuweisen. Der Zugriff auf data läuft aber immer schief.

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <unistd.h>
    
    typedef struct shared_data_s{
    	int x;
    	int y;
    }
    shared_data_t;
    
    int main(int argc,char **argv){
    
    	shared_data_t *data;
    
    	/*Shared Memory
    	 * erzeugen...
    	 */
    	int shmid=shmget(IPC_PRIVATE,sizeof(shared_data_t),IPC_CREAT);
    
    	/*Shared Memory 
    	 * einhängen...
    	 */
    	data= shmat(shmid,NULL,0);	
    
    	data->x=1;
    	printf("%d",data->x);
    
    return 0;	
    }
    

    Kann mir jemand helfen?

    Freundliche Grüße!



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • verwende bitte perror zur ausgabe von fehlermeldungen und prüfe, ob die funktionen ausgeführt wurden.
    das IPC_CREAT brauchst du nicht für IPC_PRIVATE shms. du setzt für das shm keine permissions. damit sind per default keine gesetzt. nicht einmal für den erzeugenden prozess. setz mal welche, und schau, ob das problem immer noch existiert.



  • Hallo guitargod,

    du hast vergessen, dem Shared Memory Segment mitzuteilen, wer welchen Zugriff
    darauf erhält.

    Hier mal ein Ausschnitt aus den Man-Pages:

    int shmget(key_tkey,intsize,intshmflg);
    
           shmflg besteht aus:
    
           IPC_CREAT   für das Erstellen eines neuen Segments.  Wenn  dieses  Flag
                       nicht  belegt wird, sucht shmget() das key zugeordnete Seg‐
                       ment, prüft, ob der Benutzer die nötigen Rechte besitzt, um
                       die  dem  Segment  zugeordnete shmid zu erhalten und stellt
                       sicher, dass das Segment nicht zum Löschen markiert ist.
    
           IPC_EXCL    sorgt im Verbund  mit  IPC_CREAT  für  eine  Fehlermeldung,
                       falls das Segment bereits existiert.
    
           mode_flags (untere 9 Bit)
                       legt  die Rechte für den Eigentümer, die Benutzergruppe und
                       den   Rest   der   Welt   fest.    Zurzeit    werden    die
                       Ausführungsrechte vom System nicht verwendet.
    

    Deine Zeile 23 müßte so aussehen:

    int shmid=shmget(IPC_PRIVATE,sizeof(shared_data_t),IPC_CREAT | 0600);
    

    Gruß mcr



  • Du musst die Zugriffsrechte aufs Segment erweitern:

    /*Shared Memory 
         * erzeugen... 
         */ 
    int shmid=shmget(IPC_PRIVATE,sizeof(shared_data_t),IPC_CREAT | 0666);
    


  • curry-king schrieb:

    Du musst die Zugriffsrechte aufs Segment erweitern:

    /*Shared Memory 
         * erzeugen... 
         */ 
    int shmid=shmget(IPC_PRIVATE,sizeof(shared_data_t),IPC_CREAT | 0666);
    

    aber warum direkt allen zugriff gewähren?!?

    Gruß mcr



  • ich will ja echt nicht behaupten, dass meine antworten immer gut sind, aber liest keiner von euch (mcr, curry-king) die antworten, die schon vorhanden sind? der threadersteller hat dreimal die gleiche antwort bekommen.



  • besserwisser schrieb:

    ich will ja echt nicht behaupten, dass meine antworten immer gut sind, aber liest keiner von euch (mcr, curry-king) die antworten, die schon vorhanden sind? der threadersteller hat dreimal die gleiche antwort bekommen.

    Stimmt, du hast Recht. Ich hatte mir deine Antwort durchgelesen, wollte
    aber dem Threadersteller weitere Hilfe bieten. Daher auch der Auszug aus
    den Man-Pages und ein Beispiel, wie er die Permissions setzt.

    Warum curry-king das selbe noch einmal gepostet hat, kann ich mir auch nicht
    erklären.

    Gruß mcr



  • mcr schrieb:

    Warum curry-king das selbe noch einmal gepostet hat, kann ich mir auch nicht
    erklären.

    Dann will ich dir das große Mysterium mal aufklären.
    Im ANSI C Board ist der Thread als verschoben markiert, die Antwortenzahl
    beträgt dort 0.
    Deswegen habe ich ohne zu gucken auf "Antwort schreiben" geklickt und dann
    so richtig drauf los geschrieben!



  • hmm interessant. vielleicht sollte man das den admin mitteilen, damit das verschieben besser gelöst wird.


Anmelden zum Antworten