Concetti Chiave
- Il programma legge dati da una memoria condivisa utilizzando semafori per sincronizzare l'accesso.
- La memoria condivisa è definita con una dimensione di 64 byte e viene creata o collegata tramite `shmget` e `shmat`.
- L'accesso alla memoria è controllato da un semaforo identificato da SEM_NUMBER, gestito tramite funzioni come `apriSemaforo` e `operazioneWait`.
- Il processo esegue operazioni di sincronizzazione, come la funzione `operazioneWait`, per garantire l'accesso esclusivo alla memoria condivisa.
- Il programma stampa il PID del processo e il contenuto della memoria condivisa dopo aver acquisito l'accesso.
#include
#include
#include
#include
#include
#include
#define SEM_NUMBER 2012
#define SHARED_MEMORY_NAME 2223
#define DIM_SHARED_MEMORY 64 /* Memoria condivisa da 64 byte */
#define P -1
int apriSemaforo(int numeroSemaforo);
int operazioneWait(int id);
char *creaMemoriaCondivisa();
int main()
{
int id;
printf ("\nBenvenuti al processo che genera comandi V - PID: %d\n",getpid());
/* Ottiene l'ID del semaforo che ha numero esterno SEM_NUMBER.
*/id = apriSemaforo(SEM_NUMBER);
if(id {
fprintf(stderr, "Semaforo non trovato, uscita.\n");
return 1;
} else {
printf ("Semaforo %d aperto\n",id);
}
printf ("Ora il semaforo diventa rosso...\n");
char *mem=creaMemoriaCondivisa();
operazioneWait(id);
printf ("Verde!!\nContenuto memoria condivisa: ");
puts(mem);
return 0;
}
char *creaMemoriaCondivisa() {
int shmid;
char *shm;
if ((shmid = shmget(SHARED_MEMORY_NAME, DIM_SHARED_MEMORY, IPC_CREAT | 0666))
perror("shmget");
return NULL;
}
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
return NULL;
}
return shm;
}
int apriSemaforo(int numeroSemaforo) {
return semget(SEM_NUMBER, 1, 0666);
}
int operazioneWait(int id) {
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = P;
operations[0].sem_flg = 0;
/* int semop(int semid, struct sembuf *sops, unsigned nsops); */
return semop(id, operations, 1);
}