Salve a tutti. Ho alcune perplessità riguardante questo esercizio. Praticamente inserisco i valori dei cateti e non mi restituisce la media ma stampa i messaggi "Errore all'invio" e "Messaggio Incompleto". Grazie mille
/*****************************************************************
Il candidato completi il programma fornito, implementando
il main.
Il programma crea un processo figlio, che chiede all'utente
due numeri reali che rappresentano i cateti di un triangolo rettangolo.
Il processo figlio comunica le informazioni lette al processo padre,
che calcola e stampa l'ipotenusa del triangolo (viene fornita la
funzione calcola_ipotenusa per effettuare il calcolo).
La comunicazione tra processo figlio e processo padre deve avvenire
tramite una pipe. Il programma deve verificare che non ci siano errori
nella comunicazione o messaggi incompleti, stampando un messaggio di
errore qualora una di questa situazioni venisse riscontrata.
******************************************************************/
CODICE:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <unistd.h>
#include <sys/wait.h>
/*--------------------------------------------
* Calcola l'ipotenusa di un triangolo rettangolo
* Parametri di ingresso:
* a,b i due cateti del triangolo
* sugli esami sostenuti
* Valore di ritorno:
* l'ipotenusa del triangolo
*------------------------------------------*/
double calcola_ipotenusa(double a, double b) {
return hypot(a,b);
}
/*---------------------------
* main
*-------------------------*/
int main(int argc, char *argv[]) {
int fd[2];
float a, b;
/* Creazione della pipe */
if(pipe(fd) < 0){
printf("Errore nella creazione pipe\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");
return -1;
} else if(pid == 0) {
/* Processo Figlio */
close(fd[0]); // Non interessato a leggere
/* Preparazione del messaggio */
printf( "Inserisci un cateto: " );
scanf( "%f", &a );
printf( "Inserisci un cateto: " );
scanf( "%f", &b );
int messaggio = calcola_ipotenusa(a,b);
/* Inviare il messaggio */
int inviati = write(fd[1], messaggio, sizeof(messaggio));
if(inviati != sizeof(messaggio)) {
printf("Errore nell'invio\n");
return -1;
}
close(fd[1]);
return 0;
} else {
/* Processo Padre */
close(fd[1]); // Non interessato a scrivere
int ricevuti = read(fd[0], &messaggio, sizeof(messaggio));
if(ricevuti < 0) {
printf("Errore nella ricezione\n");
} else if(ricevuti < sizeof(messaggio)) {
printf("Messaggio incompleto\n");
} else {
printf("Il valore dell'ipotenusa è %f", calcola_ipotenusa(a,b));
}
close(fd[0]);
return 0;
}
}