Questa è una vecchia versione del documento!
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 <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> /* * 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 <num>\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:
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 <stdlib.h> #include <stdio.h> #include <errno.h> #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; }