[C] Processo pipe
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:

/*****************************************************************
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; } }
Risposte
Non compila nemmeno il tuo programma.
aa.c:67:37: error: ‘messaggio’ undeclared (first use in this function) 67 | int ricevuti = read(fd[0], &messaggio, sizeof(messaggio)); | ^~~~~~~~~
Ho corretto il 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]; int cateto[2]; /* 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 */ int i; for(i=0; i<2; i++) { printf("Inserisci il %d cateto: ", i); scanf("%d", &cateto[i]); } /* Inviare il messaggio */ int inviati1 = write(fd[1], &cateto[0], cateto[0]*sizeof(int)); int inviati2 = write(fd[1], &cateto[1], cateto[1]*sizeof(int)); if(inviati1+inviati2 != sizeof(cateto)) { printf("Errore nell'invio\n"); return -1; } close(fd[1]); return 0; } else { /* Processo Padre */ close(fd[1]); // Non interessato a scrivere int cateto[2]; int ricevuti = read(fd[0], &cateto, sizeof(cateto)); if(ricevuti < 0) { printf("Errore nella ricezione\n"); } else if(ricevuti < sizeof(cateto)) { printf("Messaggio incompleto\n"); } else { printf("Numeri ricevuti"); int i; for(i=0; i<2; i++) { printf("%d", cateto[i]); printf("\n"); } printf("Il valore dell'ipotenusa è %f", calcola_ipotenusa(cateto[0], cateto[1])); } close(fd[0]); return 0; } }
Non si capisce il perche' di
return hypot(a,b);
quando hypot non e' definita.
Questo ???
int inviati1 = write(fd[1], &cateto[0], cateto[0]*sizeof(int));
return hypot(a,b);
quando hypot non e' definita.
Questo ???
int inviati1 = write(fd[1], &cateto[0], cateto[0]*sizeof(int));
La funzione dell'ipotenusa mi è già stata data. Mentre per inviati non serve che metta come dimensione anche il primo cateto?
Comunque sono riuscito a farlo funzionare mi da i risultati corretti
"giacomovicinanza":
La funzione dell'ipotenusa mi è già stata data. Mentre per inviati non serve che metta come dimensione anche il primo cateto?
Ok, la prossima volta per cortesia metti un codice che almeno compila correttamente ed e' completo.
Stiamo parlando di problemi molto semplici e di sforzi limitati.
Mentre per inviati non serve che metta come dimensione anche il primo cateto?
La write prende 3 parametri, l'ultimo dei quali e' la dimensione del messaggio (il numero di bytes).
Come numero di byte hai messo la dimensione del cateto (moltiplicato per la dimesione di un intero).
Non si capisce che senso ha.
Se il cateto e' lungo 1000, mi basta trasmettere un intero, non devo trasmettere 1000 interi.
Grazie mille per la spiegazione
