====== Esercitazione 7 ====== System calls (SC) che operano su processi e pipe senza nome. Per gli esercizi proposti si richiede di realizzare un Makefile. ===== Esercizio 1 ===== Completare il codice seguente in modo che il programma calcoli i primi 13 numeri di Fibonacci utilizzando per ogni chiamata ''doFib'' un processo distinto. #include #include #include #include /* * Calcola ricorsivamente il numero di Fibonacci dell'argomento 'n'. * La soluzione deve forkare un nuovo processo che esegue una sola * chiamata di 'doFib'. * Se doPrint e' 1 allora la funzione lo stampa, altrimenti il * numero calcolato va passato al processo padre. */ static void doFib(int n, int doPrint); int main(int argc, char *argv[]) { // questo programma puo' calcolare i numeri di Fibonacci solo fino a 13. const int NMAX=13; int arg; if(argc != 2){ fprintf(stderr, "Usage: %s \n", argv[0]); return EXIT_FAILURE; } arg = atoi(argv[1]); if(arg < 0 || arg > NMAX){ fprintf(stderr, "num deve essere compreso tra 0 e 13\n"); return EXIT_FAILURE; } doFib(arg, 1); return 0; } ===== Esercizio 2 ===== Scrivere un programma che prende un intero N come argomento e crea N processi zombies. ===== Esercizio 3 ===== Scrivere un programma chiamato ''pszombies'' che stampa il pid dei processi zombies presenti nel sistema utilizzando una pipeline di 3 processi. Il primo processo esegue il comando ''ps -A -ostat,pid'' e fornisce l'input al secondo processo che esegue il comando ''grep -e [zZ]'' e che a sua volta fornisce l'input al terzo processo che esegue il comando ''awk {print $2}''. L'aoutput deve essere equivalente al comando shell:\\ bash $> ps -A -ostat,pid | grep -e [zZ] | awk '{print $2}' PS: per testare il programma utilizzare il programma prodotto nell'esercizio 2. ===== Esercizio 4 ===== Considerare il seguento programma ''dec.c'': #include #include #include #include #define SYSCALL(r,c,e) if((r=c)==-1) { perror(e);exit(errno); } int main(int argc, char *argv[]) { int x,r; if (argc>1) { x = atoi(argv[1]); if (x<0) goto fine; SYSCALL(r, write(1, &x,sizeof(x)),"write1"); } do { SYSCALL(r,read(0, &x,sizeof(x)),"read"); if (r==0) { fprintf(stderr, "Processo %d, esco perche' lo standard input e' chiuso!\n", getpid()); return 0; } fprintf(stderr, "Processo %d, ricevuto %d\n", getpid(),x); --x; if (x<0) break; SYSCALL(r, write(1, &x,sizeof(x)), "write2"); } while(1); fine: fprintf(stderr, "Processo %d, esco perche' raggiunto valore negativo\n", getpid()); return 0; } Scrivere un programma (''pipedec'') che prende in ingresso un intero positivo, quindi lancia 2 processi figli ognuno dei quali esegue l'eseguibile del programma ''dec''. Solo ad uno dei due processi figli viene passato come argomento l'intero positivo passato al programma ''pipedec''. I due processi figli devono essere connessi tra di loro in modo tale che lo standard input di un processo sia connesso con lo standard output dell'altro processo (la connessione e' quindi bidirezionale).