![]() |
|
|
google unix.com
|
|||||||
| Fórumok | Regisztráció | Fórum Szabályok | Linkek | Albumok | GYIK | Tagok listája | Naptár | Keres | Mai hozzászólások | Megjelöl Fórumok Olvas |
| Magas szintű Programozás Post kérdések C, C + +, Java, SQL, és más programozási nyelvek itt. |
Több, UNIX és Linux fórum témák Ön által talált Hasznos
|
||||
| Szál | Thread Starter | Fórum | Válaszok | Utolsó hozzászólás |
| [C] Problémák a megosztott memória | hurricane86 | Magas szintű Programozás | 2 | 11-26-2008 05:58 PM |
| Osztott memória megosztott könyvtár | otheus | Magas szintű Programozás | 0 | 09-03-2008 04:55 AM |
| Osztott memória megosztott könyvtár | DreamWarrior | Magas szintű Programozás | 12 | 05-30-2007 05:33 PM |
| memória megosztása - nem osztott memória -- | elzalem | Magas szintű Programozás | 9 | 05-02-2007 08:45 AM |
| Osztott memória kevés, de sok fel nem használt memória | cjcamaro | A UNIX a fejlett és szakértői Felhasználók | 1 | 10-13-2004 06:10 PM |
![]() |
|
|
LinkBack | Téma eszközök | Keresés a téma | Rate Thread | Megjelenítési módok |
|
|
|
||||
|
Problémák a megosztott memória és a listák
Szia, Szükségem van, hogy a megosztott memória egy listát tett tárgya ez a szerkezet: Kód:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object
Én töltött én listát (például) 10 elemet, de ha megpróbálom, hogy ez az osztott memóriát kell olvasni egy másik folyamat jutok Segmentation fault után olvasni rekord .. Olvastam egy másik téma (itt -> dinamikus osztott memóriát ), hogy adja malloc sone problémák osztott memóriát Idézet:
Próbáltam megosztani tárgy, így: Kód:
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; Valószínűleg Hiányzik valami, vagy talán én vagyok teljesen rossz ... hogyan lehet kiosztani Obj megosztott "kézzel" anélkül, hogy malloc? Köszönöm a támogatást, a legjobb tekintetében. |
|
||||
|
Itt a probléma: a mutatókat, hogy a malloc () visszatér a helyi a címtartomány a folyamat úgy, hogy malloc (). Ezek az értékek nem jelent semmit a másik folyamat. Ezért ezeket a számokat ami a megosztott memória és az azokat használó másik folyamat hivatkozhat undefined magatartását. Ha szerencsés vagy, akkor a program ezután zuhanni. Ha nem szerencsés, akkor okozhat supernova valahol (egy kis humor C). Szóval, mit kell tennie, hogy egy külön darab osztott memóriát, és írjunk egy "malloc" és az "ingyenes", hogy használja, hogy a medence a memória. Más szóval, meg kell írni egy kis memória megszerzési / deallocator hogy használja ezt a megosztott memória medence, majd áthalad vissza a eltolódásokkal. Mivel mind a tárgyak azonos, ez lesz elég triviális. Közlemény mondtam "ellensúly" és a "nem foglalkozik". Nem emlékszem bárhol bármit, amit valaha olvastam, hogy garantálja, hogy az osztott memóriát kap azonos címet a különböző folyamatokat. Feltéve, hogy igen, és használja ezeket az értékeket a listák valószínűleg vezet vissza az eredeti probléma. Szóval meg kell oldani a problémát intelligens módon. Meg tud írni, hogy ez általános (ellátja méretű elosztása) vagy külön (csak kezeli a dolgokat meg struct Obj típus). Akárhogy is rendben van, de azt hiszem a gyakorlására írásban általános tanítalak meg többet. Ez egy viszonylag egyszerű feladat, de van néhány dolog, hogy néz ki. Adok két: a) Csak egyetlen folyamat lehet inicializálni az osztott memóriát medence. Első, hogy a folyamat első, inicializálni a medencében, és indítsa el a többiek. Egyébként, akkor esetleg több folyamatok trashing a strandra. b) Mi történik, ha egy folyamatot, amely felosztási valamit ez a közös medence kap közvetítése során a közepén egy elosztási, és egy másik folyamat is megpróbálja, hogy valamit ebből a közös medence. Figyelem: Ha ezt rossz, rossz dolgok fognak történni, és az anya fogja nevetni magát. Megjegyzendő, hogy hozzáférjen a listán is vezethet, hogy az azonos jellegű problémák, mert az általános esetben, ha nem feltétlenül tudja, ha egy másik együttműködő folyamat manipulálták a listát. Egy másik dolog: a postán, akkor is: Kód:
*sh = *head; Ez a baj: a) nem kívánja megváltoztatni az sh, és b) azt akarjuk, hogy pont a feje sh, és nem fordítva. HTH |
|
||||
|
Köszönöm a válaszát Én megoldani a problémámat más módon .. de megpróbálom a megoldást is gyakorlat teszi a mestert!de van egy másik kérdés / válasz Szeretném tudni: 1) I nevetett hangosan be a humor, komolyan xD én vagyok az egyik ilyen, aki elmenekül, ha valaki a megosztottság nullára számológéppel (I hate fekete lyuk); 2) Azt én megoldódott a probléma ilyen módon: (7 az első számú célja az én lista) Kód:
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;
}
...
úgy tűnik, hogy jól van. A másik "oldalról" Olvastam adatokat a következőképpen: Kód:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
*p=*(sh+a);
p=p->next;
}
...
Mit gondolsz róla? 3) Egy kicsit hírnök megjelöl a megosztott memória. Úgy értem, azt hiszem, mi, hogyan működik is - (remélem, meg fogod érteni az én angol-for-dummies-nyelvi szint) - mint egy "doboz", ahol nem tud a dolgokról. De ha megpróbálom, hogy a belsejében mutató I'll get maaany problémákat. Tehát a lista, amit a putted (az én-módszer) már nem viselkedik, mint egy lista, de több mint valószínű, """"" string """"" (nézni a "" ).Például: Kód:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
Most már egy doboz készült 7 résidőkhöz az X-dimenzió. egyszer csatolni memória (... .. shmat) X lesz az igazi érték, az én esetemben Obj. akkor én már 7 nyílásoknak Obj méretű minden. mikor én fiókomban töltse fel kitölteni résidők egyénileg halad keresztül megosztott memória az sh + +, és nem a mutató a következő obj. a véleményem, ugye? vagy teljesen rossz? ![]() köszönöm
|
|
||||
|
Ez a probléma: Kód:
Obj *pp, *head; ... pp = head; /* other stuff involving pp, which is wrong because pp was set to an unknown value. */ fej soha inicializálva. Meg kell mindig inicializálni a mutatót, mielőtt használjuk. Meg kell vagy lehet NULL (ebben az esetben Önnek nem dereference IT), vagy ha kell mutatnia azt a valamit. Úgy gondolom, hogy mit kell tennie, hogy rajzoljon egy képet (egy doboz, talán), és azt szét kell osztani a darab (több mint Önnek tárgyak), majd levonja a nyilakat, hogy képviselje az észrevételem. Ön az alábbi kód nem működik, mert ez helyes, ez működik, mert szerencsétlen. |
![]() |
| Könyvjelzõk |
| Téma eszközök | Keresés a téma |
| Megjelenítési módok | Rate this thread |
|
|