Si realizzi un progetto che simuli la seguente situazione:un tratto autostradale delimitato da una barriera di ingresso
(dotata di 3 caselli) e una barriera di uscita (dotata di 1
casello). (Per semplicita' consideriamo solo una delle due
direzioni di marcia).
[Vi sono un certo numero N (maggiore di 10) di auto descritte in un file
di testo che viene letto all'inizio. Per ogni auto, nel file viene indicata
la sua velocita' media con un valore V compreso tra 50 e 100 (chiaramente,
ogni auto ha la propria velocita').
Vi sara' un generatore delle auto che legge in anticipo tutto il file e
che genera tutte le auto descritte.]
Appena generata, una auto decide in quale dei 3 caselli della barriera di
ingresso accodarsi. E si mette in coda a tale casello.
(Il modo in cui l'auto sceglie il casello e' a vostra scelta).
Quando e' il suo turno l'auto preleva il ticket (supponiamo sia un
nimero intero univoco, cioe' utilizzato solo una auto), attende che la sbarra
di alzi e riparte.
Immaginiamo che l'auto in viaggio percorra il tragitto tra barriera d'ingresso
e barriera d'uscita in un numero di secondi pari alla sua velocita'
divisa per 10. Al termine di tale intervallo di tempo l'auto si presenta alla
barriera d'uscita e si accoda al casello.
Giunto il suo turno, l'auto partecipa ad un duplice scambio con il casello:
-- il casello chiede all'auto il ticket;
-- l'auto consegna il ticket e comunica la sua velocita';
-- il casello calcola l'ammontare del pedaggio (per semplicita' supponiamo consista
in tanti euro quanta e' la velocita' dell'auto divisa per 50);
-- l'auto paga il pedaggio richiesto;
-- la sbarra si alza e l'auto passa; dopo passata l'auto termina.
L'intero programma deve terminare correttamente dopo che tutte le auto sono
uscite dall'autostrada.
Si deve realizzare il tutto in modo che:
- si eviti la generazione di processi zombie;
- si evitino le situazioni di stallo;
- le comunicazioni possono essere realizzate utilizzando pipe, socket, messaggi, segnali,...
a vostra scelta, ma in modo opportuno;
- per tutti i processi che terminano e tutte le
risorse e le strutture di comunicazione utilizzare dai processi
devono essere de-allocate; Nessun processo deve essere ucciso
volontariamente da un altro processo, ma deve eventualmente
terminare normalmente la sua esecuzione.
- il codice deve essere indentato in modo chiaro ed debitamente commentato;
- si richiede una adeguata gestione degli errori (es. fallimento nella
chiamata ad una system call), con una messaggistica di errore che informi
l'utente su eventuali anomalie a tempo di esecuzione.