Not logged in. · Lost password · Register

lo_pez
Affe mit Süßwaren
Avatar
Member since Jan 2004
62 posts
Subject: 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));
}
"Macht's gut ihr Trottel!" [Homer]
Robert
(Administrator)
Avatar
Member since Nov 2002
559 posts
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  :-D
Ummm, yeah. We couldn't run an ad that said no Portuguese, but ummm... no Portuguese!
frahi
Avatar
Member since Nov 2002
777 posts
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.
lo_pez
Affe mit Süßwaren
Avatar
Member since Jan 2004
62 posts
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...
"Macht's gut ihr Trottel!" [Homer]
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen