Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio15:esercitazionia:esercitazione7

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 <unistd.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;
}
informatica/sol/laboratorio15/esercitazionia/esercitazione7.1430164853.txt.gz · Ultima modifica: 27/04/2015 alle 20:00 (10 anni fa) da Massimo Torquati

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki