ESERCIZI per il LABORATORIO di SISTEMI OPERATIVI

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.

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. Ricerca di un Pattern

    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>
    dove -d è il flag che introduce la la lista opzionale di directory da cercare in sostituzione della directory corrente di default. Inoltre, il flag -n introduce il parametro opzionale N che limita il numero massimo di volte che il pattern pattern deve essere trovato.

  2. SMX: Short Message EXchange

    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.

  3. Implementazione di Telnet con SSH

    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 ]
    con l'obiettivo di presentare all'utente un'interfaccia per ssh come se si fosse invocato il comando telnet. Dunque, quando l'utente lancia il comando xtelnet il terminale si comporta come se fosse stato eseguito l'usuale comando telnet ma, poi, la connessione viene realizzata tramite il più sicuro ssh. Considerare dettagliamente tutti gli aspetti implementativi in modo da fare apparire la realizzione trasparente rispetto all'utente. A questo proposito si tenga presente che il banner di telnet deve apparire nella forma seguente

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

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. Maze mediante thread

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

  2. Gioco del Poker mediante connessione connessa

    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.

VoIP: Voice over IP

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


  1. usando il comando
    HELLO <player>
  2. dal server si riceve la stringa
    PASS <pos>
  3. il client replica con
    READY <pos>
  4. il server fornisce le carte richieste con
    PEND <card> <card> ...
  5. il client chiede carte con
    SERVE <pos> <ncards>
  6. il server sostituisce le carte con
    PEND <card> <card> ...