Sistemi Operativi L-A

Compito di Lunedì 16 Luglio 2007

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