Shared memory für die Gabel
Möchte ich erstellen, ein shared-memory zwischen zwei Verfahren. Ich verwendet, fork(). Ein Kind versucht, dies zu ändern, shared memory und die Mutter schafft ein anderes Kind so neue Kind versucht zu ändern, gleichen Speicher, so auf. hier ist mein code in C Programmierung. (ubuntu)
mylist ch=NUL;
f=fork();
if(!f){
pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/
ch=(mylist *) shmat(pba,0,0);
ch->name=ugur;
ch->surname=cedric;
...do something...
}
else{
if(ch)
printf("this is top of mylist %s"ch->name);
.......do something
}
Er nie schreibt, ch->Namen. warum? Erstellt habe ich eine shared-memory. Warum übergeordneten Prozess kann nicht Lesen?
InformationsquelleAutor Iguramu | 2009-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für den Speicher freigegeben werden, sowohl der Elternteil und das Kind müssen auf den gleichen gemeinsamen Speicher.
Haben Sie zwei Möglichkeiten, die einfachere und die schwierigere:
Erstellen, und Heften sich an die shared-memory, bevor die Verzweigung. Eltern und Kind haben automatisch Zugriff auf den gleichen shared memory.
Gabel zuerst, und dann beide Eltern und Kind muss anfügen, um die shared-memory-getrennt. Sobald die Prozesse haben, die Gabel, die Sie nicht mehr Speicher freigeben, und insbesondere, etwas zugewiesen, in der das Kind nicht zugänglich ist, in der übergeordneten.
Müssen Sie die Zuweisung von mehr als 1 Charakter des shared memory zu speichern nützlich Zeichenfolgen wie Namen.
InformationsquelleAutor Jonathan Leffler
Haben Sie eine race-condition, was ist, wenn die Eltern läuft, bevor das Kind , und Sie versuchen, Zugriff ch-> bevor das Kind platziert hat, dort etwas ?
Du auch reservieren, nur 1 byte(sizeof(char)), aber Sie versuchen, zu behandeln, die als ein Zeiger auf eine struct - Sie brauchen genügend Raum für die mylist - es sei denn, Sie haben so getan vorzeitig. Sie müssten das flag IPC_CREAT zu shmget ja auch irgendwo.
InformationsquelleAutor nos
wenn der erste run übergeordneten Prozess kann nicht auf die
ch->name
weilch->name=ugur;
nicht laufen noch.Ich empfehle dieses sehen tutorial für shared memory und das pdf-Datei .eine Lösung, die ich denke, bekommen, shared memory, bevor
fork()
und verwenden Sie es in der Kind und Eltern.InformationsquelleAutor Sajad Bahmani
Den Weg, Sie haben Ihren code geschrieben, werde ch auch ein shared-memory, aber ch selbst (also der Zeiger) ist nicht freigegeben. Weil die Zuordnung von ch kommt nur im Kind, den Eltern weiterhin finden Sie ch als NULL.
Haben Sie zwei Möglichkeiten dies zu beheben:
Beim arbeiten mit Datensätzen im shared memory, die Sie benötigen, um sicherzustellen, dass alle Daten für den Datensatz vorhanden ist, in den shared memory. Zum Beispiel in diesem code:
Scheint es, dass mylist::name ist ein char *. Wenn ch Punkte zu einem Datensatz im shared memory, das ist nur gehen, um den Zeiger auf dem Namen in den shared memory. Es sei denn, Sie nehmen bestimmte Schritte, um diese strings in shared memory, Sie wird in regelmäßigen Erinnerung und wird wahrscheinlich nicht zugänglich sein für andere Programme.
InformationsquelleAutor R Samuel Klatchko
Wenn ich erstellen und befestigen Sie den gemeinsam genutzten Speicher vor der Gabelung, dann kann ich nicht überprüfen, ob das shared-memory-NULL ist oder nicht. Es initiiert, während die Befestigung.
InformationsquelleAutor Iguramu
Sie auch verwendet 0 für Ihre flags, die angeben, Dinge wie Zugriffsrechte und wenn die shared-memory-segment erzeugt werden soll. In anderen Worten, Sie didin nicht geben, die selbst lese-oder Schreibzugriff und nicht angegeben haben, für das segment erstellt werden, wenn es noch nicht existiert.
InformationsquelleAutor Maklak