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. Archiviazione e Compressione

    Utilizzando come base dell'implementazione i comandi di shell zip e unzip per archiviare file e direttori, si realizzi il comando di compressione tbm dei file e directory passati come parametri. La sintassi generale del comando da implementare ha il seguente schema
    tbm   c|l|x|i   tbmfile  file ... dir ...

    dove il primo parametro, scelto fra c, l, x o i, rappresenta una delle azioni create, list, extract oppure insert. Il parametro successivo tbmfile definisce l'archivio compresso nel quale sono inseriti i rimanenti parametri file ... dir .... Il nome dell'archivio deve avere estensione .tbm. Si consulti il manuale in linea del comando zip per i dettagli del suo utilizzo.

  2. Sequenza di Attivazione di una Lista di Processi

    Partendo dal comando predefinito ps -o "FORMAT" dove l'opzione -o va scelta in base alle informazioni sullo stato del processo utili allo svolgimento dell'esercizio, si implementi il comando
    psview    cmd1   ...   cmdK
    che prende in ingresso una lista di comandi e li associa ai processi che li eseguono. Per ciascun processo, inoltre, va costruita la lista dei cosiddetti parent process in cui ciascun elemento è il processo padre del precedente. Ciascuna lista deve terminare col processo init, il padre di tutti i processi.

  3. Finger Sicuro

    Si consideri il problema di controllare l'accesso alle informazione degli utenti di un sistema remoto, visibile tramite un webserver, per mezzo di un meccanismo di autenticazione che richiede uname e passwd. Per essere autenticati il sistema si basa sul file passwd.db, derivato dal file di autenticazione di sistema /etc/passwd con la sostituzione del secondo campo :x: con un'opportuna passwd che consenta l'esecuzione del comando finger ai soli utenti autorizzati sulla macchina remota. La richiesta di esecuzione di tale comando avviene mediante la pagina HTML finger.html che deve contenere obbligatoriamente i campi uname e passwd.

    Si realizzi lo script CGI finger.cgi in modo da consentire l'esecuzione del comando solamente agli utenti autorizzati. Si preveda, inoltre, la possibilità di passare al comando finger ulteriori opzioni mediante appropriati campi della form. Ulteriori informazioni sul comando finger sono ottenibili mediante consultazione del manuale in linea "man finger".

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. Selezione di righe da un textfile

    Si realizzi il programma C select che accetta tre parametri, il secondo e il terzo essendo i numeri m ed n del gruppo di righe che si intendono selezionare dal file testuale filename passato come primo parametro. Pertanto, si tratta di realizzare in C il comando di shell

    select  filename m n

    dove filename è la stringa che rappresenta il nome del file da cui estrarre n - m + 1 righe, a partire dalla m-esima, e che devono essere prodotte come output del comando.

  2. Gioco della Briscola mediante thread

    Si realizzi il programma C briscola che simula il gioco della briscola mediante l'attivazione di N + 2 thread, essendo Nil numero di giocatori implementati come client. Come è noto, il gioco richiede un mazzo di carte cui i giocatori, a turno, "pescano" una carta per ripristinare quella "giocata" nella mano precedente.

    Si simuli l'andamento del gioco mediante la coppia di thread mazzo e play che, in qualità di server forniscono, rispettivamente, una nuova carta dal mazzo su richiesta del giocatore e, la sincronizzazione della "mano" attendendendo che tutti gli N giocatori giochino la carta selezionata e assegnando i punteggi.

    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. La realizzazione deve comprendere il traceback dell'andamento della partita. Si impieghi un generatore di numeri pseudocasuali per simulare il rimescolamento del mazzo.

  3. Gioco del Poker mediante connessione non connessa

    Si realizzi il programma C Poker che fornisce il servizio del gioco del poker mediante connessione non connessa (socket datagram), accettando richieste di connessione sulla porta 18256, 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, dopodichè attraverso una serie di richieste il server fornisce prima le carte, l'eventuale loro sostituzione e l'assegnazione della giocata al client che risulta vincitore. 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).

Piattaforma RoboCup

Assegnato il soccerserver della piattaforma RoboCup, si implementi un client asincrono , secondo le direttive descritte nel manuale d'uso e ampiamente discusse a lezione. Per la realizzazione del client ciascuna squadra è libera di utilizzare il software disponibile nelle pagine che descrivono il funzionamento di un player. Tuttavia, è necessario indicare chiaramente le parti specificatamente implementate da ciascuna squadra che dovrà controllare l'avatar messo a disposizione dalla piattaforma. La realizzazione deve permettere la clonazione di N processi clienti (fino a un massimo di 11) per ottenere una squadra capace di giocare una partita simulata.