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.
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.