The UNIX and Linux Forums  


Go Back   UNIX og Linux Forums > Top Forums > Højtstående Programmering
.
google unix.com



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

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 06-28-2009
BeNdErR BeNdErR is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 4
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:
Hvis du kaldes malloc at skabe linked_list_header-> ptr, derefter den adresse, der returneres af malloc er private, at den kaldende (den proces, der kræver malloc) proces. Samme med NODE-> buffer. Du bliver nødt til at afsætte disse ting i delt "i hånden", uden at malloc.
men jeg forstår ikke, hvad jeg skal gøre nu, og hvordan man kan løse mit problem.

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.
  #2 (permalink)  
Old 06-29-2009
mgessner mgessner is offline
Registreret Bruger
  
 

Join Date: oktober 2007
Stillinger: 50
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
  #3 (permalink)  
Old 06-29-2009
BeNdErR BeNdErR is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 4
Thumbs up

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
  #4 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registreret Bruger
  
 

Join Date: oktober 2007
Stillinger: 50
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.
  #5 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 4
vent, jeg glemte at sige, at * hoved er leder af hele min liste .. Så jeg har at initialisere hver pointer mindst til NULL værdi?
  #6 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registreret Bruger
  
 

Join Date: oktober 2007
Stillinger: 50
Du angiver pp \u003d hoved, men du aldrig sat hovedet til noget i dit eksempel.
  #7 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Registreret Bruger
  
 

Join Date: Jun 2009
Stillinger: 4
Ja, jeg har ikke på grund af længden af den del, hvor jeg indstille værdien af hovedet thougth var bedre blot sige, at hovedet var pointer til lederen af hele min liste i stedet for at udgive en kode helt ..
Reply

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 02:00 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0