Eventi asincroni. Sistemi Operativi II - Corso di laurea in Ingegneria Informatica. Sirio Scipioni

Documenti analoghi
Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 modulo 3

Vi sono spesso eventi importanti da notificare ai processi:

Processo in esecuzione

Processo in esecuzione

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

Sincronizzazione tra processi in Unix: i segnali

LABORATORIO DI SISTEMI OPERATIVI

Sincronizzazione tra processi UNIX: i segnali. Sincronizzazione tra processi

Laboratorio di sistemi operativi A.A. 2010/2011 Gruppo 2 Gennaro Oliva 18 Segnali

Sincronizzazione tra processi. Sincronizzazione tra processi. segnali. Segnali UNIX

Sincronizzazione tra processi in Unix: : i segnali. Sistemi Operativi T AA

Sincronizzazione tra processi! in Unix: i segnali!

Sincronizzazione tra processi in Unix: i segnali

Quinta Esercitazione. Principali primitive di accesso ai File

Programmazione di sistema in Linux: System Call per i Segnali. E. Mumolo

Segnali. Tecnica di comunicazione asincrona tra processi. Si può solo inviare uno tra un insieme fissato di segnali

I segnali. First the signals described in the original POSIX standard.

Il sistema operativo LINUX Indice

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill!

Terza Esercitazione. Gestione di segnali in Unix Primitive signal e kill

POSIX - Gestione dei Segnali. E.Mumolo, DEEI mumolo@units.it

Segnali. Un segnale e' un interrupt software. La terminologia corretta e' exception mentre interrupt e' usata solo per gli interrupt hardware

Processi - II. Franco Maria Nardini

Modulo 7 System call relative ai segnali

Processi - II. Franco Maria Nardini

Processi. Segnali. Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Processi Aspetti avanzati. Terminazione Segnali

Corso di Laboratorio di Sistemi Operativi A.A

Laboratorio di Sistemi Operativi

Programmazione di Sistema

LINUX: struttura generale

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

Signalling (IPC) Signalling (segnalazione)

Segnali. #include <signal.h> Segnali

I segnali possono essere pensati come degli interrupts software ;

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Segnali. Sono interruzioni software

LABORATORIO DI SISTEMI OPERATIVI

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

Esempi. Sincronizzazione tra processi: I Segnali. I segnali sono interrupt software, che segnalano il verificarsi di eventi asincroni:

Segnali. Sono interruzioni software

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

System call per la gestione di processi

System call per la gestione di processi

Processi e Sincronizzazione. Laboratorio Software C. Brandolese M. Grotto

Segnali. I segnali in Unix sono un meccanismo semplice per inviare degli interrupt software ai processi.

La creazione di un nuovo processo in UNIX

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati)

Sistemi Operativi T. Esercizi

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ;

Esercizio sulla gestione di file in Unix. Sistemi Operativi T AA

Avvio. La funzione main puo' avere due argomenti argc ed argv, ma in realta' oltre a argc ed argv c'e' qualche cosa di piu'.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Gestione di eventi asincroni: 1. Nozioni di base 2. Segnali UNIX 3. Messaggi evento Windows

Modulo 5: Programmazione di sistema Parte E: Segnali e pipe

POSIX Systems Programming. geek evening 0x0d. ambienti POSIX. By lord_dex ZEI e Salug! presentano:

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Sistemi Operativi. Marzo-Giugno 2011 matricole congrue 0 mod 3. Controllo dei processi - I

Esame Laboratorio di Sistemi Operativi Cognome Nome Mat.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Modulo extra: Inter Process Communication (IPC)

Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

Seconda Esercitazione. Gestione di processi in Unix Primitive Fork, Wait, Exec

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

Gestione di eventi 1. Nozioni di base: eventi e segnalazioni 2. Segnali UNIX 3. Messaggi evento Windows

I Processi nel Sistema Operativo Unix. Gerarchie di processi Unix. Stati di un processo Unix. Stati di un processo Unix.

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Sistemi Operativi Teledidattico

Laboratorio di Sistemi Operativi

/* I1 seguente programma mostra come lo Standard Input ha descrittore O e lo

Sistemi Operativi (M. Cesati)

Sistemi Operativi. Esercitazione 8. Corso di Laurea Triennale in Ingegneria Informatica.

Pag. 1. modello di esecuzione parallela

Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica. SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto

I.I.S. G.B. PENTASUGLIA MATERA ISTITUTO TECNICO SETTORE TECNOLOGICO LICEO SCIENTIFICO SCIENZE APPLICATE. Classe: 5Ci

Simulazione esame Laboratorio di Sistemi Operativi Cognome Nome Mat.

Sistemi operativi. Corso di Laurea Triennale in Ingegneria Informatica. Lezione 8 Semaphore.h Segnali Shell e processi

Controllo dei Processi 1

Esercitazioni 13 e 14

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore,

Corso di Informatica Modulo T3 1-Nucleo e processi

Esercitazione [08] Server multi-process/multi-thread

System Calls per la Gestione dei Processi

Corso di Reti di Calcolatori L-A

Processi in Unix. Capitolo 8 -- Stevens

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi (M. Cesati)

Esercitazione [7] Client/Server con Socket

Esercitazione 4. Gestione dei file in Unix

Corso di Reti di Calcolatori L-A

Threads: 1. Concetti di base 2. Threads in sistemi operativi attuali (NT/UNIX)

Gestione degli eventi 1. Nozioni di base: eventi e segnalazioni 2. Segnali UNIX 3. Messaggi evento Windows

Transcript:

Eventi asincroni Sistemi Operativi II - Corso di laurea in Ingegneria Informatica Sirio Scipioni scipioni@dis.uniroma1.it http://www.dis.uniroma1.it/~scipioni MIDLAB http://www.dis.uniroma1.it/~midlab

Sommario Nozioni di base Gestione non sicura dei segnali Gestione sicura dei segnali Sirio Scipioni Eventi asincroni Slide 2

Nozioni di base I meccanismi di segnalazione sono un semplice mezzo tramite il quale l accadimento di un evento può essere notificato ad un processo. Il processo può eventualmente eseguire specifiche azioni associate a tale accadimento. Una segnalazione è talvolta classificata come un semplice messaggio, tuttavia essa differisce da un messaggio in diversi modi quali: Una segnalazione viene in genere inviata occasionalmente da un processo, molto più spesso dal sistema operativo come risultato di un evento eccezionale (es. errore di calcolo in virgola mobile). Una segnalazione può non avere contenuto informativo, in particolare il ricevente può non arrivare a conoscere l identità di chi emette la segnalazione. Sirio Scipioni Eventi asincroni Slide 3

Trattamento delle segnalazioni Trattare le segnalazioni è molto importante per i programmatori perché il sistema operativo invia in modo asincrono segnalazioni indipendentemente dalla volontà dei processi. Se i processi decidono di non ignorarle esplicitamente o di non catturarle, essi possono venir automaticamente terminati. La gestione dei segnali prevede tre possibilità per un processo: Catturare il segnale: verrà eseguita quindi una funzione specificata dal programmatore. Ignorare esplicitamente il segnale: in questo caso il processo scarta semplicemente il segnale (non è possibile per tutti i segnali). Ignorare implicitamente il segnale: il processo accetta il comportamento di default predefinito dal sistema operativo. Sirio Scipioni Eventi asincroni Slide 4

Segnali UNIX più frequenti SIGHUP: Hangup. Il processo riceve questo segnale quando il terminale a cui era associato viene chiuso (ad esempio nel caso di un xterm) oppure scollegato (ad esempio nel caso di una connessione via modem o via telnet). SIGINT: Interrupt. Ricevuto da un processo quando l utente preme la combinazione di tasti di interrupt (solitamente Control + C). SIGQUIT: Quit. Simile a SIGINT, ma in più, in caso di terminazione del processo, il sistema genera un core dump, ovvero un file che contiene lo stato della memoria al momento in cui il segnale SIGQUIT è stato ricevuto. Solitamente SIGQUIT viene generato premendo i tasti Control+. SIGILL: Illegal Instruction. Il processo ha tentato di eseguire un'istruzione proibita (o inesistente). SIGKILL: Kill. Questo segnale non può essere catturato in nessun modo dal processo ricevente, che non può fare altro che terminare. Mandare questo segnale è il modo più sicuro e brutale per uccidere un processo. Sirio Scipioni Eventi asincroni Slide 5

Segnali UNIX più frequenti SIGSEGV: Segmentation violation. Generato quando il processo tenta di accedere ad un indirizzo di memoria al di fuori del proprio spazio. SIGPIPE: Broker Pipe. Generato quando il processo tenta di scrivere su una PIPE per la quale non esistono processi in lettura. SIGTERM: Termination. Inviato ad un processo come richiesta non forzata di terminazione. SIGALRM: Alarm. Inviato ad un processo allo scadere del conteggio dell'orologio di allarme. SIGCHLD: Child death. Inviato ad un processo quando uno dei suoi figli termina. SIGUSR1, SIGUSR2: User defined. Non hanno un significato preciso, e possono essere utilizzati dai processi utente per implementare un rudimentale protocollo di comunicazione e/o sincronizzazione. Sirio Scipioni Eventi asincroni Slide 6

Comportamenti di default Il comportamento di default tenuto da un processo alla ricezione di un segnale dipende dal sistema operativo; molti SO si attengono però alle seguenti indicazioni: t u t t i i s e gnali, t ranne S I G K I L L e S I G C H L D, s o n o i gnorati implicitamente ed al loro arrivo il processo destinatario termina. SIGCHLD è ignorato implicitamente, ma il suo arrivo non provoca la terminazione del processo destinatario. SIGKILL non è ignorabile, ed il suo arrivo provoca la terminazione del processo destinatario. Sirio Scipioni Eventi asincroni Slide 7

Generazione di segnali int kill(int pid, int segnale); Descrizione: richiede l invio di un segnale. Argomenti: 1. pid: identificatore del processo destinatario del segnale; 2. segnale: specifica il numero del segnale da inviare. Restituzione: -1 in caso di fallimento. UNIX permette di inviare segnali esclusivamente ad altri processi avviati dallo stesso utente. L unica eccezione è data dall utente ROOT (amministratore) che può inviare segnali a qualsiasi processo esistente. La system call kill è asincrona (non bloccante): il processo mittente prosegue immediatamente nell esecuzione del proprio codice, mentre al destinatario viene notificato il segnale. Slide 8

Generazione di segnali int raise(int segnale); Descrizione: invia un segnale al processo corrente. Argomenti: 1. segnale: specifica il numero del segnale da inviare. Restituzione: -1 in caso di fallimento. Slide 9

Generazione di segnali E possibile programmare la generazione temporizzata di uno specifico segnale: unsigned int alarm(unsigned int seconds); Descrizione: programma un timer interno al sistema operativo in modo tale che questo invii un segnale specifico al processo stesso dopo un lasso di tempo definito. Argomenti: 1. seconds: Il numero di secondi dopo il quale verrà notificato il segnale. Restituzione: il numero di secondi rimanenti alla generazione di un evento impostato da una precedente chiamata ad alarm. Il segnale generato è di tipo SIGALRM; Effettuare una chiamata ad alarm quando ne era stata già effettuata un altra non fa altro che impostare il valore del timer pari al numero di secondi specificato nell ultima chiamata. Slide 10

Catturare i segnali void (* signal(int sig, void (*func)(int)))(int); Descrizione: specifica il comportamento che il processo terrà alla ricezione di uno specifico segnale. Argomenti: 1. sig: Il numero del segnale per il quale si vuole specificare il comportamento; 2. func: puntatore alla funzione di gestione del segnale oppure SIG_DFL / SIG_IGN. Restituzione: SIG_ERR in caso di errore, altrimenti il valore della precedente funzione di gestione del segnale che viene sovrascritto con func. SIG_DFL impone al processo il comportamento di default. SIG_IGN impone al processo di ignorare esplicitamente il segnale. Slide 11

Attendere un segnale int pause(void); Descrizione: blocca il processo in attesa di un qualsiasi segnale. Restituzione: sempre -1. pause ritorna sempre al completamento della funzione di handling del segnale. Non è possibile sapere direttamente da pause quale segnale ha provocato lo sblocco; si può rimediare facendo si che l handler del segnale modifichi il valore di una variabile globale. Slide 12

Eredità delle impostazioni Come vengono gestite le impostazioni dei segnali quando si creano nuovi processi figli? il comportamento associato alla ricezione di un segnale viene ereditato dai processi figli. per quanto riguarda le funzioni del tipo execx(), solo le impostazioni di SIG_IGN e SIG_DFL vengono mantenute, mentre per ogni segnale armato con una specifica funzione di gestione viene automaticamente impostato il comportamento di default. ovviamente il nuovo programma può definire al suo interno una nuova gestione dei segnali. Slide 13

Interruzione della computazione Alla ricezione di un segnale, la computazione in un processo viene interrotta. In che modo riprende, una volta completata la fase di gestione del segnale? Se la computazione interrotta era l'esecuzione di una generica istruzione in modo utente, essa riprende da dove era stata interrotta (istruzione macchina puntata dal program counter prima della gestione del segnale). Nozione di software interrupt. Se la computazione interrotta era una system call su cui il processo era bloccato, la system call viene abortita (fallisce) e la variabile globale errno (codice di errore) viene settata al valore EINTR (si veda l header file errno.h ). ATTENZIONE: la system call abortita non viene richiamata automaticamente! System call che non bloccano il processo sono eseguite in modo atomico e non vengono mai interrotte da alcun segnale. Slide 14

System call bloccanti Alla luce di quanto detto la corretta invocazione di una system call bloccante è di questo tipo: while ( systemcall() == -1 ) if ( errno!= EINTR ) { printf ( Errore!\n ); exit(1); Lo schema seguente non basta: if ( systemcall() == -1 ) { printf ( Errore!\n ); exit(1); Slide 15

Esempio 1 #include <stdio.h> #include <fcntl.h> #include <signal.h> /* a questa funzione sarà demandata la gestione del segnale SIGALRM */ void gestione_timeout() { printf("*** I m alive! ***\n"); /* ATTENZIONE! Dobbiamo riarmare il segnale!!! */ signal(sigalrm, gestione_timeout); alarm(5); int main(int argc, char *argv[]) { char c; /* impostiamo la gestione del segnale SIGALRM */ signal(sigalrm, gestione_timeout); /* impostiamo la generazione del segnale (5 secondi) */ alarm(5); /* nel frattempo continuiamo a fare le nostre operazioni */ while(1) read(0, &c, 1); Slide 16

Esempio 2 /* TCP Server multiprocesso */ /* dichiarazioni ed include */ /* dichiariamo il gestore del segnale */ void handler_sigint(); int main(int argc, char *argv[]) { /* definizione variabili */ /* interpretazione linea di comando */ /* creazione socket */ /* bind e listen sul socket */ /* armiamo il segnale */ signal(sigint, handler_sigint); /* loop infinito */ /* Definizione del gestore del segnale */ void handler_sigint(){ /* Chiudiamo i socket */ close(list_s); close(conn_s); exit(0); Slide 17

Problemi con segnali inaffidabili La gestione dei segnali vista fino ad ora presenta due problemi: 1. Reset del gestore dopo una notifica del segnale: signal(sigint, sig_int); void sig_int() { signal(sigint, sig_int); Esiste una finestra temporale all interno della quale la notifica di un secondo segnale può far terminare il processo (prima della nuova signal() è attiva la gestione di default!). Slide 18

Problemi con segnali inaffidabili La gestione dei segnali vista fino ad ora presenta due problemi: 1. Reset del gestore dopo una notifica del segnale: signal(sigint, sig_int); void sig_int() { signal(sigint, sig_int); Esiste una finestra temporale all interno della quale la notifica di un secondo segnale può far terminare il processo (prima della nuova signal() è attiva la gestione di default!). Slide 18

Problemi con segnali inaffidabili 2. Attesa di un segnale: int segnale_arrivato=0; signal(sigint, sig_int); if (! segnale_arrivato) { pause(); /*Il processo attenderà un ulteriore segnale */ void sig_int() { signal(sigint, sig_int); segnale_arrivato = 1; Esiste una finestra temporale all interno della quale la notifica di un segnale può Slide 19

Problemi con segnali inaffidabili 2. Attesa di un segnale: int segnale_arrivato=0; signal(sigint, sig_int); if (! segnale_arrivato) { pause(); /*Il processo attenderà un ulteriore segnale */ void sig_int() { signal(sigint, sig_int); segnale_arrivato = 1; Esiste una finestra temporale all interno della quale la notifica di un segnale può Slide 19

Gestione affidabile dei segnali Un processo può bloccare temporaneamente la consegna di un segnale (escluso il SIGKILL). Un eventuale segnale bloccato non viene perso, ma rimane pendente fino a che: il processo lo sblocca (e quindi il segnale viene consegnato); il processo sceglie di ignorare il segnale. Un processo può modificare l azione da eseguire prima della consegna del segnale. Il blocco dei segnali viene realizzato impostando opportunamente i bit costituenti la cosiddetta signal mask del processo. La signal mask rappresenta l insieme dei segnali che il processo sta bloccando. La modifica avviene per mezzo di un apposita struttura dati: sigset_t. Slide 20

Signal Set Il tipo sigset_t rappresenta un insieme di segnali (signal set). Il SO ci mette a disposizione una serie di funzioni (definite in signal.h) per la gestione dei signal set: int sigemptyset (sigset_t *set); Svuota set. int sigfillset (sigset_t *set); Mette tutti i segnali in set. int sigaddset (sigset_t *set, int signo); Aggiunge il segnale signo a set. int sigdelset (sigset_t *set, int signo); Toglie il segnale signo da set. int sigismember (sigset_t *set, int signo); Controlla se signo è in set. Slide 21

Gestione della signal mask int sigprocmask(int how, const sigset_t *set, sigset_t *oset); Descrizione: modifica la signal mask. Argomenti: 1. how: indica in che modo intervenire sulla signal mask e può valere: SIG_BLOCK: i segnali indicati in set sono aggiunti alla signal mask; SIG_UNBLOCK: i segnali indicati in set sono rimossi dalla signal mask; SIG_SETMASK: La nuova signal mask diventa quella specificata da set; 2. set: il signal set sulla base del quale verranno effettuate le modifiche. 3. oset: se non è NULL, in questa variabile verrà scritto il valore della signal mask PRIMA di effettuare le modifiche richieste. Restituzione: -1 in caso di errore. Slide 22

Segnali pendenti int sigpending(sigset_t *set); Descrizione: restituisce l insieme dei segnali bloccati che sono attualmente pendenti. Argomenti: 1. set: il signal set in cui verrà scritto l insieme dei segnali pendenti. Restituzione: -1 in caso di errore. Slide 23

Gestione dei segnali int sigaction(int sig, const struct sigaction * restrict act, struct sigaction * restrict oact); Descrizione: Permette di esaminare e/o modificare l azione associata ad un segnale. Argomenti: 1. sig: il segnale interessato dalla modifica; 2. act: indica come modificare la gestione del segnale; 3. oact: in questa struttura vengono memorizzate le impostazioni precedenti per la gestione del segnale. Restituzione: -1 in caso di errore. Slide 24

La struttura sigaction struct sigaction { void (*sa_handler)(); /* indirizzo del gestore o SIG_IGN o SIG_DFL*/ void (*sa_sigaction)(int, siginfo_t *, void*); /* indirizzo del gestore che riceve informazioni addizionali sul segnale ricevuto (utilizzato al posto di sa_handler se sa_flags contiene SA_SIGINFO ) */ sigset_t sa_mask; /* segnali addizionali da bloccare prima dell'esecuzione del gestore */ int sa_flags; /* opzioni addizionali */ ; Notifiche (eventualmente multiple) dello stesso segnale durante l esecuzione del gestore sono bloccate fino al termine del gestore stesso (a meno che sa_flags valga NO_DEFER). Con l uso di sigaction l azione specificata per il trattamento di un segnale rimane attiva fino ad una successiva modifica. Slide 25

Attesa di un segnale int sigsuspend(const sigset_t *sigmask); Descrizione: attende l arrivo di un segnale. Argomenti: 1. sigmask: prima di mettersi in attesa la funzione rende attiva questa signal mask; Restituzione: sempre -1 con errno che vale EINTR. sigsuspend, una volta terminata, ripristina la signal mask precedente alla sua chiamata. Quando viene attivata, se esistono segnali pendenti che vengono sbloccati da sigmask, questi vengono immediatamente consegnati. Se non esistono segnali pendenti, oppure questi non vengono sbloccati, la funzione mette il processo in attesa dell arrivo di un qualsiasi segnale non bloccato. Slide 26

Esempio 3 (1) #include <signal.h> #include <unistd.h> /* Il gestore del segnale SIGUSR1 */ void catcher(int signo) { static int ntimes = 0; printf("processo %d: SIGUSR1 ricevuto #%d volte\n",getpid(),++ntimes); int main() { int pid, ppid; struct sigaction sig, osig; sigset_t sigmask, oldmask, zeromask; sigemptyset(&zeromask); /* blocchiamo i segnali di tipo SIGUSR1 */ sigemptyset(&sigmask); sigaddset(&sigmask, SIGUSR1); sigprocmask(sig_block, &sigmask, &oldmask); /* installiamo il gestore del segnale */ sig.sa_handler = catcher; sigemptyset(&sig.sa_mask); sig.sa_flags = 0; sigaction(sigusr1, &sig, &osig); Slide 27

Esempio 3 (2) if((pid=fork()) < 0) { perror("fork error"); exit(1); else if(pid == 0) { /* Processo figlio */ ppid = getppid(); printf("figlio: mio padre e' %d\n", ppid); while(1) { sleep(1); kill(ppid, SIGUSR1); /* Sblocca il segnale SIGUSR1 e lo attende */ sigsuspend(&zeromask); else { /* Processo padre */ printf("padre: mio figlio e' %d\n", pid); while(1) { /* Sblocca il segnale SIGUSR1 e lo attende */ sigsuspend(&zeromask); sleep(1); kill(pid, SIGUSR1); Slide 28