CdS in Ingegneria Informatica - Prof. Paolo Bellavista
Parte di Programmazione di Sistema (16 punti)
Si scriva un programma C che, utilizzando le system call del sistema operativo UNIX, abbia un'interfaccia del tipo
compito250706A fileIn fileOut
dove fileIn e fileOut sono nomi assoluti di file (fileIn supposto già presente nel file system, fileOut da creare).
Dopo
aver effettuato gli opportuni controlli sugli argomenti, il processo iniziale
P0 deve generare due processi P1 e P2
nella relazione di parentela ritenuta più opportuna. Il file fileIn
è un file di testo che contiene un numero intero (di lunghezza qualsiasi
ma rappresentabile nel range del tipo int) in ogni riga. Dopo aver determinato
il numero di righe n contenute in fileIn, il processo P0
deve leggere le prime n/3 righe per andare a determinare quali sono il
massimo e il minimo contenuti nella porzione di file di sua competenza. Analoga
operazione deve essere svolta in paralllelo da P1 sul secondo
terzo del file e da P2 sull'ultimo terzo.
Non appena hanno terminato l'elaborazione sul proprio terzo del file, i tre
processi devono scambiarsi il massimo e il minimo trovati al fine di determinare
quali sono i valori massimo e minimo assoluti del file. In particolare, il processo
che ha trovato il valore massimo assoluto dovrà scriverlo su fileOut
cosiccome il processo che ha trovato il minimo assoluto dovrà scriverlo
sullo stesso fileOut.
Deve essere rispettato il seguente vincolo di sincronizzazione: il massimo
assoluto dovrà essere scritto su fileOut SEMPRE PRIMA del minimo
assoluto.
Come sempre, si facciano le scelte di sincronizzazione dei processi ritenute
più opportune, cercando di sequenzializzare il meno possibile le varie
operazioni richieste.
P.S.: Si ricorda l'esistenza
delle funzioni di libreria
int sprintf(char *str, char* format, ...); ad
esempio
sprintf(s1,"%d",x);
long strtol(char *str, char **ptr, int base); ad
esempio x=strtol(s1,null,10);
per la conversione da int a string e da stringa a int,
rispettivamente.
Parte di Programmazione UNIX Shell (8 punti)
Si scriva un file comandi in Shell di UNIX che abbia un'interfaccia del tipo
condir.sh dir dir1 ... dirN
Dove dir è un direttorio assoluto che deve esistere nel file system mentre dir1 ... dirN sono un numero N qualsiasi, non noto a priori, di nomi di direttori relativi.
Il compito del file comandi è quello di verificare se dir1 ... dirN sono tutti direttori contenuti nel sottoalbero individuato da dir. In caso affermativo, il comando deve stampare "Tutti i direttori trovati!", mentre in caso negativo deve stampare "Direttori rimanenti: " seguito dalla lista dei direttori che non sono stati trovati.
Suggerimento: si utilizzi un file di appoggio in cui memorizzare l'elenco dei direttori relativi che ancora non sono stati trovati; rimuovere il file di appoggio al termine dell'esecuzione.