nikpez
Ominide
1 min. di lettura
Vota 3 / 5

Concetti Chiave

  • Il programma gestisce la memoria condivisa di 64 byte e l'interazione con i semafori IPC per sincronizzare i processi.
  • Viene creato un semaforo identificato da SEM_NUMBER per controllare l'accesso alla memoria condivisa.
  • La funzione `creaMemoriaCondivisa` viene utilizzata per allocare e collegare la memoria condivisa, restituendo un puntatore per l'accesso.
  • Il processo principale chiede all'utente di inserire una stringa che viene memorizzata nella memoria condivisa.
  • La funzione `operazioneSignal` incrementa il semaforo per segnalare che la memoria condivisa è pronta per l'uso da parte di altri processi.
Scrittura memoria condivisa

#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 e risposte

Hai bisogno di aiuto?
Chiedi alla community