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.
- 1137 megtekintés
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 hozzászóláshoz be kell jelentkezni
Pont igy csinalom en is. Az shmget altal visszaadodd id egyezik mindket processzben, de ha ezzel meghivom a masodik processzben az shmatot, akkor az altala visszaadott kezdo memoriacim mar elter.
- A hozzászóláshoz be kell jelentkezni
> akkor az altala visszaadott kezdo memoriacim mar elter.
Rossz lenne ha egyformák lennének. Pointer helyett tárolj rajta eltolás értéket, és akkor jó lesz.
- A hozzászóláshoz be kell jelentkezni
És hol a probléma? Az egyik processz használja a saját shmat-je által visszaadot címet, a másik pedig a másik (saját) shmat-jét.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
meg kell nézni mások hogy csinálják: http://www.cs.cf.ac.uk/Dave/C/node27.html#SECTION002730000000000000000
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni