Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf ·...

13
1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 modulo 3 Segnali: Interrupt software per la gestione di eventi asincroni Laboratorio di Sistemi Operativi 2 Concetto di segnale Un segnale è un interrupt software Un segnale può essere generato da un processo utente o 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 una costante intera (0) positiva definita in signal.h Il segnale e’ un evento asincrono; esso puo’ arrivare in un momento qualunque ad un processo ed il processo puo’ limitarsi a verificare, per esempio, il valore di una variabile, o può fare cose piu’ specifiche

Transcript of Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf ·...

Page 1: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 2: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 3: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 4: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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.

Page 5: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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.

Page 6: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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);

}

Page 7: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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.

Page 8: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 9: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 10: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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.

Page 11: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 12: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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

Page 13: Laboratorio di Sistemi Operativiprofs.scienze.univr.it/~cicalese/LSO/LSO08/Lez_12Mag_sig.pdf · 2008. 5. 18. · 1 Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue

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.