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