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