The UNIX and Linux Forums  

Go Back   UNIX og Linux Forums > Top Forums > High Level Programmering
.
google unix.com



High Level Programmering Post spørsmål om C, C + +, Java, SQL og andre programmeringsspråk her.

Mer UNIX og Linux Forum Emner Du kan finne nyttig
Tråd Tråd startet Forum Svar Siste innlegg
[C] Problemer med delt minne hurricane86 High Level Programmering 2 11-26-2008 05:58
Delt minne på delt bibliotek otheus High Level Programmering 0 09-03-2008 04:55
Delt minne på delt bibliotek DreamWarrior High Level Programmering 12 05-30-2007 05:33
minne deler - ikke delt minne -- elzalem High Level Programmering 9 05-02-2007 08:45
Delt minne knapphet men mange ubrukte minne cjcamaro UNIX for Advanced & ekspertbrukere 1 10-13-2004 06:10

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øk i denne tråden Rate Thread Visningsmoduser
  #1 (permalink)  
Old 06-28-2009
BeNdErR BeNdErR is offline
Registrert bruker
  
 

Bli Dato: juni 2009
Innlegg: 4
Problemer med delt minne og lister

Hei, jeg trenger å putte i delt minne en liste med objekt av denne strukturen:


Code:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object

Jeg har fylt min liste med (for eksempel) 10 elementer, men når jeg prøver å sette den i delt minne skal leses av en annen prosess jeg får segmentering feil etter første lese posten ..
Jeg har lest i en annen tråd (her -> dynamisk delt minne ) som malloc gir sone problemer med delt minne
Sitat:
Hvis du heter malloc å opprette linked_list_header-> ptr, deretter adressen returneres av malloc er privat til å ringe (prosessen som kaller malloc) prosessen. Samme med NODE-> buffer. Du blir nødt til å bevilge disse tingene i delt "for hånd" uten å kalle malloc.
men jeg forstår ikke hva jeg skal gjøre nå og hvordan du kan løse problemet mitt.

Jeg prøvde å dele gjenstand på denne måten:

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;

trolig jeg savner noe eller kanskje jeg er helt feil ... hvordan kan jeg allocate Obj i delt "for hånd" uten å kalle malloc?

Takk for støtte, Best regards.
  #2 (permalink)  
Old 06-29-2009
mgessner mgessner is offline
Registrert bruker
  
 

Bli Dato: Oct 2007
Innlegg: 50
Her er problemet: det pekere som malloc () returnerer er lokale til adressen plass i prosessen som kalles malloc (). Disse verdiene, vil ikke bety noe i sammenheng med en annen prosess. Derfor setter disse tallene i delt minne og bruker dem fra en annen prosess vil påkalle undefined atferd. Hvis du er heldig, programmet vil da ulykken. Hvis du ikke er heldig, kan forårsake en Supernova sted (litt C humor).

Så hva du må gjøre er å tildele en egen del med delt minne, og skrive en "malloc" og "gratis" bruker denne pool minne. Med andre ord må du skrive et lite minne tildeler / deallocator som bruker denne delt minne pool, og deretter går tilbake forskyvninger fra. Siden alle objektene er de samme, vil dette være ganske triviell.

Innkalling jeg sa "forskyvninger" og ikke "adresser". Jeg kan ikke huske hvor som helst i hva jeg har lest som garanterer at delt minne vil bli tildelt den samme adressen i ulike prosesser. Antar det, og bruker disse verdiene i listene vil sannsynligvis føre deg tilbake til det opprinnelige problemet. Derfor må du håndtere det problemet på en intelligent måte.

Du kan skrive at dette er generelle (håndterer alle størrelser fordeling) eller spesifikke (bare håndterer ting av struct Obj type). Uansett er fin, men jeg tror oppgaven med å skrive den generelle vil lære deg mer.

Dette er en relativt enkel oppgave, men det er noen ting å passe på. Jeg vil gi deg to:

a) Kun en prosess kan initialisere delt minne pool. Start prosessen først initialisere pool, og deretter starte andre. Ellers vil du muligens ha flere prosesser kaste ditt basseng.

b) Hva skjer hvis en prosess som er å fordele noe fra denne delte pool blir forstyrret under midten av en tildeling, og en annen prosess prøver også å bevilge noe fra denne delte pool. ADVARSEL: Hvis du gjør dette feil, Bad Ting vil skje, og din mor vil le av deg. Merk at tilgang til listen kan også føre til samme typer problemer, fordi i det generelle tilfellet du ikke nødvendigvis vet om et annet samarbeider prosessen har manipulert listen.

En annen ting i innlegget ditt, har du hatt:


Code:
*sh = *head;

Dette er feil: a) du ikke vil endre innholdet i sh, og b) du vil bruke hodet til å peke til sh, ikke omvendt.

HTH
  #3 (permalink)  
Old 06-29-2009
BeNdErR BeNdErR is offline
Registrert bruker
  
 

Bli Dato: juni 2009
Innlegg: 4
Thumbs up

thanks for your reply Jeg løste problemet mitt på en annen måte .. men jeg vil prøve løsningen for praksis gjør perfekt!

men det er noen andre spørsmål / svar Jeg vil gjerne vite:

1) Jeg lo høyt på humor, alvor xD Jeg er en av dem som går bort hvis noen dividere med null på en kalkulator (jeg hater svart hull);

2) Jeg løste problemet mitt på denne måten: (7 er nummeret på objektet 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 ut til å fungere fint. På den andre "siden" Jeg leser data på denne måten:

Code:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
		*p=*(sh+a);
		p=p->next;
	}
...

Hva synes du om det?

3) Jeg er litt messed opp med delt minne. Jeg mener, hva jeg anta om hvordan det fungerer, er - (håper du forstår min engelsk for dummies-språk-nivå) - som en "boks" hvor jeg kan plassere ting. Men hvis jeg prøver å sette inn en peker jeg får maaany problemer. Så listen jeg har putted i (med min metode) er ikke lenger oppfører seg som en liste, men mer sannsynlig som et """"" streng """"" (se for "" ).
eksempel:

Code:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
			perror("shmget");
			exit(1);

nå har jeg en boks laget av 7 sporene av x-dimensjonen. Når jeg kobler minne
(... shmat ..) X blir av en sann verdi, i mitt tilfelle Obj. så jeg har 7 sporene av Obj-size hver.
når jeg fylle min boksen opp, jeg fylle spaltene enkeltvis flytte gjennom delt minne med sh + +, og ikke med pekeren til neste obj.

er min mening rett? eller helt feil?


takk igjen
  #4 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registrert bruker
  
 

Bli Dato: Oct 2007
Innlegg: 50
Dette er et problem:

Code:
Obj *pp, *head;
...
pp = head;

/* other stuff involving pp, which is wrong because pp was set to an unknown value. */

hodet var aldri initialisert. Du må alltid initialisere en peker før du bruker det. Det må enten være NULL (da du ikke dereference det), eller du må peke den til noe.

Jeg tror det du trenger å gjøre er å tegne et bilde (en boks, kanskje) og dele det opp i biter (så mange du har objekter) og deretter trekke piler som representerer pekere.

Koden din nedenfor ikke fungerer fordi det er riktig, det virker fordi du er uheldig.
  #5 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Registrert bruker
  
 

Bli Dato: juni 2009
Innlegg: 4
Vent, jeg glemte å si at * hodet er hodet mitt hele listen .. Så jeg har å initialisere hver pekeren minst til nullverdi?
  #6 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registrert bruker
  
 

Bli Dato: Oct 2007
Innlegg: 50
Du angir pp \u003d hode, men du aldri sett hodet til noe i ditt eksempel.
  #7 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Registrert bruker
  
 

Bli Dato: juni 2009
Innlegg: 4
Ja, jeg hadde ikke på grunn av lengden på den delen hvor jeg sett verdien av hodet thougth var bedre bare si at hodet var den peker mot hodet mitt hele listen i stedet for å legge inn kode helt ..
Reply

Hugseliste

Thread Tools Søk i denne tråden
Søk i denne tråden:

Avansert søk
Visningsmoduser Ranger denne tråden
Ranger denne tråden:

Innleggsaktivitet Regler
Du kanskje ikke poste nye tråder
Du kanskje ikke poste svar
Du kanskje ikke post vedlegg
Du kanskje ikke redigere innleggene dine

BB-kode er
Smilefjes er
[IMG] koden
HTML-koden Av
Pingbacks er
Refbacks er




Alle klokkeslett er GMT -4. Nå er klokken 06:01.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant nettadresser av vBSEO 3.2.0