====== Esercizio 0: Gestire SIGINT e SIGTERM ====== Personalizzare SIGINT e SIGTERM in modo da stampare un breve msg di saluto prima di terminare il programma. 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 ''sleep()'' per settare il timeout di 1 secondo. La sleep viene interrotta dal segnale SIGCHLD ed in caso di interruzione ritorna come valore il numero di secondi rimasti. Usare le macro definite per la ''waitpid()'' per testare il tipo di terminazione