![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Rules | Lenker | Album | FAQ | Medlemsliste | Kalender | Søke | Dagens innlegg | Marker forumene som lest |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Søk i denne tråden | Rate Thread | Visningsmoduser |
|
|
|
||||
|
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:
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. |
|
||||
|
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 |
|
||||
|
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
|
|
||||
|
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. |
![]() |
| Hugseliste |
| Thread Tools | Søk i denne tråden |
| Visningsmoduser | Ranger denne tråden |
|
|