[C] Processo Pipe

di il
3 risposte

[C] Processo Pipe

Salve a tutti. Sto riscontrando un problema con questo esercizio praticamente nel momento in cui arrivo nel processo padre mi stampa messaggio incompleto pur inserendo un valore intero come richiesto dalla traccia. L'ho visionato con cura prestando attenzione a tutto eppure mi sfugge qualcosa. Grazie mille a chi mi aiuterà.

https://www.onlinegdb.com/4V3xw7QF -> il link del codice
/*
 * Il programma ottiene un numero intero N dai parametri della linea di comando,
 * e crea un processo figlio che, utilizzando la funzione fornita 'genera_risultato',
 * calcola i due più piccoli numeri primi maggiori di N. I valori calcolati devono
 * essere inviati al processo padre tramite l'uso di una pipe. Il processo padre
 * attende il risultato dal processo figlio, e stampa a video il valore ricevuto.
 * Gestire in maniera appropriata (segnalando un messaggio di errore) i casi in
 * cui il processo padre ha un errore di ricezione oppure riceve un messaggio incompleto.
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/wait.h>

/* Verificare se n e' primo */
bool primo(int n) {
    if(n % 2 == 0)
        return n == 2;
    
    for( int i = 3; i*i <= n; i+= 2)
        if(n%i == 0)
            return false;
    return true;
}

/* Calcola il più piccolo numero primo maggiore di K.
 * Parametri di ingresso:
 * k il valore k rispetto al quale calcolare i due numeri
 * Parametri di uscita:
 * n1 il più piccolo numero primo maggiore di k
 * n2 il secondo più piccolo numero primo maggiore di k
 */
void genera_risultato(int k, int *n1, int *n2) {
    int i = k+1;
    while(!primo(1))
        i++;
    *n1 = i;
    i++;
    
    while(!primo(i))
        i++;
    *n2 = i;
}

int main(int argc, char *argv[]) {
    int fd[2];
    int risultato[2];
        
    if(argc != 2) {
        printf("Non hai inserito il giusto numero di parametri\n");
        return -1;
    }
    
    int n = atoi(argv[1]);
   
    /* 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 */
        genera_risultato(n, &risultato[0], &risultato[1]);
    
        /* Inviare il messaggio */
        int inviati = write(fd[1], genera_risultato, sizeof(int));
              
        if(inviati != sizeof(genera_risultato)) {
            printf("Errore nell'invio\n");
            return -1;
           
        }
        close(fd[1]);
        return 0;
    } else {
        /* Processo Padre */
        close(fd[1]); // Non interessato a scrivere
       int numero[2];
        int ricevuti = read(fd[0], &numero, sizeof(numero));
       
        if(ricevuti < 0) {
            printf("Errore nella ricezione\n");
        } else if(ricevuti < sizeof(numero)) {
            printf("Messaggio incompleto\n");
        } else {
            printf("Risultati ricevuti: %d %d\n", risultato[0], risultato[1]);
        }
        close(fd[0]);
        return 0;
    }
}

3 Risposte

  • Re: [C] Processo Pipe

    
    #include <stdbool.h>
    #include <stdio.h>                  
    #include <stdlib.h>
    #include <unistd.h>  
    
    bool primo(int n) {
        if(n % 2 == 0)
            return n == 2;
        
        for(int i = 3; i*i <= n; i+= 2)
            if(n%i == 0)
                return false;
        return true;
    }
    
    void genera_risultato(int k, int *n1, int *n2) {
        int i = k+1;
        while(!primo(i))
            i++;
        *n1 = i;
        i++;
        
        while(!primo(i))
            i++;
        *n2 = i;
    }
    
    int main(int argc, char *argv[]){
     if(argc != 2) {
        printf("Non hai inserito il giusto numero di parametri\n");
        exit(EXIT_FAILURE);
     }
        
     int pipefd[2];
     pid_t cpid;
     if (pipe(pipefd) == -1){
       printf("Errore nella pipe()\n");           
       exit(EXIT_FAILURE);
     }
     cpid = fork();
     if (cpid == -1){
       printf("Errore nella fork()\n");
       exit(EXIT_FAILURE);
     }
     if (cpid != 0) {                              
       // parent
       close(pipefd[1]); // write close
       int r[2];
       while(read(pipefd[0], &r, sizeof(r)) > 0)
            printf("Il padre ha ricevuto: %d, %d\n", r[0], r[1]);
     } 
     else {  
       // child
       int k = atoi(argv[1]), n[2];
       genera_risultato(k, &n[0], &n[1]);
       close(pipefd[0]); // close read
       write(pipefd[1], &n, sizeof(n));
     }
     return 0;
    }
    
  • Re: [C] Processo Pipe

    Fai un po' di pasticci tra nomi di variabili, array, nomi di funzione ....

    Usando il tuo codice, la parte da correggere è
    
        } else if(pid == 0) {
            /* Processo Figlio */
            close(fd[0]); // Non interessato a leggere
           
            /* Preparazione del messaggio */
            genera_risultato(n, &risultato[0], &risultato[1]);
            
            printf("Risultati  inviati: %d %d\n", risultato[0], risultato[1]);
            
            /* Inviare il messaggio */
            int inviati = write(fd[1], risultato, sizeof(risultato));
    
            if(inviati != sizeof(risultato)) {
                printf("Errore nell'invio\n");
                return -1;
               
            }
            close(fd[1]);
            return 0;
        } else {
            /* Processo Padre */
            close(fd[1]); // Non interessato a scrivere
    
            int numero[2];
            int ricevuti = read(fd[0], numero, sizeof(numero));
    
            if(ricevuti < 0) {
                printf("Errore nella ricezione\n");
            } else if(ricevuti < sizeof(numero)) {
                printf("Messaggio incompleto\n");
            } else {
                printf("Risultati ricevuti: %d %d\n", numero[0], numero[1]);
            }
            close(fd[0]);
            return 0;
        }
  • Re: [C] Processo Pipe

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
3 risposte