Dynamiczna tablica w pamięci współdzielonej

0

Witam, mam problem z pamięcią współdzielona, a dokladniej nie wiem jak zapisac do pamieci współdzielonej macierz dynamiczna :/

myślałem żeby wyjść od czegos takiego i tworzyć macierz podobnie jak mallociem i na tym stanąłem:

int shId,wiersze,kolumny;
double *adr;

shId = shmget(key, wiersze*sizeof(double*) ,0744 | IPC_CREAT);
if(shId==-1){
        exit(1);
        }

adr=(double**)shmat(shId, NULL, 0);
if(adr== NULL){
        exit(1);
        }

0

A coś takiego:

int shId,wiersze,kolumny;
double *adr;

shId = shmget(key, wiersze*kolumny*sizeof(double) ,0744 | IPC_CREAT);
if(shId==-1){
        exit(1);
        }

adr=(double*)shmat(shId, NULL, 0);
if(adr== NULL){
        exit(1);
        }

i symulowanie 2D w 1D, czyli index = x+kolumny*y

0

No właśnie problem w tym, że tak nie może być :/

0

Why?

Jak sobie wyobrażasz przesłanie macierzy, skoro do segmentu wpisujesz tylko tablicę wskaźników do wierszy tej macierzy? Czuj się, że po drugiej stronie będzie to poprawnie odczytane (AV guaranted).
Jakby taka tablica była zapisana jako jednolity obszar pamięci to OK, ale jej wiersze mogą być wszędzie. Pomijając fakt, że i tak nie alokujesz na nie miejsca :P.
Albo robisz tablicę 1D i symulujesz na niej 2D, albo przed wysłaniem "pakujesz" 2D w 1D i po drugiej stronie rozpakowujesz z powrotem do 2D.
Zabawa z memcpy.

Ja innego rozwiązania nie widzę.

0

ogólnie całość wygląda tak, że mam jeszcze jeden segment w ktorym mam zapisane ilosc wierszy, kolumn, więc drugi program nie będzie mial problemu z wczytaniem o ile można to tak zrobic, myslalem zeby adresowac jakos przy pomocy shmat() i zamiast null podac adres poprzedniej macierzy, ogólnie z tego co słyszałem można to zrobic podobnie jak mallociem (tablica wskazników do wskaźników), ale dokładnie mi koleś nie poweidział jak ;/

0

bardzo prosto - w shmem zapisujesz wiersze macierzy, oraz tablice wskaznikow na nie. tak, wiersze TEZ MUSZA byc w shmemie - przeciez drugi proces tez musi moc je odczytac, no nie? i struktura wyglada tak jak zwykle, wskazniki w tablicy glownej pokazuja na wiersze.

....aale.. racz waszmość zauwazyc, ze proces1 i proces2 maja ODREBNE PRZESTRZENIE ADRESOWE. i kropka. wskazniki z procesu1, nawet jesli w przestrzeni procesu1 pokazuja na wiersze, to ich wartosci po odczytaniu w DRUGIM procesie, beda w jego przestrzeni pokazywac na cos zupelnie innego (*chyba ze bedziesz mial totalny FART/TRICK i segment z wierszami umiesci sie pod tym samym lokalnym adresem co w przestrzeni1..)

co z tym fantem? tu juz nietrywialnie: trzeba znalezc sposob, aby powiedziec procesowi2 gdzie ma szukac wierszy w SWOJEJ PRZESTRZENI.. wskaznikow NIE WOLNO umieszczac na żywca, nalezy je PRZELICZYC na bezpieczne wartosci WSPOLNIE zrozumiale, a potem kazdy z procesow na podstawie tych wartosci ma byc w stanie obliczyc sobie SWOJ adres konkretnej rzeczy..

np: mozna zamiast wartosci wskaznika zapisywac OFFSET wzgledem adresu bloku shmem do wewnatrz ktorego ten wskaznik pokazuje. np: mamy 1 blok shmem. w procesie1 widoczny pod adresem 0x00100000 oraz wskaznik 0x001001FE. zamiast zapisywac wskaznik, wpisujemy roznice: 0x000001FE. teraz, jak sobie proces2 podepnie ten blok pamieci i okaze sie ze w jego przestrzeni blok ten ma adres 0x12345678, to zapisany wskaznik by sie schrzanil.. ale na szczescie zapisano offset = 0x1FE, dzieki czemu proces2 wie ze docelowe miejsce to 0x12345678+0x1fe = 0x12345876. proces numer1 tez moze sie w ten sam sposob dostac do danych - tez widzi wskanzik/offset 0x1fe -- wiec przesunie go o swoj adres bloku i otrzyma pierwotne 0x001001FE..

mam nadzieje ze jest jasne

1 użytkowników online, w tym zalogowanych: 0, gości: 1