Sistemi Operativi L-A

Compito B 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

compito250706C fileIn fileOut car1 car2

dove fileIn e fileOut sono nomi assoluti di file (fileIn supposto già presente nel file system, fileOut da creare) mentre car1 e car2 sono ciascuno un singolo carattere.

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. Sia n la lunghezza in byte del file fileIn. Il processo P0 deve occuparsi di leggere i primi n/3 caratteri di fileIn e di contare quante occorrenze di car1 e car2 sono presenti 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 numero di caratteri car1 e car2 trovati al fine di determinare la somma di tutte le occorrenze di ciascuno dei due caratteri nel file e di stabilire chi ne ha trovati di più. In particolare, il processo che ha trovato il massimo numero di occorrenze di car1 nella propria porzione di file dovrà scrivere su fileOut "Ne ho contati di più io. La somma totale dei caratteri car1 è ...". Analogamente, il processo che ha trovato il massimo numero di occorrenze di car2 nella propria porzione di file dovrà scrivere su fileOut "Ne ho contati di più io. La somma totale dei caratteri car2 è ...".
Deve essere rispettato il seguente vincolo di sincronizzazione: su fileOut deve essere sempre scritta per PRIMA la frase riguardante car1, seguita poi dalla frase su car2.
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

confile.sh file dir1 ... dirN

Dove file è una stringa mentre dir1 ... dirN sono un numero N qualsiasi, non noto a priori, di nomi di direttori assoluti che devono esistere nel file system.

Il compito del file comandi è quello di visitare tutti i sottoalberi individuati da dir1 ... dirN alla ricerca del file di nome file. Ogni volta che file viene incontrato, il comando deve appendere in coda ad un file di report, da inserire nella home dell'utente che ha invocato il comando, una riga del tipo:

N PERCORSO_COMPLETO

dove N è la lunghezza (numero di caratteri) del file appena incontrato nel direttorio corrente e PERCORSO_COMPLETO il suo nome assoluto.

Al termine dell'esecuzione, il file comandi deve stampare una stringa del tipo "file non trovato in nessun direttorio!" se file non è stato trovato in nessuno dei sottoalberi passati come argomento, oppure la riga del file di report che comincia con la lunghezza MASSIMA.