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:
ContaMAIUSTotali NomeFileIn NomeFileOut carSeparatore
dove NomeFileIn è un nome assoluto di file già presente nel file system, NomeFileOut un nome assoluto per il file prodotto dall'esecuzione del programma, e carSeparatore un singolo carattere non alfabetico. Dopo aver effettuato gli opportuni controlli sui parametri di invocazione, oltre al processo iniziale P0, devono essere generati due ulteriori processi P1 e P2, rispettivamente figlio e nipote di P0. P0 e P2 devono occuparsi di leggere, alternativamente un blocco l’uno un blocco l’altro, il contenuto dell’intero file di testo NomeFileIn. In questo esercizio, si definisce blocco una sequenza di al più 500 caratteri terminata dal carattere speciale carSeparatore (passato come argomento all’invocazione del programma).
Entrambi i processi (P0 e P2) si occupano di contare i caratteri alfabetici maiuscoli presenti nel blocco di loro pertinenza e di comunicare il risultato del conteggio al processo P1 per ogni blocco esaminato. Inoltre, entrambi i processi devono scrivere su NomeFileOut, ciascuno in modo non interrompibile per ogni singolo blocco, tutti gli alfabetici maiuscoli presenti nel blocco.
P1 deve infine stampare a video il numero totale di alfabetici maiuscoli contati in tutti i blocchi del file di ingresso (somma di tutti i conteggi parziali ricevuti dai processi P0 e P2) solo dopo che il processo P2 ha terminato tutto il suo lavoro.
In ogni istante deve essere possibile per l'utente ridurre il carico computazionale associato al programma concorrente, riducendo il numero dei processi coinvolti. In particolare, premendo <CTRL-C> l'utente deve poter comandare al programma di passare a soli due processi (terminando P2 in maniera forzata). Comunque il processo P1 dovrà stampare a video, in questo caso, il risultato dell'intero lavoro di P0 fino fine file e del lavoro di P2 prima della sua terminazione.
Si facciano le scelte di sincronizzazione dei processi ritenute più opportune, cercando di sequenzializzare il meno possibile le varie operazioni richieste.
Parte di Programmazione UNIX Shell (8 punti)
Si scriva un file comandi in Shell di UNIX che abbia un'interfaccia del tipo
branch.sh dir
dove dir è un direttorio assoluto, che si suppone già esistente nel file system.
Il compito del file comandi è quello di determinare il massimo grado di ramificazione del sottoalbero individuato da dir e stampare a video il percorso assoluto di tutti i sotto-direttori che presentano tale grado di ramificazione.
Per grado di ramificazione di un direttorio si intende il numero dei suoi sotto-direttori.
Ad esempio, considerando il sottoalbero in figura:
L'output del file comandi deve essere:
2
.../a
.../a/c
Suggerimento: si utilizzi un file di appoggio in cui memorizzare il massimo valore di diramazione attualmente individuato, seguito dalla lista dei direttori che presentano tale valore.