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.