Indice
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