/*
Scrivere un programma C in cui un processo crea un processo figlio
• Il processo figlio calcola la sequenza di Fibonacci di ordine n (n<=12).
Quando termina restuisce il valore calcolato come codice di terminazione
• Il padre attende la terminazione del figlio ed esamina lo stato di terminazione
• Se lo stato di terminazione è relativo ad una terminazione con successo
e il codice di terminazione è un valore minore di 50
• Crea un secondo figlio che esegue il comando ls –al a.out
• Attende il secondo figlio, stampa un messaggio e termina
• Altrimenti, stampa un messaggio e termina
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int Fibonacci(int n)
{
if ( n == 0 )
return 0;
else if ( n == 1 )
return 1;
else
return ( Fibonacci(n-1) + Fibonacci(n-2) );
}
int main(int argc, char *argv[]) {
int x;
int codice_di_terminazione,statloc,n=atoi(argv[1]);
pid_t pid;
pid_t pid2;
pid = fork();
if(pid == 0) {
x = Fibonacci(n);
printf("%d - %d\n",n,x);
exit(x);
} else {
printf("In attesa..");
waitpid(pid, &statloc, 0);
codice_di_terminazione = WEXITSTATUS(statloc);
if(WIFEXITED(statloc) == 1 && codice_di_terminazione<50) {
pid2 = fork();
if(pid2 == 0) {
execl("/bin/ls", "ls", "-l", "a.out", NULL);
} else {
waitpid(pid2, &statloc, 0);
printf("Ho fatto un altro figlio perchè è andato tutto bene \n");
}
} else {
printf("Mio figlio1 %d è terminato, codice terminazione %d\n",pid,codice_di_terminazione
);
}
}
return 0;
}