Laurea in Ingegneria Informatica Corso di Sistemi Operativi Esercizi proposti per il laboratorio Esercitazione di laboratorio numero 05 -------------------------------------- Esercizio 01 (A & B) Comandi di shell per processi e ridirezione ------------------------------------------- A. Scrivere un programma C in grado di leggere dei valori interi e stampare su standard output fprintf (stdout, ...); i numeri pari e su standard error (stderr) fprintf (stderr, ...); i numeri dispari. Il programma termini una volta introdotto il valore nullo. Si utilizzi la ridirezione per: - leggere gli interi dal file "inFile.txt", invece che da standard input - scrivere i valori pari su file "pariFile.txt", invece che su standard output - scrivere i valori dispari su file "dispariFile.txt", invece che su standard error. B. Utilizzare pipe e ridirezione su comandi di shell per effettuare le seguenti operazioni: - contare il numero di file/direttori di primo livello all'interno della propria cartella "home" - una volta scaricati i testi del laboratorio in un qualsiasi direttorio, visualizzare il numero totale di stringhe nei file lab01.txt, lab02.txt, e lab03.txt - contare il numero di processi attivi sul sistema che hanno come proprietario l'utente "root". (Suggerimento: si ispezioni mediante il comando man, l'opzione -U del comando ps) Esercizio 02 Exchange-sort concorrente su file --------------------------------- Premessa numero 1. L'algoritmo di ordinamento per scambio (exchange-sort o bubble-sort) ordina un vettore mediante il confronto di elementi contigui. La seguente e' una possibile implementazione (con ordinamento del vettore v di n elementi): for (i=0; i v[j+1]) { val = v[j]; v[j] = v[j+1]; v[j+1] = val; } } } Premessa numero 2. Un file binario puo' essere scritto (funzione UNIX write) e letto (funzione unix read) in maniera casuale utilizzando la funzione lseek. Ad esempio, il programma lab05ex02.c una volta ricevuto il nome di un file sulla riga di comando, - scrive nel file il vettore vet di 12 elementi - rilegge il file a partire dall'ultima riga. Specifiche dell'esercizio. Si implementi in maniera *concorrente* e *multi-processo* l'algortimo di bubble-sort. L'algoritmo, utilizzando le system call fork e wait e condividendo dati su file (i.e., leggendo e scrivendo dati sullo stesso file) deve effettuare l'ordinamento del file stesso. Il programma (il padre): - riceve sulla riga di comando il nome di un file contenente un numero predefinito n di interi. - a ogni iterazione del ciclo esterno "simula" l'azione del ciclo interno generando (n-1-i) processi figlio. Ognuno dei figli - legge due elementi adiacenti nel file - ne effettua lo scambio qualora necessario - li riscrive su file - si sincronizza con gli altri processi figli per generare l'effetto globale di ordinamento (i.e., a ogni iterazione del ciclo esterno il valore maggiore tra quelli rimanenti, viene spostato in fondo al file) - termina. Osservazioni ------------ 1. Operare su file e' indispensabile in quanto un processo padre e uno figlio non condividono lo spazio di indirizzamento (quindi ordinando un vettore, ordinerebbero di fatto vettori diversi). 2. Il programma puo' essere generalizzato facendo in modo che il primo degli interi memorizzati su file indichi il numero di interi successivi presenti nel file. 3. Gestire un file binario semplifica il posizionamento sul dato di posizione i. Infatti, nel caso di file ASCII, il numero di caratteri occupati da un intero non sarebbe costante, come nel caso di file binari, ma dipenderebbe dal suo valore: - 5 -> codifica ASCII = 1 carattere -> codifica binaria = sizeof (int) byte, - 12345 -> codifica ASCII = 5 caratteri -> codifica binaria = sizeof (int) byte Inoltre nel primo caso occorrerebbe contare anche caratteri "aggiuntivi", quali il '\n' di fine riga. Esercizio 03 Utilizzo di segnali ------------------- Scrivere un programma che mediante l'utilizzo di segnali sincronizzi due processi (un padre e un figlio) in modo che stampino alternativamente uno specifico messaggio. Il seguente e' un esempio di output: Child Woke-up Father Woke-up Child Woke-up Father Woke-up Child Woke-up Father Woke-up Child Woke-up Father Woke-up ... Inserire sleep opportune per evitare corse critiche. Esercizio 04 Segnali e comunicazione mediante file ------------------------------------- Implementare un programma C che crea due figli, un produttore e un consumatore. Il figlio produttore legge da tastiera delle stringhe e le trasferisce al consumatore. Il figlio consumatore converte le stringhe in caratteri maiuscoli e le visualizza su standard output. L'introduzione della stringa "end" termina entrambi i processi figli e quindi il processo padre, in sequenza. Il trasferimento delle stringhe avvenga attraverso file. Suggerimenti 1) Derivare la soluzione da quella dell'esercizio precedente 2) I processi che comunicano non sono padre e figlio ma due "fratelli"; quindi occorre fare in modo che ciascun figlio conosca il PID del processo "fratello".