shmat() es mar lefoglalt terulet megcimzese

Fórumok

Sewastok!

Adott ket teljesen kulon futo process. Az egyik shmget-tel lefoglal egy adott memoriateruletet, elore ismert, fix azonosito-val, majd shmat-tal a nevterebe csatolja. A masodik process shmget-tel es ugyanazzal a fix kulccsal megkapja a megfelelo azonositot, de az shmat masik memoriacimmel csatolja be a nevterbe az id altal jelolt memoriateruletet.

Mindket esetben NULL pointert adtam meg az shmaddr valtozonak.

Meg csak most ismerkedem a megosztott memoriaterulet hasznalataval, igy a fogalmak lehet, hogy nem pontosak, de szerintem ertheto amit leirtam. Eddig barhol olvastam utana az shmget es shmat fuggvenyhivasoknak, mindenhol azt irtak, hogyha mar letezik a memoriaterulet es az shmget-nel megadott azonosito egyezik, akkor a kulon futo processek el tudjak erni az erintett memoriateruletet. Egyelore Linux kernel-t futtotato rendszereken probaltam csak, de meg nem jott ossze.

Elore is koszonom a hozzaszolasokat.

Hozzászólások

Néhány soros minta:

Létrehozás, egyik processz:
(key_t id egyedi azonosító, size_t size oszotott memória mérete)


int shmid=shmget(id,size, 0666 | IPC_CREAT);
if(shmid<0) { /* Hiba kezelő */ };
char* shmem=shmat(shmid, NULL, 0);
if(shmem==(char*)-1) { /* Hiba kezelő */};

Létező megnyitása, másik processz:
(id egyedi azonosító, size oszotott memória mérete)


int shmid=shmget(id,size, 0666);
if(shmid<0) { /* Hiba kezelő */ };
char* shmem=shmat(shmid, NULL, 0);
if(shmem==(char*)-1) { /* Hiba kezelő */};

A memória címeknek SZVSZ nem kell feltétlenül megegyezniük*. Elég ha az egyik process feltölti valamilyen adattal:


memset(shmem,0x7a,size);

akkor a másik processznek ezt kell "találnia" az adott memória területen, ha jól működik az osztott memória kezelő programrészed.

* Van vagy 10 éve amikor foglalkoztam vele, de úgy rémlik, hogy a szegmens regiszter értéke egy táblázatra mutat, ahol fizikai címre fordítja ezt az értékek a CPU és ehhez képest címzi az offset értékkel.

Szia!

man shmat szerint:

"... If shmaddr is NULL, the system chooses a suitable (unused) address at which to attach the segment.

If shmaddr isn’t NULL and SHM_RND is specified in shmflg, the attach occurs at the address equal to shmaddr rounded down to the nearest multiple of SHMLBA. Otherwise shmaddr must be a page-aligned address at which the attach occurs..."

Alapesetben nem probléma, ha a két processz különböző címen éri el a megosztott memóriát, a visszakapott pointert használva korrektül működnek a programok.

Ha viszont adott címen szeretnéd elérni, akkor második paraméterként adj át egy pointert, ami a kívánt memóriacímre mutat.

Koszonom mindenkinek a hozzaszolast.

Kodolasi hiba miatt nem sikerult kiolvasnom a dolgokat. A main processzben hoztam letre elso korben a memoriateruletet, majd threadekbol akartam feltolteni. Most minden egyes thread csatlakozik a memoriaterulethez es igy a kulso processz mar tudja olvasni.