Sistemi Operativi L-A

Compito del 13 Aprile 2007

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:

 

matrice NomeFile Num

 

 

dove NomeFile è un nome assoluto di file già esistente nel file system e Num un numero naturale. NomeFile è un file che contiene gli elementi di una matrice quadrata NumxNum di numeri interi; il candidato decida (e descriva la scelta fatta come commento nella soluzione consegnata) come tali informazioni sono memorizzate nel file. Dopo aver effettuato gli opportuni controlli sugli argomenti, il processo iniziale P0 deve generare tre processi, P1, P2 e P3, tutti figli di P0.

 

P0 deve leggere il contenuto del primo quadrante della matrice (elementi di indice da 0 a Num/2, sia per le righe che per le colonne). Nel caso in cui tutti i valori siano uguali a 0 il processo deve notificare tutti gli altri processi che devono tutti scrivere a video "Primo quadrante tutto nullo!" e terminare immediatamente. Altrimenti il processo deve determinare l'elemento con valore massimo e scrivere tale valore nel file NomeFile in tutti gli elementi del primo quadrante della matrice.

Gli altri tre processi devono avere comportamento analogo. Ad esempio, P1 deve occuparsi di leggere il secondo quadrante della matrice (righe da 0 a N/2, colonne da N/2+1 a N) e notificare tutti gli altri processi nel caso di tutti elementi nulli (gli altri processi devono scrivere a video "Secondo quadrante tutto nullo!" e terminare). Altrimenti, il processo P1 deve scrivere il valore massimo trovato in NomeFile in tutti gli elementi del secondo quadrante. Analogamente per P2 e P3 su terzo e quarto quadrante della matrice.

 

Si facciano le scelte di sincronizzazione dei processi ritenute più opportune, cercando di sequenzializzare il meno possibile le varie operazioni richieste.

 

 

 

Parte di Programmazione File Comandi UNIX (8 punti)

Si scriva un file comandi in bash Shell di Linux che abbia un'interfaccia del tipo

arch sourceDir targetDir par1 par2 ... parN

dove sourceDir è un direttorio esistente nel file system, targetDir un nome assoluto di direttorio NON esistente e par1 ... parN singole lettere minuscole. Si svolgano gli opportuni controlli sugli argomenti di invocazione del file comandi.
Il compito del file comandi è quello di archiviare i file presenti nell'albero individuato da sourceDir secondo le lettere passate come argomento. In particolare, per ogni file trovato nell'albero di sourceDir, il file comandi deve effettuare i seguenti passi: (1) verificare che il suo nome inizi per una delle lettere passate come argomento e (2) in caso affermativo, copiare il file in un sottodirettorio di targetDir chiamato come la lettera corrispondente.

Ad esempio, se targetDir è /copy, le lettere passate come argomento "a", "b" e "c", un eventuale file esaminato di nome ciao.txt in sourceDir, il file comandi deve creare la copia /copy/c/ciao.txt.

targetDir e i suoi sottodirettori devono essere creati solo se effettivamente almeno un file deve essere archiviato nella voce corrispondente (ovvero non devono essere creati direttori vuoti). A fine programma, se almeno un file è stato archiviato, il programma deve mostrare il contenuto dell'albero individuato da targetDir (ovvero mostrare l'archivio ottenuto), o stampare su standard output la stringa 'No file archived' in caso contrario.

NOTA: si faccia l'assunzione che nell'albero individuato da sourceDir non ci siano nomi di file ripetuti.