informatica:sol:laboratorio16:esercitazionib:esercitazione10

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:

  1. 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.
  2. 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

informatica/sol/laboratorio16/esercitazionib/esercitazione10.txt · Ultima modifica: 02/05/2016 alle 13:10 (8 anni fa) da Susanna Pelagatti