Как да модифицирам споделена памет (shmget/shmat) в C?

Имам структура:

struct sdata {
    int x;
    int y;
    time_t time;
};

Създавам споделена памет за структурата, както следва:

size_t shmsize = sizeof(struct sdata);
shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666);

След това влизам в споделената памет по следния начин:

struct sdata *data = shmat(shared.shmid, (void *) 0, 0);
data->time = time(NULL); // function returns the current time

Въпросът ми е доста прост. Това ли е правилният начин за достъп/промяна на споделената памет? Това ли е най-добрият подход?

(Използвам семафори на System V за синхронизация и не съм включил този код. Просто исках да се уверя, че осъществявам достъп/модифицирам споделената памет правилно.)


person bfresh    schedule 01.04.2012    source източник


Отговори (2)


Това е правилно, единственото нещо, което трябва да се отбележи е, че създавате частен споделен сегмент от паметта, което означава, че ще трябва да предадете shmid по някакъв начин на всеки друг процес, който искате да го използвате.

person Chris Dodd    schedule 01.04.2012
comment
Ако другият процес е fork()ed, тогава няма проблем с IPC_PRIVATE, докато споделената памет е създадена преди fork(). Уговорката обаче е валидна в по-общия случай. - person Jonathan Leffler; 01.04.2012

Да, това е начин за създаване, след това достъп или модифициране на тази споделена памет. Възможно е обаче да имате проблеми със синхронизацията и можете да използвате напр. Posix семафори за това. Вижте първата sem_overview(7) страница с ръководство.

person Basile Starynkevitch    schedule 01.04.2012
comment
Благодаря. добре съм със синхронизацията. просто се притеснявах да направя data-›time = time(null); или data-›x = 5 и това обърква нещо. - person bfresh; 01.04.2012