Concetti Chiave

  • Il programma gestisce un semaforo e una memoria condivisa utilizzando interfacce di sistema IPC in C.
  • Utilizza funzioni come shmget e shmat per creare e accedere alla memoria condivisa di 64 byte.
  • Implementa la funzione operazioneWait per gestire l'attesa su un semaforo specifico, bloccando il processo se necessario.
  • Il semaforo è identificato da un numero definito, SEM_NUMBER, e il programma verifica la sua apertura con successo.
  • Stampa messaggi che indicano lo stato del semaforo e il contenuto della memoria condivisa quando l'operazione è completata.

#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

Gestione del semaforo

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);

}

Domande da interrogazione

  1. Qual è la funzione principale del programma descritto nel codice?
  2. Il programma gestisce un semaforo e una memoria condivisa, permettendo di sincronizzare l'accesso a risorse condivise tra processi, come indicato nel messaggio di benvenuto e nelle operazioni sul semaforo.

  3. Come viene creata la memoria condivisa nel programma?
  4. La memoria condivisa viene creata utilizzando la funzione `shmget`, che alloca uno spazio di 64 byte, e `shmat`, che attacca la memoria condivisa al processo, come descritto nella funzione `creaMemoriaCondivisa`.

  5. Qual è il ruolo della funzione `operazioneWait` nel contesto del semaforo?
  6. La funzione `operazioneWait` esegue un'operazione di attesa sul semaforo, bloccando il processo fino a quando il semaforo non diventa disponibile, come evidenziato dalla struttura `sembuf` utilizzata per gestire l'operazione.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community