shmat () возвращает другой "shmaddr" для того же " shmkey"
Вот моя установка...
/* Bounded Buffer item structure */
struct item {
int id; /* string index value */
char str[80]; /* string value */
};
/* Structure for the shared memory region */
typedef struct {
int debug; /* debug flag */
int in; /* index of next empty slot */
int out; /* index of next full slot */
char MUTEXname[32]; /* name of the MUTEX semaphore */
char EMPTYname[32]; /* name of the EMPTY semaphore */
char FULLname[32]; /* name of the FULL semaphore */
struct item buff[BUFFSIZE]; /* circular buffer for producer/consumer items*/
char strarray[MAX_STRINGS][80]; /* shared array of strings for consumers */
} shr_mem_t;
/* Values for obtaining a shmid key via ftok() */
#define KEYPATH "."
#define KEYPROJ 4520
Main: (развилит () процессы "производитель" и "потребитель")
/* Use ftok() to get a value for a key to identify a shared memory segment */
shm_key = ftok(KEYPATH, KEYPROJ);
/* Create the shared memory segment */
shmid = shmget(shm_key, sizeof(shr_mem_t), IPC_CREAT | IPC_EXCL | 0660);
/* Attach shared memory segment to the parent process */
shmptr = shmat(shmid, NULL, 0);
Продюсер:
/* Use ftok() to get value for the key to identify the shared memory segment */
shm_key = ftok(KEYPATH, KEYPROJ);
/* Get the ID of the existing shared memory segment */
shmid = shmget(shm_key, sizeof(shr_mem_t), 0660);
/* Attach the shared memory segment */
shmptr = shmat(shmid, NULL, 0);
Потребитель:
/* Use ftok() to get value for the key to identify the shared memory segment */
shm_key = ftok(KEYPATH, KEYPROJ);
/* Get the ID of the existing shared memory segment */
shmid = shmget(shm_key, sizeof(shr_mem_t), 0660);
/* Attach the shared memory segment */
shmptr = shmat(shmid, NULL, 0);
Проверка ошибок: (для краткости...)
if (shmid == -1) {
perror("shmget failed in __________");
exit(1);
} else {
sprintf(errString, "<*> __________ shared memory id: %i ", shmid);
perror(errString);
}
if(shmptr == (void *)(-1)) {
perror("shmat failed in __________");
exit(1);
} else {
sprintf(errString, "<*> __________ attaching to shared memory address: %p ", shmptr);
perror(errString);
}
Вывод:
<*> Main creating shared memory id: 101376 : No such file or directory
<*> Main attaching to shared memory address: 16000 : No such file or directory
Creating the producer and consumer processes...
<*> Producer located shared memory id: 101376 : Successful
<*> Consumer located shared memory id: 101376 : Successful
<*> Producer attaching to shared memory address: 10000 : Successful
<*> Consumer attaching to shared memory address: 10000 : Successful
Что происходит с адресом общей памяти? Как Main и Prod/Cons процессы получают разные shmaddr, когда они присоединяются, когда у них один и тот же shmid?
Заранее спасибо,
Z@K!
3 ответов:
Здесь задействованы два набора адресов. "Адреса ОЗУ чипа", то есть аппаратные, физические, реальные или супервизорные адреса, начинаются с первого чипа ОЗУ в 0 и перемещаются вверх. Однако во всех" истинно многозадачных "операционных системах каждый процесс получает свою собственную "виртуальную память"."Процессор и ОС сотрудничают, чтобы дать каждому процессу "иллюзию", что он один на своей собственной машине, со своим собственным адресным пространством, с таблицей (в ядре и процессоре, в зависимости от архитектуры) отображения из "виртуальные" (для каждого процесса) адреса к" реальным/аппаратным/супервизорным " адресам.
Общая память-это частный случай, когда одна и та же" реальная память " адресуется из нескольких процессов. Виртуальные адреса, которые возвращает "шмат", являются локальными для каждого абонента.
Аналогичным образом, при загрузке библиотеки общих объектов (.so) она может быть отображена в различное адресное пространство в каждом процессе.
Совершенно законно, чтобы один и тот же сегмент общей памяти отображался по разным виртуальным адресам в разных процессах.
Когда процесс вызывает shmat (), он возвращает виртуальный адрес общей памяти. виртуальный адрес-это место в памяти, видимое текущим процессом. различные процессы могут сопоставлять общую память с различными виртуальными адресами. в процессе адресное пространство и, следовательно, различные возвращаемые значения вызова shmat() для различных процессов.
Прекрасное графическое описание того, что я только что сказал выше. http://poshmodule.sourceforge.net/posh/html/node3.html
Comments