====== Esercitazione 10: Segnali ====== Dove si sperimentano segnali e loro gestione ... ==== Esercizio 1: Gestire SIGINT, SIGTERM e SIGUSR1 ==== Realizzare un programma C che stampi gli interi in ordine crescente su stdout a intervalli di 1 secondo. In questo programma, personalizzare SIGINT e SIGTERM in modo da stampare un breve msg di saluto si stderr prima di terminare il processo. Personalizzare SIGUSR1 in modo da effettuare una stampa su stderr (es. "Ho ricevuto SIGUSR1") e poi continuare l'elaborazione. Realizzare due versioni del programma che realizzino la gestione secondo le due strutture discusse a lezione: - Utilizzare //sigaction// ed i gestori. Fare in modo che il gestore registrato utilizzi solo funzioni garantite essere //asynchronous signal safe// e che l'arrivo contemporaneo dei due segnali non interrompa il gestore. - Utilizzare //sigwait// ed un thread dedicato. Ricordarsi che la sigwait funziona correttamente solo se i segnali sono bloccati su titti i thread, incluso quello che effettua la sigwait stessa. ==== 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