====== Esercitazione 9: segnali ====== ====== Esercizio 0: Gestire SIGINT e SIGTERM ====== Personalizzare SIGINT e SIGTERM in modo da stampare un breve msg di saluto prima di terminare il processo. Fare in modo che il gestore utilizzi solo funzioni garantite safe e che l'arrivo contemporaneo dei due segnali non interrompa il gestore. ====== Esercizio 1: killshell ====== Realizzare una shell rudimentale che legge un comando con eventuali parametri dallo standard input e ne invoca l'esecuzione utilizzando la ''execvp''. La shell deve terminare se viene digitato il comando ''exit'' e deve inviare un segnale SIGINT al figlio se l'esecuzione del comando dura piu' di 1 secondo. Ogni volta che un figlio termina, //killshell// deve stampare un breve messaggio su standard error, indicando il numero del processo terminato, la causa di terminazione (exit o kill) e la causa della terminazione (il segnale ricevuto nel caso della kill oppure lo stato nel caso della exit). Utilizzare la ''alarm()'' per settare il timeout di 1 secondo. La alarm viene interrotta dal segnale SIGCHLD. Usare le macro definite per la ''waitpid()'' per testare il tipo di terminazione ====== Esercizio 2: alarmserver ====== Realizzare un server ''alarmserver'' che attende sul socket ''alarmsocket'' le richieste di sveglia da parte dei client. Il formato dei messaggi e' il seguente seconds wakeup_msg il server attende per ''seconds'' secondi e poi invia al client che ha richiesto la sveglia ''wakeup_msg'' sul connection socket. Il server deve essere in grado di gestire piu' richieste di attesa contemporanee da parte di diversi client. Realizzare il client e testare alarmserver. ====== Esercizio 3: cunit ======= Utilizzare il framework di test [[http://cunit.sourceforge.net/|cunit]] per organizzare i test su ''alarmserver''.