[C] Processo Pipe

Messaggioda giacomovicinanza » 17/05/2022, 15:22

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/4V3xw7QFN -> il link del codice

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

Re: [C] Processo Pipe

Messaggioda apatriarca » 17/05/2022, 16:55

Codice:
/* Inviare il messaggio */
int inviati = write(fd[1], genera_risultato, sizeof(int));

L'ho letto velocemente ma credo che volessi inviare risultato e che la dimensione dovesse essere 2 * sizeof(int)..
Codice:
/* Inviare il messaggio */
int inviati = write(fd[1], risultato, 2 * sizeof(int));

Ovviamente devi modificare anche le righe seguenti..
apatriarca
Moderatore
Moderatore
 
Messaggio: 5676 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Processo Pipe

Messaggioda giacomovicinanza » 17/05/2022, 18:47

Grazie mille.
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 129 di 218
Iscritto il: 18/08/2021, 15:55


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite