Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf ·...
Transcript of Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf ·...
1
Laboratorio di Sistemi OperativiMarzo-Giugno 2008
Matricole congrue 0 modulo 3
Segnali: Interrupt software per lagestione di eventi asincroni
Laboratorio di Sistemi O
perativi
2
Concetto di segnale
Un segnale è un interrupt software
Un segnale può essere generato da un processo utenteo dal kernel a seguito di un errore software o hardware
Ogni segnale ha un nome che comincia con SIG (ex.SIGABRT, SIGAL RM) a cui viene associato unacostante intera (≠ 0) positiva definita in signal.h
Il segnale e’ un evento asincrono; esso puo’ arrivare inun momento qualunque ad un processo ed il processopuo’ limitarsi a verificare, per esempio, il valore di unavariabile, o può fare cose piu’ specifiche
2
Laboratorio di Sistemi O
perativi
3
Azione associata ad un segnale
Le azioni associate ad un segnale sono le seguenti:
Ignorare il segnale (tranne che per SIGKILL eSIGSTOP)
Catturare il segnale (equivale ad associare unafunzione utente quando il segnale occorre; ex. se ilsegnale SIGTERM e’ catturato possiamo voler ripuliretutti i file temporanei generati dal processo)
Eseguire l’azione di default associata (terminazionedel processo per la maggior parte dei segnali)
Laboratorio di Sistemi O
perativi
4
Segnali in un sistema Unix
3
Laboratorio di Sistemi O
perativi
5
Funzione signal
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
Restituisce: SIG_ERR in caso di errore e il puntatore al precedente gestore del segnale se OK
Laboratorio di Sistemi O
perativi
6
Funzione signal
prende due argomenti: il nome del segnale signoed il puntatore alla funzione func da eseguirecome azione da associare all’arrivo di signo(signal handler) e
restituisce il puntatore ad una funzione cheprende un intero e non restituisce niente cherappresenta il puntatore al precedente signalhandler
4
Laboratorio di Sistemi O
perativi
7
Funzione signal
Il valore di func può essere:
SIG_IGN per ignorare il segnale (tranneche per SIGKILL e SIGSTOP)
SIG_DFL per settare l’azione associata alsuo default
L’indirizzo di una funzione che saràeseguita quando il segnale occorre
Laboratorio di Sistemi O
perativi
8
Terminologia e Semantica
Un segnale e’generato/inviato ad un processo
L’evento che determina il segnale avviene• Hardware o software
RecapitatoL’azione conseguente al segnale inizia
PendingGenerato ma non recapitato ancora
BloccatoSe l’azione relativa e’ quella di default o un
handler allora il segnale diventa pending fino allosblocco o se l’handler diventa quello di default.
5
Laboratorio di Sistemi O
perativi
9
Funzioni kill e raise
#include <sys/types.h>#include <signal.h>
int kill (pid_t pid, int signo);int raise (int signo);
Descrizione: mandano il segnale signo specificato come argomento
Restituiscono: 0 se OK, -1 in caso di errore
Laboratorio di Sistemi O
perativi
10
Funzioni kill e raise
kill manda un segnale ad un processo o ad un gruppodi processi specificato da pid
raise consente ad un processo di mandare un segnalea se stesso
pid > 0 invia al processo pidpid == 0 invia ai processi con lo stesso gid
del processo senderpid < 0 invia ai processi con gid uguale a |pid|pid = -1 invia a tutti processi con lo stesso real o
effective uid del processo sender.
6
Laboratorio di Sistemi O
perativi
11
Funzione pause
#include <unistd.h>
int pause(void);
Descrizione: sospende il processo finché non arrivaun segnale ed il corrispondente signal handler èeseguito ed esce
Restituisce: –1
Laboratorio di Sistemi O
perativi
12
#include <signal.h>
void sig_usr(int);
int main (void) {
signal(SIGUSR1, sig_usr);
signal(SIGUSR2, sig_usr);
for(; ;) pause();
}
void sig_usr(int signo) {
if(signo == SIGUSR1) printf(“SIGUSR1\n”);
else if (signo == SIGUSR2)printf(“SIGUSR2\n”);
else printf(“Segnale %d\n”,signo);
}
7
Laboratorio di Sistemi O
perativi
13
uso dell'esempio lanciare in background (&) il programma precedente e
vedere con che pid gira
scrivere un programma che manda il segnale a questoprocesso conkill(pid, SIGUSR1) ;kill(pid, SIGUSR2) ;
oppure usare kill(1) da linea di comandokill –USR1 pid //si otterra’ SIGUSR1
kill –USR2 pid //si otterra’ SIGUSR2
kill pid //si sta mandando SIGTERM e con esso il processo termina perche’ tale segnale non e’ catturato e di default termina
Laboratorio di Sistemi O
perativi
14
esercizioscrivere un programma che intercetta il
ctrl-C da tastiera e gli fa stampare unmessaggio.
8
Laboratorio di Sistemi O
perativi
15
Start-up di un programmaL’esecuzione di un programma tramite
fork+exec ha le seguenti caratteristicheSe un segnale è ignorato nel processo
padre viene ignorato anche nel processofiglio
Se un segnale è catturato nel processopadre viene assegnata l’azione di defaultnel processo figlio
Laboratorio di Sistemi O
perativi
16
Funzione alarm
#include <unistd.h>
unsigned int alarm (unsigned int secs);
Descrizione: setta un timer. Quando esso scade ilsegnale SIGALRM viene inviato al processochiamante
Restituisce: 0 o il numero di secondi prima dellascadenza di un allarme settato in precedenza
9
Laboratorio di Sistemi O
perativi
17
alarm
Se l’allarme precedentemente settatonon e’ scaduto viene sostituito con ilnuovo
Se esiste un allarme precedente esecs=0 l’allarme e’ resettato
Bisogna sempre prima definire l’handlerper SIGALRM e poi chiamare alarm
Laboratorio di Sistemi O
perativi
18
Signal set
Rappresentare insiemi di segnali:Tipo: sigset_t in signal.h
int sigemptyset(sigset_t *set)int sigfillset(sigset_t *set)int sigaddset(sigset_t *set, int signo)int sigdelset(sigset_t *set, int signo)
0 if OK, -1 on errorint sigismember(const sigset_t *set, int signo)
1 if TRUE, 0 FALSE, -1 error
10
Laboratorio di Sistemi O
perativi
19
Maschera dei segnali
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
Se oldset != NULL, old_set <-- old_mask
Se set != NULL allora usa how per cambiare come seguehow:
SIG_BLOCK new_mask = old_mask | setSIG_UNBLOCK new_mask = old_mask & ~setSIG_SETMASK new_mask = set
Se set = NULL, la maschera non viene cambiata e how e’ ignorato
Alla chiamata a sigprocmask, se un segnale sbloccato e ‘ pendng,viene recapitato prima che sigprocmask “ritorni”
Laboratorio di Sistemi O
perativi
20
Esercizio1
Scrivere un programma, prg1, che gestisce i segnali SIGUSR1,SIGUSR2, SIGINT mediante un handler che stampa il nome delsegnale ricevuto.
prg1 blocca i segnali SIGUSR1, SIGUSR2 e poi genera un figlio cheesegue il programma prg2 con parametri SIGUSR1, SIGUSR1,SIGNUSR2, SIGUSR2. Quindi attende che il figlio termini, poisblocca i segnali e termina.
Prg2 controlla se i segnali ricevuti su linea di comando sono bloccati.Se no, li blocca.
Quindi invia tali segnali a se stesso e al padre. Poi scrive a video “Hofinito” e termina.
11
Laboratorio di Sistemi O
perativi
21
Esercizio2
Il segnale SIGCHLD viene inviato ad un processoogni volta che uno dei suoi figli cambia stato.
Scrivere un programma che, usando un signalhandler che gestisce il SIGCHLD, cerca di evitareche i suoi figli possano diventare zombie.
Laboratorio di Sistemi O
perativi
22
Funzione sigpending
#include <signal.h>
int sigpending(sigset_t *set)
Descrizione: fornisce l’insieme dei segnali instato di pending perche’ bloccati.
Restituisce: 0 se OK, -1 in caso d’errore
12
Laboratorio di Sistemi O
perativi
23
Funzione sigaction
#include <signal.h>
int sigaction(int signo, const struct sigaction *restricted act,struct sigaction *restricted oldact)
Descrizione: modifica l’azione associata al segnalesigno. La modifica e’ specificata dalla struct act,se non-NULL. Se oldact non e’ NULL, la vecchiaazione per signo viene ritornata in oldact.
Restituisce: 0 se OK, -1 in caso d’errore
Laboratorio di Sistemi O
perativi
24
Funzione sigaction
Sigaction utilizza la seguente struttura
struct sigaction {void (*sa_handler) (int);sigset_t sa_mask;int sa_flags;void (*sa_sigaction)(int, siginfo_t *, void *);
};
Descrizione: modifica l’azione associata al segnale signo. Lamodifica e’ specificata dalla struct act,se non-NULL. Se oldact non e’ NULL, la vecchia azione persigno viene ritornata in oldact.
Restituisce: 0 se OK, -1 in caso d’errore
13
Laboratorio di Sistemi O
perativi
25
Funzione sigaction
Se il flag SA_SIGINFO e’ settato, allora sigaction usacome handler quello alternativo definito comevoid handler2(int signo, siginfo_t *info, void *context);
struct siginfo {int si_signo; /*signal number */pid_t si_pid; /*sending process pid */int si_status /*exit value *//* altri campi */
};
Laboratorio di Sistemi O
perativi
26
Esercizio 3
Scrivere un programma che definisce un handler per il segnaleSIGCHLD.
Quindi genera un figlio e lo ferma usando il segnale SIGTSTP. Dopo aver scritto a video che sta per far ripartire il figlio,gli manda il segnale SIGCONT (per farlo ripartire), poi usa
waitpid per aspettare che il figlio riparta e quindi esce.
Il figlio utilizza un signal handler per SIGTSTP per scrivere avideo sono stato fermato prima di fermarsi.
Dopo essere ripartito, il figlio scrive “sto per uscire” e quinditermina.