Concetti Chiave
- Il codice implementa un processo in C che gestisce la memoria condivisa e i semafori per la sincronizzazione.
- Utilizza le funzioni di sistema per creare e accedere a segmenti di memoria condivisa e operare su semafori.
- Definisce costanti per il numero del semaforo e il nome della memoria condivisa, migliorando la leggibilità del codice.
- Richiede all'utente di inserire una stringa che viene memorizzata nella memoria condivisa, dimostrando interazione con l'utente.
- Gestisce gli errori tramite messaggi di errore chiari, assicurando che il processo esca correttamente in caso di problemi.
#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 V 1
int apriSemaforo(int numeroSemaforo);
int operazioneSignal(int id);
char *creaMemoriaCondivisa();
int main()
{
int id;
int retval;
printf ("\nBenvenuti al processo che genera comandi P - 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);
}
char *mem=creaMemoriaCondivisa();
printf ("Inserisci una stringa: ");
fgets(mem,DIM_SHARED_MEMORY,stdin);
operazioneSignal(id);
}
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 operazioneSignal(int id) {
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = V;
operations[0].sem_flg = 0;
/* int semop(int semid, struct sembuf *sops, unsigned nsops); */
return semop(id, operations, 1);
}
Domande da interrogazione
- Qual è il ruolo del semaforo nel programma?
- Come viene creata la memoria condivisa nel programma?
- Qual è la funzione di `operazioneSignal` nel contesto del semaforo?
Il semaforo viene utilizzato per gestire l'accesso alla memoria condivisa, garantendo che solo un processo alla volta possa accedervi, come indicato nella funzione `apriSemaforo`.
La memoria condivisa viene creata tramite la funzione `creaMemoriaCondivisa`, che utilizza `shmget` per ottenere un identificatore di memoria e `shmat` per attaccare la memoria al processo, come descritto nel codice.
La funzione `operazioneSignal` esegue un'operazione di segnale sul semaforo, permettendo ad altri processi di accedere alla memoria condivisa, come evidenziato nella definizione della funzione.