Programmazione di Sistema

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

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

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

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

LABORATORIO DI SISTEMI OPERATIVI

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

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

Sincronizzazione tra processi in Unix: i segnali

LINUX: struttura generale

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

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

Sincronizzazione tra processi UNIX: i segnali. Sincronizzazione tra processi

Programmazione a Oggetti Lezione 11. Eccezioni e Packages

Il sistema operativo LINUX Indice

Insegnamento di Laboratorio di algoritmi e strutture dati

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

Processi Aspetti avanzati. Terminazione Segnali

Le eccezioni in Java

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Segnali. #include <signal.h> Segnali

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

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

Sincronizzazione tra processi in Unix: i segnali

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Sincronizzazione tra processi! in Unix: i segnali!

Eccezioni e Thread (cenni)

Il linguaggio C. Istruzioni, funzioni, dati strutturati

Programmazione ad Oggetti

Gestione delle eccezioni in Java

Programmazione a Oggetti. Eccezioni

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

Le eccezioni in Java

Il linguaggio Java. Le eccezioni

Processo in esecuzione

Vi sono spesso eventi importanti da notificare ai processi:

Funzioni, Stack e Visibilità delle Variabili in C

Cast implicito. Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto. byte short int long float double

Processo in esecuzione

Signalling (IPC) Signalling (segnalazione)

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

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

Laboratorio di reti I

Le eccezioni in Java

System call per la gestione di processi

Eccezioni in Java A. FERRARI

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

System call per la gestione di processi

Cominciamo ad analizzare la rappresentazione delle informazioni... di Cassino. C. De Stefano Corso di Fondamenti di Informatica Università degli Studi

Sistemi Operativi (M. Cesati)

Funzioni, Stack e Visibilità delle Variabili in C

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

Modulo 7 System call relative ai segnali

eccezioni Alberto Ferrari Alberto Ferrari Programmazione di applicazioni SW

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

Segnali. Sono interruzioni software

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 5

Segnali. Sono interruzioni software

Gestire le situazioni di errore

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Spazio di indirizzamento virtuale

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Programmazione a oggetti

Astrazione procedurale

Introduzione ai thread

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Corso di Laboratorio di Sistemi Operativi A.A

Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Modulo 1: La gestione delle eccezioni Modulo 2: Programmazione concorrente

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'.

Quinta Esercitazione. Principali primitive di accesso ai File

Laboratorio di Sistemi Operativi

Le eccezioni in Java

Interrupts and Exceptions

I segnali possono essere pensati come degli interrupts software ;

Richiami sui Concetti Fondamentali dei Processi

Eccezioni. Programmazione in rete e laboratorio Eccezioni. Classi eccezioni

Variabili e Funzioni. Informatica 1 / 19

Università degli Studi di Cassino

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

Programmazione ad oggetti

Università degli Studi di Cassino

Modi di esecuzione user / kernel

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

Perché il linguaggio C?

Pag. 1. Il Nucleo del sistema operativo (la gestione dei processi)

Le basi del linguaggio Java

LinuxThreads: I thread nel sistema operativo LINUX: Linuxthreads. LinuxThreads. LinuxThreads

Inizializzare oggetti

Oggi. La programmazione strutturata - III. Sequenza e selezione. Dove siamo. Iterazione: while e do/while. Raffinamenti successivi.

Struttura di un programma C++

SISTEMI OPERATIVI THREAD. Giorgio Giacinto Sistemi Operativi

Il linguaggio C. Notate che...

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

ACSO Programmazione di Sistema e Concorrente

PROGRAMMAZIONE Nomi, binding, regole di visibilità (scope)

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Costrutti di Programmazione Strutturata. Informatica 1 / 22

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI

Transcript:

Programmazione di Sistema Massimo Bernaschi Istituto per le Applicazioni del Calcolo Mauro Picone Consiglio Nazionale delle Ricerche Viale Manzoni, 30-00185 Rome - Italy http://www.iac.cnr.it/~massimo e-mail: m.bernaschi@iac.cnr.it

Gestione delle eccezioni in Win32 In Win32 è possibile per un applicazione gestire eventi inattesi come errori di indirizzamento, operazioni illegali o errori di sistema attraverso i meccanismi di Structured Exception Handling (SEH) Ad esempio un programma che cerca di dereferenziare un puntatore a NULL dovrebbe terminare immediatamente. La SEH permette di definire un exception handler che viene invocata prima della terminazione. È importante comprendere la differenza tra una condizione di errore che, in genere, avviene occasionalmente in locazioni note e un eccezione che può avvenire quasi ovunque ed in maniera non prevedibile. La SEH è supportata attraverso una combinazione di funzioni 2

Win32, supporto del compilatore e del run-time. 1. prima di tutto deve essere individuato il blocco di codice da controllare 2. il blocco viene inserito in: try { /* blocco di codice da controllare */ } 3. l eccezione è gestita da: except (filter expression) { /* codice di gestione dell eccezione */ } try e except sono speciali keyword. Il meccanismo gestisce anche i casi di annidamento di blocchi e di chiamate a funzione. 3

Una volta che l handler completa l esecuzione, il controllo passa all istruzione successiva al blocco dell handler La filter expression è valutata immediatamente dopo l eccezione. L espressione può essere una costante, una espressione condizionale (? : ) o una chiamata ad una funzione di filtro. In ogni caso l espressione ritorna uno di tre possibili valori: EXCEPTION EXECUTE HANDLER EXCEPTION CONTINUE SEARCH EXCEPTION CONTINUE EXECUTION È possibile determinare il tipo di eccezione usando la funzione DWORD GetExceptionCode(). EXCEPTION ACCESS VIOLATION, EXCEPTION DATATYPE MISALIGNMENT, EXCEPTION NONCONTINUABLE EXECUTION, 4

EXCEPTION FLT OVERFLOW,... speciali eccezioni possono essere definite dall utente tramite la funzione void RaiseException( DWORD dwexceptioncode, DWORD dwexceptionflags, DWORD nnumberofarguments, const ULONG_PTR* lparguments); Notare come non sia possibile sollevare un eccezione in un altro processo. le eccezioni floating point sono disabilitate per default ma possono essere attivate con la funzione controlp() Ulteriori informazioni possono essere ottenute con la funzione GetExceptionInformation() che può essere invocata però solo all interno dell espressione filtro. 5

Handler per la terminazione in Win32 Un termination handler è molto simile ad un gestore di eccezioni ma viene eseguito sia quando un thread lascia un blocco al termine della regolare esecuzione sia quando viene sollevata un eccezione. La struttura è simile alla precedente: try { /* blocco di codice */ } finally { /* handler di terminazione */ } ma non esiste il concetto di filtro (perché il blocco viene eseguito comunque). 6

Lo scopo di questo handler è quello di ripristinare lo stato del processo indipendentemente dal modo di uscita dal blocco try conclusione naturale falling through; esecuzione di return, break, goto, longjump, continue, leave leave è specifico del C Microsoft ed è più efficiente di un goto perché non c è gestione dello stack; eccezione; BOOL AbnormalTermination() indica il tipo di terminazione. Notare che un blocco try non può avere contemporaneamente un blocco except e finally ma è possibile annidare i blocchi!. 7

try { while(...) try {... if(...) try { } except() { } } finally { } } except() { } I termination handler non sono eseguiti se un processo (o thread) termina (via ExitXXX o TerminateXXX). 8

UNIX/Linux offrono la funzione atexit(void (*function)(void)) Notare le differenze con meccanismi analoghi di gestione delle eccezioni presenti in C++ e Java. Microsoft consiglia di non usare gli exception handler di Win32 all interno di programmi in C++. esempio: programmi 4.2 e 4.3 (uso dei filtri). 9

Console Control Handler I Console Control Handler sono in grado di rilevare e gestire anche eventi come lo scollegamento di un utente o il Ctrl-c da tastiera. Sono disponibili su tutte le piattaforme Windows ad eccezione di WindowsCE (o PockePC). Per aggiungere o rimuovere un console handler: BOOL SetConsoleCtrlHandler ( PHANDLER_ROUTINE HandlerRoutine, BOOL Add) Se Add è TRUE la funzione HandlerRoutine è eseguita quando viene generata la sequenza Ctrl-c o Ctrl-break (ed altre). La funzione HandlerRoutine prende un argomento (tipo DWORD) che indica il tipo di segnale e ritorna un valore 10

booleano. Se HandlerRoutine è NULL ed Add è TRUE i segnali Ctrl sono ignorati. A seconda del valore di ritorno di HandlerRoutine i successivi handler sono eseguiti oppure no. Notare che gli handler sono eseguiti in ordine inverso a quello con cui sono stati inseriti. L handler esegue in un thread indipendente. Il programma continua ad operare. Per generare questo tipo di segnali da un applicazione si può usare la GenerateConsoleCtrlEvent(). I segnali sono applicati all intero processo mentre le eccezioni si applicano solo ai singoli thread che eseguono il codice dove avviene l eccezione stessa (esempio: programma 4.5). 11

Annidamento di eccezioni Un eccezione può essere gestita da un solo handler. Più handler possono fare riferimento ad uno stesso blocco nel senso che se un filtro ritorna il valore EXCEPTION CONTINUE SEARCH, allora viene cercato un altro handler nel blocco che include il precedente. try In Win32 più handler non possono stare allo stesso livello per un singolo blocco try. 12

Eccezioni in C++ e Java Il C++ offre tre operatori per la gestione delle eccezioni: try, throw, catch. L utilizzo è il seguente: try { // blocco di codice throw exception; } catch (type exception) { // codice da eseguire in caso di eccezione } L eccezione viene sollevata esplicitamente dall operatore throw Il blocco catch viene eseguito ricevendo il parametro passato da throw 13

catch può essere overloaded in modo da accettare diversi tipi come parametri. È possibile define un blocco catch in modo da catturare tutte le eccezioni indipendentemente dal tipo usato nella throw. Per questo è sufficiente usare la forma catch(...) È possibile annidare blocchi try-catch all interno di altri blocchi try 14

La gestione delle eccezioni in Java è simile ma non identica a quella del C++. Gli statement utilizzati sono sempre try, catch e thrown per generare eccezioni custom. Un blocco try può essere seguito da più blocchi catch che specificano diversi tipi (sottoclassi in Java) della classe Exception. I blocchi catch sono valutati in ordine fino a quando uno non è applicabile. Un solo blocco catch è eseguito per una data eccezione. 15

Gestione dei segnali (Unix/Linux) La gestione dei segnali in Unix avviene in gran parte nella libreria C. La funzionalità più simile ai segnali Unix in Win32 sono i console control handlers Alcuni segnali Unix corrispondono ad eccezioni in Win32: SIGILL - EXCEPTION PRIV INSTRUCTION SIGSEGV - EXCEPTION ACCESS VIOLATION SIGUSR1 e SIGUSR2 - Eccezioni generate dall utente. Win32 non genera SIGILL, SIGSEGV, SIGTERM e non supporta SIGINT 16

Gestione dei segnali in UNIX Un signal indica ad un processo che è avvenuto un evento. Il processo non sa esattamente quando viene inviato il signal. La maniera migliore di gestire un segnale è utilizzare la funzione sigaction. Una volta che è stato installato, il signal handler rimane definito (originariamente non era così). Mentre l handler per un certo segnale è in esecuzione, lo stesso segnale è bloccato così come tutti gli altri segnali specificati nella sa mask passata alla sigaction. Anche se un segnale è generato più di una volta mentre è bloccato, viene inviato una sola volta. In altre parole, i segnali Unix non si accodano. 17

POSIX.1 non specifica l ordine nel quali i segnali sono inviati ad un processo. In genere, comunque, i segnali relativi allo stato corrente del processo, come SIGSEGV, sono inviati prima di tutti gli altri. 18

Signal Handling #include <signal.h> struct sigaction { void (*sa_handler)(int); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); } int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 19

Signal Handling Il primo argomento per il signal handler è sempre il numero del segnale. Esistono alcuni valori speciali per il signal handler quali: SIG IGN: ignora il segnale SIG DFL: azione di default (nella gran parte dei casi kill il processo). SIGSTOP and SIGKILL non possono essere intercettati. 20

Signal Handling Possibili valori per i signal flags sono: SA RESTART: system calls interrotte dai segnali sono rinizializzate automaticamente. SA NODEFER: un segnale non è automaticamente bloccato dal sistema mentre è in esecuzione il corrispondente signal-handler. SA SIGINFO: fornisce informazioni aggiuntive ad un signal handler (vedi la struct siginfo). La lista completa dei segnali è disponibile (sotto Linux) in: /usr/include/bits/signum.h. 21

Signal Handling Altre funzioni relative alla gestione di segnali: int sigprocmask(int how, const sigset t *set, sigset t *oldset); La maschera dei segnali bloccati è modificata a seconda del valore del parametro how: SIG BLOCK: la nuova maschera è l unione della maschera corrente e dell insieme specificato in set; SIG UNBLOCK: la nuova maschera è l intersezione della maschera corrente e del complemento dell insieme specificato in set; SIG SETMASK: la maschera attuale è sostituita con il set specificato; int sigpending(sigset t *set); int sigsuspend(const sigset t *mask); La funzione sigsuspend sostituisce temporaneamente la signal mask di un processo con quella passata come argomento e sospende il processo fino a quando non viene ricevuto un segnale (non bloccato). unsigned int alarm(unsigned int seconds); 22

Come inviare un segnale La funzione kill invia un segnale ad un processo o ad un gruppo di processi. int kill(pid t pid, int signo) Ci sono quattro diverse possibilità per il valore dell argomento pid: pid>0 Il segnale è inviato al processo pid. pid==0 Il segnale è inviato a tutti i processi che fanno parte del gruppo a cui appartiene il processo invocante. pid==-1 Il segnale è inviato ad ogni processo ad eccezione del processo numero 1 (init) pid<-1 Il segnale è inviato ad ogni processo nel gruppo -pid 23

Se signo è uguale a 0, non viene inviato nessun segnale, ma viene comunque effettuato il controllo degli errori. Affinché un processo possa inviare un segnale ad un altro, o il processo deve avere privilegi di root, oppure il real o effective user ID deve essere lo stesso del real o saved ID del ricevente. La funzione raise invia un segnale al processo invocante. 24

goto non locale Il linguaggio C non permette un goto ad un punto (label) appartenente ad un altra funzione. Questo tipo di salto incondizionato è reso possibile dalle funzioni setjmp e longjmp. setjmp(jmp buf env) e longjmp sono utili per gestire errori ed interruzioni ricevute in una funzione fortemente annidata in un programma. setjmp() salva lo stack in env affinché possa essere utilizzato successivamente dalla longjmp(); 25

goto non locale #include <setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); longjmp non può usare 0 come valore di ritorno (secondo argomento). Se longjmp viene invocata con un secondo argomento uguale a 0, viene ritornato automaticamente 1. 26

goto non locale Quale è lo stato delle variabili automatiche? Hanno valori corrispondenti a quelli precedenti il momento in cui è stata invocata la setjmp? Le variabili che sono dichiarate globali o statiche non sono modificate quando viene eseguita la longjmp. esempio: apue/environ/testjmp.c 27