Shared Memory einhängen

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Shared Memory einhängen
Hi there,

ich versuche mein Shared Memory im Verbraucher einzuhängen und bekomme dabei vom shmget (was ich mache um die ID des Shared Memory rauszukriegen) den Fehler
ENOENT. Angeblich existiert also das Shared Memory nicht.
Ich benutze aber beim Anlegen im Erzeuger genau die gleiche Funktion wie beim
einhängen…den Pfad fürs ftok habe ich in einem Makro definiert…

Irgendjemand eine Idee was ich da verbockt habe?

Lorenz

aus meiner shm.c:

int get_shmid (int shflg) {
	int shmid;
	int size;
	key_t key;

	key = ftok(KEY_PATH, 42);
	size = sizeof(struct admin);

	return(shmget(key, size, shflg)); /* und hier krachts...*/
}

/* vom erzeuger aufgerufen */
int make_shm () { /* funzt problemlos */
	return(get_shmid(0666 | IPC_CREAT | IPC_EXCL));
}

/* vom verbrauc aufgerufen */
struct admin *attach_shm () { /* struct admin ist meine Datenstruktur*/
	int id = get_shmid(0);

	return((struct admin*)shmat(id, NULL, 0));
}

Bin grad unter Windows und kann deswegen nicht in die man von get_shmid schauen, aber du brauchst zum anlegen zuerst

shmget(key, size, flags) [verbraucher hat keine flags!]

und danach kannst du die Adresse die dir shmat(shmid, 0, 0) zurückgibt, als Ringpuffer casten.

PS: In den Folien zur Übung steht eigentlich alles drin, musst du nur abschreiben :smiley:


was ist denn KEY_PATH ? vielleicht gibts da schon ein Problem (Fehlerabfrage fuer ftok waer da net schlecht, da es durchaus vorkommen kann, dass es die datei nicht gibt)

startest du den erzeuger auch wirklich vor dem Verbraucher? andersrum soll ja gerade dieser Fehler kommen, schlieslich forderst du ein shm das es im system eben nicht gibt. Auch dieser Fehler muss abgefangen werden, die Fehlermeldung sollte dem Benutzer darauf hinweisen, dass der Erzeuger zuerst gestartet werden muss und sagen was schief gegangen ist.


KEY_PATH ist ein Makro (wenn das so heisst), was ich über
#define KEY_ PATH “dev/null/” angelegt habe. Den Pfad sollte es also geben. (Zu Testzwecken habe ich auch mal “./erzeuger.c” angegeben - ohne Besserung) In meinem echten Code sind auch mehr Fehlerabfragen drinnen, ich habe die nur der Übersichtlichkeit halber rausgeschmissen.
Und den Erzeuger starte ich schon immer zuerst…