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
compito040706SecondoB file1 file2
dove file1 e file2 sono nomi assoluti di file, entrambi supposti già presenti nel file system.
Dopo aver effettuato gli opportuni controlli
sugli argomenti, il processo iniziale P0 deve generare un processo
figlio P1 e poi un secondo processo figlio P2,
fratello di P1. Il processo P0 deve leggere
le sole righe di posizione multipla di 3 nel file file1 (si
considerino quindi le righe di posizione 0, 3, 6, 9, ...) e comunicarle a P1.
Il processo P1 deve anch'esso leggere le sole righe di posizione
multipla di 3 di file2 e confrontarle carattere per carattere
con i dati comunicati da P0: solo se i due caratteri corrispondenti
sono diversi (ad esempio, il primo carattere comunicato da P0
e il primo carattere letto in file2) allora P1
deve comunicarli a P2 (il carattere speciale di nuova linea
non deve essere comunicato in nessun caso). P2 deve semplicemente
scrivere i dati ricevuti da P1 sul file file2.
In ogni istante si consideri la possibilità che un utente prema <CTRL-C>. Se questo accade, il programma concorrente deve immediatamente cambiare il proprio comportamento. In particolare, P1 deve immediatamente scrivere su file2 "Premuto CTRL-C" e non inviare più caratteri da confrontare a P2, dopodichè P2 non potrà più scrivere le ultime eventuali coppie residue già ricevute ma solo la stringa "Bloccato da P1". Alla fine dell'esecuzione del programma concorrente, quindi, file2 conterrà o tutte le coppie di caratteri diversi in posizioni omologhe oppure alcune di queste coppie e la stringa "Premuto CTRL-C Bloccato da P1".
Come sempre, si facciano le scelte di sincronizzazione dei processi ritenute più opportune, cercando di sequenzializzare il meno possibile le varie operazioni richieste.
Parte di programmazione Java Thread (8 punti)
Si vuole scrivere un programma che utilizzi
i Java Thread per la simulazione dell'esito dei rigori tirati al termine di
una partita di calcio (secondo regole differenti rispetto a quelle usuali del
gioco del calcio).
Come si nota dal file allegato Partita.java, l'addetto
alla gestione del simulatore (piuttosto distratto) ha inserito i record relativi
ad arbitro e calci di rigore in maniera disordinata. Si utilizzino dunque i
costrutti di sincronizzazione di Java Thread per scrivere una classe Rigori.java
che fornisca i metodi:
void rigore(int squadra, int ordine, int segnato)
int check()
In particolare, la classe Rigori.java deve essere tale che:
Si utilizzino le classi allegate Partita.java, Giocatore.java, Arbitro.java