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.