[C] Processo pipe

Messaggioda giacomovicinanza » 26/02/2022, 13:07

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:
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;
    }
}
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 90 di 218
Iscritto il: 18/08/2021, 15:55

Re: [C] Processo pipe

Messaggioda Quinzio » 26/02/2022, 16:55

Non compila nemmeno il tuo programma.
Codice:
aa.c:67:37: error: ‘messaggio’ undeclared (first use in this function)
   67 |         int ricevuti = read(fd[0], &messaggio, sizeof(messaggio));
      |                                     ^~~~~~~~~
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4799 di 10548
Iscritto il: 24/08/2010, 06:50

Re: [C] Processo pipe

Messaggioda giacomovicinanza » 26/02/2022, 19:19

Ho corretto il codice
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;
    }
}
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 91 di 218
Iscritto il: 18/08/2021, 15:55

Re: [C] Processo pipe

Messaggioda Quinzio » 26/02/2022, 21:24

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));
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4801 di 10548
Iscritto il: 24/08/2010, 06:50

Re: [C] Processo pipe

Messaggioda giacomovicinanza » 27/02/2022, 09:55

La funzione dell'ipotenusa mi è già stata data. Mentre per inviati non serve che metta come dimensione anche il primo cateto?
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 92 di 218
Iscritto il: 18/08/2021, 15:55

Re: [C] Processo pipe

Messaggioda giacomovicinanza » 27/02/2022, 10:03

Comunque sono riuscito a farlo funzionare mi da i risultati corretti
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 93 di 218
Iscritto il: 18/08/2021, 15:55

Re: [C] Processo pipe

Messaggioda Quinzio » 27/02/2022, 11:12

giacomovicinanza ha scritto: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.
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4802 di 10548
Iscritto il: 24/08/2010, 06:50

Re: [C] Processo pipe

Messaggioda giacomovicinanza » 27/02/2022, 11:36

Grazie mille per la spiegazione :)
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 94 di 218
Iscritto il: 18/08/2021, 15:55


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite