Sistemi Operativi L-A

Compito A del 25 Luglio 2006

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.