ESERCIZI per il LABORATORIO di SISTEMI OPERATIVI

La valutazione del profitto per ogni studente che segue il Laboratorio, necessario all'assegnazione del voto finale per Corso di Sistemi Operativi, sarà determinata in due fasi distinte. Nell'una, verrà richiesta la soluzione degli esercizi riportati di seguito, il cui numero totale sarà aggiornato nel corso dell'anno accademico e la cui presentazione collettiva dovrà avvenire nell'ambito del gruppo in cui lo studente risulta registrato.

Parallelamente, nel corso delle lezioni di Laboratorio, a ciascuno studente verrà richiesta individualmente la soluzione di semplici esercizi presentati dal docente, e la cui valutazione sarà utilizzata per ridistribuire il giudizio complessivo del gruppo con un peso dipendente dalle abilità individuali di ciascun componente.

Programmazione della Shell

Gli esercizi proposti nel seguito devono essere realizzati utilizzando la bash shell di Linux, eventualmente nella forma ridotta di Bourne shell sh, il cui manuale è disponibile in formato PDF oppure in modalità ipertestuale

La soluzione degli esercizi deve essere accompagnata ciascuna da una breve relazione che ne spieghi le caratteristiche rilevanti dell'implementazione e da una traccia della loro esecuzione con un input di prova.

  1. Lettura della Mailbox

    Partendo dal fatto che nei sistemi Unix la mailbox dell'utente username è mantenuta come un file di testo in /var/mail/username si realizzi lo script che implementa il comando pmail che legge il contenuto della mailbox dell'utente username. Pertanto, la sintassi del comando è la seguente
    pmail    username

    dove l'unico parametro passato consente di selezionare la mailbox di ciascun utente abilitato sul sistema.

    Una volta fatte le verifiche del caso viene presentata in output la lista dei messaggi: una riga per messaggio, il cui primo campo è il numero d'ordine, il secondo il subject, il terzo è il mittente mentre l'ultimo la data d'arrivo. A questo punto l'utente può leggere il messaggio con l'identificativo d'ordine introdotto da tastiera oppure terminare la sessione digitando il carattere q.

    Tutte le informazioni necessarie al corretto funzionamento del comando sono disponibili come intestazione dei messaggio cosicchè l'implementazione deve essere in grado di scorrere nella mailbox alla ricerca dell'intestazione successiva fino a quando non viene raggiunta la fine del file.

  2. Gestione delle Directory di Lavoro

    Si voglia gestire le directory di lavoro di un utente mediante la variabile d'ambiente DIRSPATH in cui compare una lista di directory separate fra loro col carattere : come avviene nella variabile PATH. Si realizzi il comando dpath che permette di mantenere e utilizzare tale lista secondo la sintassi generale che appare di seguito
    dpath   l|c|a|i|d   [path | index]

    dove il primo parametro, scelto fra l, c, a, i o d rappresenta una delle azioni list, change, add, insert oppure delete. Il parametro successivo è opzionale in quanto dipende dalla scelta dell'azione da eseguire. In questo senso non ci sono ulteriori parametri se il primo parametro è scelto fra l, a o i per listare tutte le directory di lavoro oppure aggiungere in coda o inserire in testa la directory di lavoro corrente. Per cancellare una directory è necessario fornire il suo path, relativo alla home directory dell'utente mentre per cambiare directory è sufficiente fornire l'indice con cui compare nella lista delle directory.

    Tutte le directory in DIRSPATH devono essere rappresentate come path relativi rispetto alla home directory. La variabile DIRSPATH deve essere presente in uno degli script iniziali con cui viene lanciata la shell durante la fase di login. Si consiglia, a questo proposito, di modificare .bashrc oppure .bash_profile.

  3. Accesso Remoto Controllato

    Si consideri il caso di un webserver che voglia permettere l'accesso all'esecuzione remota di comandi di shell per un certo numero di utenti autorizzati. A tale scopo si deve realizzare un meccanismo di autenticazione che richiede un login e una passwd. Per essere autenticati il sistema si basa sul file passwd.db che, analogamente al file di autenticazione di sistema /etc/passwd, utilizza un campo per il login e un altro per la passwd. Superata la fase di autenticazione, il sistema esegue la riga di comando introdotta nella form e restituisce l'output nel campo textarea di una nuova form, generata dinamicamente, in modo da simulare un terminale seriale. Nella stessa pagina dinamica comparirà anche un campo di input in cui l'utente può introdurre una nuova riga di comando.

    Si realizzi sia la pagina html rlogin.html che lo script CGI rlogin.cgi in modo che, ogni qualvolta l'utente autorizzato sottomette l'esecuzione di una riga di comandi, ne venga automaticamente trasferito l'output nell'apposita textarea, venga presentata una nuova riga di comandi e, con i bottoni di continue e logout l'utente possa sottomettere l'esecuzione del comando appena introdotto oppure terminare la sessione.

Programmazione di Sistema in C

Gli esercizi proposti nel seguito devono essere realizzati nel linguaggio C impiegando, laddove è necessario, le chiamate di sistema e le funzioni di libreria del caso. A tal fine vanno aggiunte le opportune righe di include, contenenti i riferimenti ai file di intestazione (estensione .h) con le relative dichiarazioni di tipo e di funzione, ed inoltre compilare i sorgenti con le opzioni per il linker in modo ad ottenere la risoluzione dei nomi con le funzioni di libreria richieste.

  1. Gioco del Poker mediante thread

    Si realizzi il programma C Poker che simula il gioco del poker mediante l'attivazione di N + 1 thread, essendo N il numero di giocatori implementati come client . Come è noto, il gioco richiede un mazzo di carte dal quale i giocatori ricevono le 5 carte iniziali e poi, a turno, "pescano" le carte necessarie a ripristinare quelle che si intendono "sostituire".

    Si realizzi l'andamento del gioco introducendo il thread banco che, in qualità di server fornisce sia le carte iniziali che le nuove carte dal mazzo su richiesta del giocatore e la necessaria sincronizzazione attendendo che tutti gli N giocatori abbiano ottenuto le carte richieste.

    Si implementi tale schema introducendo i necessari canali di comunicazione fra thread utilizzando lo schema di interazione basato sui buffer. Il programma accetta come unico argomento l'intero N che definisce il numero di giocatori. Si impieghi un generatore di numeri pseudocasuali per simulare il rimescolamento del mazzo.

  2. Gioco della Briscola in connessione connessa

    Si realizzi il programma C Briscola che fornisce il servizio del gioco della briscola mediante connessione connessa (socket stream), accettando richieste di connessione sulla porta 54000, oppure un'altra porta passata come parametro durante la fase di attivazione.

    Il numero dei giocatori client può essere qualunque purchè ciascuno si identifichi prima dell'inizio della partita al quale il server risponderà fornendo le tre carte iniziali. Durante la partita il server dovrà ricevere le carte giocate da ciascun giocatore, determinare il vincitore della mano , aggiornare i punteggi e distribuire la nuova carta per ciascuno. Sarà, inoltre, compito del server mantenere e distribuire tutte le informazioni necessarie al corretto funzionamento del gioco da parte dei client. Si supponga che ciascun giocatore acceda al servizio mediante l'utilizzo di un client TELNET. Si definisca, pertanto, quali devono essere i comandi accettati dal server e le risposte da restituire ai client (Protocollo di Gioco).

  3. Battaglia Navale

    Facendo riferimento alle connessioni non connesse con protocollo di trasporto UDP, si realizzi una coppia di processi client-server in grado di giocare la battaglia navale. Si tenga presente, grazie alla simmetria della comunicazione, della perfetta intercambiabilità dei ruoli client e server di ciascun processo. L'implementazione deve essere ottenuta utilizzando le socket appropriate al caso, con relativa assegnazione dei necessari parametri. Si consideri la possibilità di realizzare un unico programma parametrizzato da lanciarsi sia in modalità server che in modalità client.

DHCP: Dynamic Host Configuration

Partendo dalla documentazione ufficiale RFC della rete Internet, si considerino le specifiche RFC2131, RFC3396 e RFC4361 per il protocollo DHCP utilizzato in tutti quei casi in cui bisogna fornire i parametri essenziali per la connessione dinamica di un host alla rete internet, per mezzo di modem, WiFi oppure con cavo UTP e presa RJ45.

Specialmente considerando il contenuto del primo dei tre documenti citati si analizzino le caratteristiche del protocollo producendo una breve discussione in cui devono essere riportati e sinteticamente spiegati gli elementi essenziali per una possibile implementazione. A questo proposito è sufficiente utilizzare schemi a blocchi, anche in formato grafico, adeguatamente commentati. Nella discussione va considerato separatamente il lato client e il lato server.