Processo pipe

di il
11 risposte

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:
#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;
    }
}

11 Risposte

  • Re: Processo pipe

    Rivolgiti al moderatore per lo spostamento dei thread da questa sezione

    E poi esprimi più chiaramente i tuoi dubbi, hai compilato e provato il programma?
    Hai errori? Funziona come ti aspetti?

    Non si postano codici per la "revisione", non ci sono tutor universitari qui
  • Re: Processo pipe

    oregon ha scritto:


    Rivolgiti al moderatore per lo spostamento dei thread da questa sezione

    E poi esprimi più chiaramente i tuoi dubbi, hai compilato e provato il programma?
    Hai errori? Funziona come ti aspetti?

    Non si postano codici per la "revisione", non ci sono tutor universitari qui
    Ho inserito anche i problemi che mi da il programma
  • Re: Processo pipe

    #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;
        }
    }
  • Re: Processo pipe

    Perché riproponi il codice? E perchè insisti a scrivere in questa sezione e non in quella del linguaggio C/C++ ?
  • Re: Processo pipe

    Ho chiesto al moderatore di spostarli
  • Re: Processo pipe

    oregon ha scritto:


    Perché riproponi il codice? E perchè insisti a scrivere in questa sezione e non in quella del linguaggio C/C++ ?
    Perchè l'ho migliorato e volevo soltanto qualche suggerimento
  • Re: Processo pipe

    Ma devi dire qualcosa. Cosa hai migliorato? Cosa succede adesso? Compila? O hai errori?
  • Re: Processo pipe

    Sono riuscito a farlo funzionare dandomi i risultati corretti
  • Re: Processo pipe

    Ah quindi hai risolto.

    E perché non lo dici ?
  • Re: Processo pipe

    Perchè l'ho risolto dopo aver ripostato il codice
  • Re: Processo pipe

    In ogni caso non devi postare del codice e basta. Devi scrivere qualcosa per far capire perché stai postando del codice o non avrai molte risposte e aiuti.

    Ovviamente i prossimi thread non più in questa sezione.
Devi accedere o registrarti per scrivere nel forum
11 risposte