![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| Højtstående Programmering Post spørgsmål om C, C + +, Java, SQL, og andre programmerings sprog her. |
Mere UNIX og Linux Forum Emner du måske kan finde Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Last Post |
| [K] Problemer med delt hukommelse | hurricane86 | Højtstående Programmering | 2 | 11-26-2008 05:58 PM |
| Delt hukommelse for delt bibliotek | otheus | Højtstående Programmering | 0 | 09-03-2008 04:55 AM |
| Delt hukommelse i delt bibliotek | DreamWarrior | Højtstående Programmering | 12 | 05-30-2007 05:33 PM |
| hukommelse deling - ikke delt hukommelse -- | elzalem | Højtstående Programmering | 9 | 05-02-2007 08:45 AM |
| Delt hukommelse mangel, men masser af uudnyttet hukommelse | cjcamaro | UNIX for Advanced & Ekspertsøgning Brugere | 1 | 10-13-2004 06:10 PM |
![]() |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
||||
|
Problemer med delt hukommelse og lister
Hej, jeg skal sætte i delt hukommelse en liste lavet med formålet med denne struktur: Code:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object
Jeg har udfyldt min liste med (for eksempel) 10 elementer, men når jeg prøver at sætte det i delt hukommelse, der skal læses af en anden proces, jeg får segmentering fejl efter første læse record .. Jeg har læst i en anden tråd (her -> dynamisk delt hukommelse ) at malloc giver sone problemer med delt hukommelse Citat:
Jeg forsøgte at dele objekt på denne måde: Code:
Obj *head; //pointer to the head of my FILLED list int shmid; Obj *sh; ... shmid = shmget(SHMKEY,(sizeof(Obj)*10),0666|IPC_CREAT|IPC_EXCL); ... sh = (Obj *)shmat(shmid, 0, 0666); ... *sh = *head; sandsynligvis Jeg savner noget, eller måske er jeg helt forkert ... hvordan kan jeg afsætte Obj i delt "i hånden", uden at malloc? Tak for din støtte, best regards. |
|
||||
|
Her er problemet: Det pointers at malloc () opgivelser er lokale til adressen plads i den proces, der kaldes malloc (). Disse værdier vil ikke betyde noget i forbindelse med en anden proces. Dermed sætte disse tal i delt hukommelse og bruge dem fra en anden proces vil påberåbe undefined adfærd. Hvis du er heldig, dit program vil derefter crash. Hvis du ikke er heldig, kan du forårsage en supernova et sted (en smule C humor). Så hvad du skal gøre, er at afsætte en separat del af delt hukommelse, og skriv en "malloc" og "gratis" at benytte sig af denne pulje af hukommelse. Med andre ord, er du nødt til at skrive en lille hukommelse allokator / deallocator, der bruger denne delt hukommelse pool, og derefter går tilbage kompensationskøb fra. Da alle dine objekter er de samme, det vil være temmelig triviel. Meddelelse jeg sagde "kompenserer" og ikke "adresser". Jeg mindes ikke noget sted i noget, jeg har nogensinde har læst, at garantier for, at den delte hukommelse, vil blive tildelt den samme adresse i forskellige processer. Forudsættes det, og ved hjælp af disse værdier i dine lister vil sandsynligvis føre dig tilbage til din oprindelige problem. Så bliver du nødt til at håndtere dette problem på en intelligent måde. Du kan skrive dette for at være almindelige (vil håndtere enhver størrelse allokering) eller specifikke (kun håndterer tingene på din struct Obj type). Uanset hvad er fint, men jeg tror, at udøvelsen af skriftligt den generelle vil lære dig mere. Dette er en forholdsvis nem opgave, men der er nogle ting at holde øje med. Jeg vil give dig to: a) Kun én proces kan initialisere delt hukommelse pool. Start denne proces FOERSTE, initialisere puljen, og start derefter de andre. Ellers vil du potentielt have flere processer smide i papirkurven din pool. b) Hvad sker der, hvis en proces, der er at afsætte noget af denne fælles pool bliver afbrudt i midten af en bevilling, og en anden proces forsøger også at afsætte noget af denne fælles pool. Advarsel: Hvis du gør det forkerte, dårlige ting vil ske, og din mor vil grine på dig. Bemærk, at adgang til den liste kan også føre til den samme slags problemer, fordi der i det almindelige tilfælde behøver du ikke nødvendigvis vide, hvis en anden samarbejdende proces har manipuleret listen. En anden ting: i dit indlæg, du havde: Code:
*sh = *head; Dette er forkert: a) du ikke ønsker at ændre indholdet af SH, og b) du vil hoved til at pege på sh, ikke omvendt. HTH |
|
||||
|
tak for dit svar Jeg løst mit problem på en anden måde .. men jeg vil prøve din løsning for Øvelse gør mester!men der er nogle andre spørgsmål / svar, jeg gerne vil vide: 1) Jeg lo højt på din humor, seriøst xD Jeg er en af dem, der kører væk, hvis nogen kløft ved nul på en regnemaskine (Jeg hader sorte huller); 2) jeg løst mit problem på denne måde: (7 er antallet i genstand for min liste) Code:
Obj *pp, *head;
...
..
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
}
if((sh = (Obj *)shmat(shmid, 0, 0777)) ==(Obj *) -1){
perror("shmat");
exit(1);
}
int a;
pp = head;
for(a=0; a<7; a++){
*(sh+a) = *pp;
pp = pp->next;
}
...
det ser ud til at fungere fint. På den anden "side" jeg læser data på denne måde: Code:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
*p=*(sh+a);
p=p->next;
}
...
Hvad mener du om det? 3) Jeg er lidt rodet sammen med delt hukommelse. Jeg mener, hvad jeg formoder, om hvordan det fungerer, er - (håber du vil forstå min engelsk-for-dukkerne-language-niveau) - som en "kasse", hvor jeg kan lægge ting. Men hvis jeg forsøger at sætte sig inde i et pointer I'll get maaany problemer. Så listen I've putted i (med min metode) er ikke længere opfører sig som en liste, men mere sandsynligt som en """"" strengen """"" (se for "" ).Eksempel: Code:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
nu har jeg en æske lavet af 7 slots på x-dimension. når jeg lægger hukommelse (... shmat ..) X bliver en sand værdi, i mit tilfælde Obj. så har jeg 7 slots af Obj-størrelse hver. når jeg udfylde min boks op, jeg udfylde slots individuelt flytter gennem delt hukommelse med sh + +, og ikke med pointeren til næste obj. er min mening ret? eller helt forkert?! ![]() tak igen
|
|
||||
|
Det er et problem: Code:
Obj *pp, *head; ... pp = head; /* other stuff involving pp, which is wrong because pp was set to an unknown value. */ hoved var aldrig initialiseret. Du skal altid initialisere en pointer, før du bruger det. Det skal enten være NULL (i hvilket tilfælde du ikke dereference det), eller du må sige det til noget. Jeg mener, hvad du skal gøre, er at tegne et billede (en kasse, måske) og dele den op i stykker (så mange som du har genstande) og derefter drage de pile, der repræsenterer pointers. Din kode nedenfor ikke virker, fordi det er korrekt, det fungerer, fordi du er uheldig. |
![]() |
| Bogmærker |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|