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

  1. Qual è il ruolo del semaforo nel programma?
  2. 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`.

  3. Come viene creata la memoria condivisa nel programma?
  4. 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.

  5. Qual è la funzione di `operazioneSignal` nel contesto del semaforo?
  6. 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.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community