La valutazione del profitto per ogni studente che segue il Laboratorio concorre all'assegnazione del voto finale del Corso di Sistemi Operativi ed è articolata in due fasi. Nella prima ciascuno studente dovrà fornire la soluzione di almeno tre degli esercizi riportati di seguito, il cui numero totale sarà aggiornato nel corso dell'anno accademico.
Alla termine del corso, durante l'ultima lezione, verrà assegnato un argomento da sviluppare in forma di breve relazione e che verterà su uno dei protocolli di RETE che, comunque, verranno accennati nelle ultime lezioni.
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.
Si realizzi lo script pattern che produce in uscita la lista di tutti i file testuali, contenuti nella directory indicata, nei quali appaia il pattern <pattern>, passato come argomento. Per la specifica della directory si assuma la directory corrente amenochè non venga diversamente indicato in accordo con la sintassi generale del comando
pattern -d dir1,...,dirm -n N <pattern> |
Si consideri il problema di pemettere agli utenti, registrati su un
certo sito remoto, di scambiare brevi messaggi
in modo sicuro. L'accesso al servizio tramite webserver è
ottenuto per mezzo di un meccanismo di autenticazione che richiede
un login e una passwd.
Per essere autenticati il sistema utilizza uno specifico file
login.db, strutturato come il file di
autenticazione di sistema /etc/passwd, in campi separati dal
carattere :. Si supponga che gli utenti si possano registrare fornendo
un proprio login e uno username
propriamente specificato. Il sistema, in caso di autenticazione con successo,
risponde con una specifica passwd con cui l'utente
può inoltrare un messaggio. Ogni volta che il sistema accetta un
tale messaggio, l'utente viene notificato con una nuova password
cosicchè la validità della password è ristretta
ad un solo messaggio.
La pagina HTML message.html deve permettere sia la
registrazione di un nuovo utente sia l'invio, da parte di un utente registrato
con login e passwd valide, di un messaggio ad un altro utente,
noto come username, inserito in una textarea,
appositamente predisposta.
Si realizzi lo script CGI message.cgi in modo da
rispondere conseguentemente alle richieste provenienti dalla pagina HTML,
predisponendo la generazione random delle password e definendo
l'area comune in cui memorizzare i messaggi in transito. Una possibile
soluzione, che semplifica il problema, è quella di supporre che
lo username, utilizzato dagli utenti registrati
per ricevere i messaggi, coincida con la mailbox di utenti locali
fittizi del sito remoto.
Si realizzi lo script xtelnet che simula connessioni telnet, utilizando il programma generale di connessione ssh, in modo da accettare come parametri il nome dell'host e il numero eventuale di porta. Si tratta, pertanto, di implementare il comando xtelnet secondo la sintassi riportata di seguito
xtelnet host [ port ] |
$ xtelnet sole Trying 158.110.144.29... Connected to sole. Escape character is '^]'. Ubuntu 7.10 (gutsy) Kernel 2.6.22-14-server on an x86_64 login:dove, nel caso dei sistemi Linux, la quarta e la quinta riga del banner riguardano la release della distribuzione e il kernel di sistema, rispettivamente. Si valuti attentamente come ottenere queste informazioni dal sistema remota.
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.
Si realizzi il programma C maze, che simula il movimento casuale di una o più pedine su una scacchiera quadrata di lato N, mediante l'attivazione di M + 1 thread, essendo M il numero di pedine da muovere automaticamente in modo pseudocasuale. Il thread rimanente funziona da server scacchiera dei thread client associati alle pedine; esso riceve l'informazione dello spostamento richiesto dalla pedina e provvede ad eseguirlo cambiando la sua posizione sulla scacchiera.
Si implementi il server in modo da mostrare su terminale il movimento delle pedine tramite il display grafico di una matrice N x N e si identifichi ciascuna pedina con un numero. Le pedine comunicano con un canale di comunicazione privato per ognuna di esse e il server ascolta ciclicamente in polling le richieste delle pedine client. Ad ogni aggiornamento ricevuto il server provvede a renderlo visibile su display.
Ogni pedina, mediante generatore pseudocasuale, fornisce l'informazione della casella successiva, adiacente a quella in cui si trova, dove intende posizionarsi. Considerando che le caselle adiacenti sono complessivamente 8, comprese quelle connesse mediante un angolo, è sufficiente far si che il generatore pseudocasuale produca 8 valori distinti e univocamente interpretabili da spedire al server. Il valore di N (≥ 10) è arbitrario e lo stesso dicasi per M (≥ 2).
Si realizzi il programma C Poker che fornisce il servizio del gioco del poker mediante connessione connessa (socket stream), accettando richieste di connessione sulla porta 49000, oppure un'altra porta passata come parametro durante la fase di attivazione.
Il numero dei giocatori client può essere qualunque purchè ciascuno si qualifichi prima dell'inizio della partita, cosicchè il server può rispondere fornendo un numero pos di identificazione. Il client risponde restituendo al server tale numero il quale fornisce al client le 5 carte medinate il comando pend. Ogni richiesta di sostituzione di carta va effettuata con il comando serve ed il numero di carte, eventualmente nullo, se si è serviti. Anche in questo caso il server risponderà con un pend.
Si supponga che ciascun giocatore acceda al servizio Poker mediante l'utilizzo di un client TELNET. Si definisca esattamente il protocollo di gioco a partire dai comandi appena illustrati, aggiungendone degli altri se necessario, e si implementino le azioni del server sulla falsa riga dello schema discusso a lezione.
Si mostri, mediante una simulazione di gioco la lista dei comandi passati fra client e server e si realizzi all'interno del server la gestione del mazzo di carte e della loro sostituzione, facendo riferimento alla presenza di più giocatori contemporaneamente.
Voice over IP (Voce su Internet), acronimo VoIP, è una tecnologia che consente le conversazioni telefoniche sfruttando una connessione Internet, o altra rete che utilizza il protocollo IP, anzichè usare la rete telefonica tradizionale (PSTN). I pacchetti di dati, istradati sulla rete solo nel momento in cui è necessario (cioè quando uno degli utenti collegati sta parlando), contengono informazioni vocali, codificate in forma digitale. Pertanto, la tecnologia VoIP richiede l'impiego contemporaneo di due protocolli di comunicazione: l'uno per il trasporto dati (pacchetti voce su IP) e l'altro, nella grande maggioranza delle implementazioni di VoIP, il protocollo RTP (Real-time Transport Protocol).
Partendo dalla documentazione ufficiale RFC della rete Internet, si considerino le specifiche RFC3550 e RFC1889, per il protocollo RTP, protocollo di livello applicativo per servizi in tempo reale (come l'interattività audio e video), e se ne discuta le caratteristiche: identificazione del payload type, il sequence numbering, il timestamping, il monitoring, ecc...