The UNIX and Linux Forums  


Go Back   A UNIX és Linux Forums > Top Fórumok > Magas szintű Programozás
.
google unix.com



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

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Téma eszközök Keresés a téma Rate Thread Megjelenítési módok
  #1 (permalink)  
Old 06-28-2009
BeNdErR BeNdErR is offline
Regisztrált felhasználó
  
 

Join Date: Jun 2009
Hozzászólások: 4
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:
Ha a hívott malloc létrehozni linked_list_header-> ptr, akkor a cím által visszaadott malloc magántulajdon, hogy a hívó (a folyamat, amely felhívja malloc) folyamat. Ugyanaz a NODE-> buffer. Önnek meg kell osztani ezeket a dolgokat a megosztott "kézzel" anélkül, hogy malloc.
De nem értem, mit kell csinálni, és hogyan lehet megoldani az én problémám.

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.
  #2 (permalink)  
Old 06-29-2009
mgessner mgessner is offline
Regisztrált felhasználó
  
 

Join Date: Oct 2007
Hozzászólások: 50
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
  #3 (permalink)  
Old 06-29-2009
BeNdErR BeNdErR is offline
Regisztrált felhasználó
  
 

Join Date: Jun 2009
Hozzászólások: 4
Thumbs up

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
  #4 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Regisztrált felhasználó
  
 

Join Date: Oct 2007
Hozzászólások: 50
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.
  #5 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Regisztrált felhasználó
  
 

Join Date: Jun 2009
Hozzászólások: 4
várj, elfelejtettem mondani, hogy * fej fej én teljes lista .. Szóval én inicializálásához minden mutató legalább a NULL érték?
  #6 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Regisztrált felhasználó
  
 

Join Date: Oct 2007
Hozzászólások: 50
Beállíthatja pp \u003d fej, de soha nem foglalt feje semmit a példát.
  #7 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Regisztrált felhasználó
  
 

Join Date: Jun 2009
Hozzászólások: 4
Igen, nem, mert a hosszú az a része, ahol meghatározott értéke feje thougth jobb volt, csak azt, hogy a feje volt a mutató, hogy a feje a teljes lista helyett kiküldetésére a kód teljesen ..
Reply

Könyvjelzõk

Téma eszközök Keresés a téma
Keresés a téma:

Részletes keresés
Megjelenítési módok Rate this thread
Rate this thread:

Posting szabályzat
Ön nem post new threads
Ön nem post válaszok
Ön nem post Csatolmányok
Ön nem szerkeszteni az üzeneteidet

BB kód van Be
Smilies vannak Be
[IMG] kód Be
HTML kód Ki
Trackbacks vannak Be
Pingbacks vannak Be
Refbacks vannak Be




Minden idő GMT -4. Az idő most 08:09 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Nyelvre lefordítva Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
A UNIX és Linux Fórum Tartalom Copyright © 1993-2009. Minden jog Reserved.Ad menedzsment RedTyger

Content Relevant URLs by vBSEO 3.2.0