Data: 2023/04/16

Tags: C, esercizi, lezione 5, processi, inter-process communication, IPC, file I/O, socket I/O, fork, exec, message queue

Riassunto

Soluzioni degli esercizi assegnati durante la lezione 5, tenuta il 4 Aprile 2023.

Soluzioni

Esercizio 1

Scrivere i seguenti tre programmi:

a. Azione da server, comunica con un processo client tramite socket Unix; riceve l’indirizzo su cui ascoltare connessioni in ingresso tramite riga di comando; trasmette un file testuale al processo connesso una riga per volta

Hint: argomenti della funzione main

b. Azione da client, comunica con un processo server tramite socket Unix; riceve indirizzo per socket Unix e chiave di una message queue tramite riga di comando; processa ogni riga del file letto calcolandone il numero di caratteri non blankspace, scrivendo un messaggio sulla coda contenente: numero righe lette, media del numero caratteri non blankspace calcolata sulle righe finora processate, e parola più lunga in una riga

Hint: usare struct msgbuf come vista negli esempi (solo due membri), e va dichiarata in un apposito file msgqstruct.h; può essere utile interpretare il membro mtext come byte e non come stringa C

c. Azione da wrapper e punto di avvio del programma multi-process: crea una message queue, lancia i due programmi dei punti a e b in nuovi processi tramite fork ed execXX fornendo i parametri necessari al loro funzionamento; legge i messaggi dalla coda, stampando a video i risultati, ed infine termina l’esecuzione non appena il numero di righe lette eguaglia il termine del file

Hint: si assume che questo processo conosca a priori il numero di righe del file e che utilizzi la stessa dichiarazione per la struct dei messaggi presente nel file msgqstruct.h; i programmi dei punti a e b devono essere compilati separatamente da quello del punto c

Programma a: lettura di file una riga alla volta, trasmissione della stessa tramite socket Unix.

Header msgqstruct.h: struct usata dai programmi b e c per rappresentare il messaggio in una message queue secondo i vincoli dei soli due campi di default.

Programma b: ricezione di una riga di file tramite socket Unix, processing (numero non-blanks, media, e parola più lunga), ed invio risultati tramite message queue.

Programma c: setup dei child processes che eseguono i programmi a e b; ricezione riga processata di un file tramite message queue, stampa a video dei risultati.

Nota: i programmi a e b devono essere stati compilati in modo tale da generare file eseguibili denominati rispettivamente program_file_reader e program_line_processor.