Scrivere un programma C in cui un processo crea un processo figlio

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


risposta:
  1. /*
  2. Scrivere un programma C in cui un processo crea un processo figlio
  3.         • Il processo figlio calcola la sequenza di Fibonacci di ordine n (n<=12).
  4.                 Quando termina restuisce il valore calcolato come codice di terminazione
  5.         • Il padre attende la terminazione del figlio ed esamina lo stato di terminazione
  6.         • Se lo stato di terminazione è relativo ad una terminazione con successo
  7.                  e il codice di terminazione è un valore minore di 50
  8.         • Crea un secondo figlio che esegue il comando ls –al a.out
  9.         • Attende il secondo figlio, stampa un messaggio e termina
  10.         • Altrimenti, stampa un messaggio e termina
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <unistd.h>
  15. #include <sys/types.h>
  16. #include <sys/wait.h>
  17.  
  18. int Fibonacci(int n)
  19. {
  20.    if ( n == 0 )
  21.       return 0;
  22.    else if ( n == 1 )
  23.       return 1;
  24.    else
  25.       return ( Fibonacci(n-1) + Fibonacci(n-2) );
  26. }
  27.  
  28. int main(int argc, char *argv[]) {
  29. int x;
  30. int codice_di_terminazione,statloc,n=atoi(argv[1]);
  31. pid_t pid;
  32. pid_t pid2;
  33. pid = fork();
  34. if(pid == 0) {
  35.        
  36.         x = Fibonacci(n);
  37.         printf("%d - %d\n",n,x);
  38.         exit(x);       
  39. } else {
  40.         printf("In attesa..");
  41.         waitpid(pid, &statloc, 0);
  42.         codice_di_terminazione = WEXITSTATUS(statloc);
  43.        
  44.         if(WIFEXITED(statloc) == 1 && codice_di_terminazione<50) {
  45.                 pid2 = fork();
  46.                 if(pid2 == 0) {
  47.                         execl("/bin/ls", "ls", "-l", "a.out", NULL);
  48.                 } else {
  49.                         waitpid(pid2, &statloc, 0);
  50.                         printf("Ho fatto un altro figlio perchè è andato tutto bene \n");
  51.                 }
  52.         } else {
  53.                         printf("Mio figlio1 %d è terminato, codice terminazione %d\n",pid,codice_di_terminazione
  54. );     
  55.         }
  56.                
  57. }
  58.  
  59.  
  60. return 0;
  61. }


Learn More :