====== Esercitazione 10: Segnali ====== ====== Esercizio 1: 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 essere //asynchronous signal safe// e che l'arrivo contemporaneo dei due segnali non interrompa il gestore. ====== Esercizio 2: 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 SIGKILL 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 3: 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. Nota: Utilizzare la SC alarm() per impostare la sveglia sul server; considerare che, in un dato istante, un solo allarme puo` essere schedulato per processo e che, nel caso di processi multi-threaded, il conseguente segnale SIGALRM viene inviato al processo e non ad uno specifico thread