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
compito040706PrimoA fileIn fileOut car threshold
dove fileIn e fileOut sono nomi assoluti di file (fileIn supposto già presente nel file system, fileOut da creare), car un singolo carattere e threshold un numero naturale.
Dopo aver effettuato gli opportuni controlli sugli argomenti, il processo iniziale P0 deve generare un processo figlio P1, che a sua volta genera un processo nipote P2. Il processo P0 deve leggere il primo terzo del file fileIn (se fileIn è lungo n byte, P0 dovrà leggerne i primi n/3) contando le occorrenze del carattere car. Se le occorrenze contate sono maggiori di threshold allora i processi P1 e P2 si dovranno occupare di contare le lettere maiuscole rispettivamente nel secondo e ultimo terzo di fileIn. Altrimenti, P1 e P2 dovranno occuparsi del conteggio delle lettere minuscole, sempre nelle stesse porzioni di file.
Al termine del conteggio, P1 dovrà capire se le maiuscole/minuscole contate sono di più, di meno, o uguali a quelle contate da P2, e conseguentemente scrivere su fileOut "Sono P1 e ho trovato più/meno/uguali caratteri maiuscoli/minuscoli nella mia porzione di file"; analoga cosa deve essere fatta da P2.
Deve essere rispettato il seguente vincolo di sincronizzazione: il processo che ha contato più maiuscole/minuscole fra P1 e P2 deve sempre scrivere per primo su fileOut.
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 File Comandi UNIX - Secondo Turno - (8 punti)
Si scriva un file comandi in bash Shell di Linuxche abbia un'interfaccia del tipo
shell040706SecondoA dir [filter]
dove dir è un nome
assoluto di direttorio e filter una stringa (opzionale). Si
svolgano gli opportuni controlli sui parametri di invocazione del file comandi.
Il compito del file comandi è quello di stampare a video il valore numerico
del massimo numero di parole nei file presenti all'interno del
sottoalbero individuato da dir.
Devono essere considerati solo i file che contengono filter
all'interno del proprio nome; se il parametro filter non è
presente, tutti i file devono essere considerati.
Inoltre, si effettui il conteggio solo sui file leggibili dall'utente che ha invocato il comando.