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 

Principal: (se 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); 

Prueba de error: (para mayor 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 es que los procesos Main y Prod / Cons obtienen diferentes shmaddr cuando se unen cuando tienen el mismo shmid?

Gracias por adelantado,

Z @ K!

Hay dos conjuntos de direcciones involucradas. Las “direcciones de Chip Chip”, también conocidas como direcciones de hardware, físicas, reales o de supervisor, comienzan en su primer chip de RAM en 0 y se mueven hacia arriba. Sin embargo, en todos los sistemas operativos de “multitarea real”, cada proceso obtiene su propia “memoria virtual”. La CPU y el sistema operativo colaboran para dar a cada proceso la “ilusión” de que está solo en su propia máquina, con su propio espacio de direcciones, con una tabla (en el kernel y la CPU, según la architecture) asignada desde el “virtual” (por -process) se dirige a las direcciones “real / hardware / supervisor”.

La memoria compartida es un caso especial, donde la misma “memoria real” se dirige desde más de un proceso. Las direcciones virtuales que devuelve “shmat” son locales para cada persona que llama.

Del mismo modo, cuando carga una biblioteca de objetos compartidos (.so), se puede asignar a un espacio de direcciones diferente en cada proceso.

Es perfectamente legal que el mismo segmento de memoria compartida se asigne a diferentes direcciones virtuales en diferentes procesos.

cuando un proceso llama a shmat (), devolverá la dirección virtual de la memoria compartida. dirección virtual es la ubicación de la memoria como se ve en el proceso actual. un proceso diferente puede asignar la memoria compartida a una dirección virtual diferente en el espacio de direcciones del proceso y, por lo tanto, los diferentes valores de retorno de la llamada shmat () para diferentes procesos.

Una bonita descripción pictórica de lo que acabo de decir. http://poshmodule.sourceforge.net/posh/html/node3.html