shmat () está devolviendo un "shmaddr" diferente para el mismo "shmkey"
Aquí está mi configuración ...
/* 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: (bifurcará () los procesos "Productor" y "Consumidor")
/* 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);
Productor
/* 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);
Consumidor
/* 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);
Pruebas de error: (en aras de la brevedad ...)
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);
}
Salida
<*> 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
¿Qué está pasando con la dirección de memoria compartida? ¿Cómo los procesos Main y Prod / Cons obtienen diferentes shmaddr cuando se conectan cuando tienen el mismo shmid?
Gracias por adelantado
Z @ K!