CdS in Ingegneria Informatica - Prof.
Paolo Bellavista
Compito A - 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:
tombolaA nomeFileIn nomeFileOut
dove nomeFileIn è un nome assoluto di file esistente nel file system mentre nomeFileOut è il nome relativo del file che deve essere creato dal programma concorrente nel direttorio corrente. Dopo aver effettuato gli opportuni controlli sui parametri di invocazione, il processo iniziale P0 deve generare altri 3 processi P1, P2 e P3 giocatori di tombola, nella relazione gerarchica di parentela ritenuta più opportuna.
P0
estrae numeri interi casuali nell’intervallo [1, 90] e li comunica uno a uno a tutti i processi giocatori. Alla ricezione di
ciascun numero estratto, ognuno dei processi giocatori va a rileggersi i propri 15 numeri nell’intervallo [1, 90]
appartenenti alla propria cartella della tombola. Tali numeri
sono contenuti nel file nomeFileIn. Si supponga che tale file sia ben formato e contenga numeri interi nell’intervallo [1,
90], uno per riga; le righe [0, 15) (da 0 incluso a 15 escluso) sono di
pertinenza di P1, le
righe [15, 30) sono di pertinenza di P2,
le righe [30, 45) sono di pertinenza di P3.
Per semplicità, se lo si desidera, si può
tranquillamente assumere che tutti i numeri siano rappresentati tramite
sequenze di due caratteri (ad esempio, “72\n”, “17\n” o “05”), oppure tramite
la sequenza di sizeof(int)
byte della rappresentazione interna. Si espliciti come commento quale
rappresentazione si decide di utilizzare.
Non appena uno dei processi fa cinquina (semplicemente cinque
numeri nella sua cartella sono stati estratti), questo processo deve scrivere
“Sono il processo con pid x e ho fatto cinquina\n” sul file nomeFileOut e disabilitare la
possibilità per gli altri processi di fare cinquina. In altre parole, un
solo processo deve poter vincere la cinquina e scrivere la riga sul file.
Analogamente per decina e tombola. Appena un processo fa tombola, l’esecuzione
del programma concorrente deve terminare.
In ogni istante, deve essere possibile per l’utente forzare la terminazione del programma concorrente premendo la combinazione di tasti <CTRL-C>. In tal caso, qualunque fosse il punto in cui era arrivato il gioco, P0 deve sovrascrivere nomeFileOut sul quale alla fine deve essere scritta la sola stringa “Gioco terminato. Ha vinto il processo con pid x di cui erano già stati estratti y numeri\n”.
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 la disponibilità delle funzioni di libreria C/UNIX:
long int random(void);
int sprintf(char *str,
char *format, …); es.
sprintf(s1,“%d”,x);
long strtol(char *str, char
**err, int base); es. x=strtol(s1,null,10);
contenute nelle librerie standard <stdlib.h> e <stdio.h>.