Salve a tutti. Sto riscontrando alcuni problemi nel momento in cui definisco TEsami *esami perchè ho provato a definirla prima della creazione della memoria ma non andava ed idem anche quando la definisco nel processo figlio. Non so come fare :/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>
/*------------------------------------------
* Struttura dati per rappresentare le
* informazioni sugli esami
*----------------------------------------*/
#define MAX_ESAMI 40
typedef struct {
int numero_esami; /* Numero di esami sostenuti */
int voto[MAX_ESAMI]; /* Voti riportati in ciascun esame sostenuto */
int cfu[MAX_ESAMI]; /* Numero di CFU di ciascun esame sostenuto */
} TEsami;
/*--------------------------------------------
* Calcola la media degli esami sostenuti.
* Parametri di ingresso:
* esami puntatore alla struttura contenente le informazioni
* sugli esami sostenuti
* Valore di ritorno:
* la media dei voti degli esami, o 0 se non ci sono esami sostenuti.
*------------------------------------------*/
double calcola_media(const TEsami *esami) {
assert(esami!=NULL);
int somma_pesata=0;
int somma_cfu=0;
int i;
if (esami->numero_esami<=0)
return 0.0;
for(i=0; i<esami->numero_esami; i++) {
somma_pesata += esami->voto[i]*esami->cfu[i];
somma_cfu += esami->cfu[i];
}
return (double)somma_pesata / somma_cfu;
}
/*---------------------------
* main
*-------------------------*/
int main(int argc, char *argv[]) {
/* Creazione dell'area di memoria */
const int segment_size = MAX_ESAMI * sizeof (int);
int segment_id = shmget (IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR);
if(segment_id < 0) {
printf("Errore in shmget\n");
return -1;
}
pid_t pid = fork (); // la chiamata fork crea un processo figlio
/* Il codice a seguire viene eseguito da entrambi i processi: padre e figlio */
if(pid < 0) {
/* Errore verificato */
printf("Fork non riuscita\n");
shmctl (segment_id, IPC_RMID, NULL); // Deallocazione della memoria
return -1;
} else if(pid == 0){
/* Processo Figlio */
TEsami *esami = (TEsami *) shmat (segment_id, NULL, 0); // Per usare un'area di memoria condivsa, il processo deve collegarla al suo spazio di indirizzamento
int i;
printf ("Inserire il numero di esami sostenuti: ");
scanf ("%d", &esami->numero_esami);
if(esami->numero_esami > MAX_ESAMI) {
return -1;
}
for(i = 0; i < esami->numero_esami; i++) {
printf("Inserire il numero di CFU ed il voto riportato dell'esame %d conseguito: ", esami[i].numero_esami+1);
scanf("%d %d", esami[i].voto, &esami[i].cfu);
}
shmdt(esami); // Quando un processo ha finito di usare un'area di memoria condivisa, deve scollegarla dal suo spazio di indirizzamento
return 0;
} else {
/* Processo Padre */
wait(NULL); // Attende la terminazione del figlio prima di accedere alla memoria
TEsami *esami = (TEsami *) shmat (segment_id, NULL, 0);
int i;
int somma = 0;
for(i = 0; i < esami->numero_esami; i++) {
printf("Voto %d riportato dell'esame %d conseguito: ", esami[i].voto, esami[i].numero_esami+1);
somma+ = esami[i+1].voto;
}
printf(" La media dell'alunno è: %f", calcola_media(somma));
shmdt(esami); // Scollegare l'area di memoria
shmctl(segment_id, IPC_RMID, NULL); // Deallocazione dell'area
return 0;
}
}