I segnali.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

PROCESS MANAGEMENT: STRUTTURE DATI
Meccanismi di IPC Problemi classici di IPC
CONCLUSIONE - Nucleo (o Kernel) Interagisce direttamente con lhardware Interagisce direttamente con lhardware Si occupa dellesecuzione.
Programmazione concorrente
Il Sistema Operativo.
Gestione del processore
1 Processi e Thread Meccanismi di IPC, Inter Process Communication (1)
1 Processi e Thread Meccanismi di IPC (1). 2 Comunicazioni fra processi/thread Processi/thread eseguiti concorrentemente hanno bisogno di interagire per.
SC che operano su processi
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
1 Reti di Calcolatori Esercitazione 1 Implementazione di un superserver Unix di rete Vedi: W.R. Stevens, Unix Network Programming, Prentice Hall Copyright.
I segnali.
1 System Call per Comunicazione tra Processi Pipe.
SC che operano su file (1)
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Laboratorio di Linguaggi note sull'uso dell' IDE DevC++ Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Scomposizione di stringhe
Threads: Sistemi Operativi I Corso di Laurea in Ingegneria Informatica
I Thread.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
1 Gestione del processore Il modello a processi sequenziali.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Organizzazione della Memoria (Unix) Text contiene le istruzioni in linguaggio macchina del codice eseguibile, può essere condiviso in caso di processi.
1 LINUX: struttura generale The layers of a UNIX system. User Interface.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Sistemi Operativi - Shell 1 Elementi di programmazione concorrente Niccolo` Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Sistemi Operativi - Introduzione 1 Il sistema operativo UNIX Shell: uso avanzato e script Niccolò Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
1 Scheduling in Windows 2000 Un thread entra in modalità kernel e chiama lo scheduler quando: Si blocca su un oggetto di sincronizzazione (semaforo, mutex,
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Costruzione di una semplice Agenda telefonica Elettronica Esercizio sull'uso delle principali system call Unix.
1 I segnali. 2 Prima un po’ di teoria…... 3 Stati dei processi in UNIX Idle Sleeping Zombified Runnable Running Fork iniziata waitpid Fork terminata.
Sistema Operativo (Software di base)
Gli interrupt Quando una periferica richiede attenzione alla cpu genera un segnale detto di interrupt.
Arch. Elab. - S. Orlando 1 Progetto del processore e supporto del processore al SO (interruzioni – eccezioni) Salvatore Orlando.
T. MottaGenerazione e terminazione processi1 Creazione e terminazione dei processi Tommaso Motta
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Politecnico di Milano © Domenico Barretta Processi concorrenti in Unix Docente Domenico Barretta Politecnico di Milano
Architettura dei Sistemi Operativi
Gestione dei dispositivi di I/O:
1 SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 Amministrazione dei processi nel sistema operativo Unix (Bach: the Design of the Unix Operating System (cap: 6, 7, 8)
1 Input/Output. 2 Livelli del sottosistema di I/O Hardware Gestori delle interruzioni Driver dei dispositivi Software di sistema indipendente dal dispositivo.
1 Chiamate di sistema Introduzione Errori : perror() Chiamate che lavorano su file.
Programmazione di sistema e gestione dei processi in C.
1 Input/Output. 2 Livelli del sottosistema di I/O Hardware Gestori delle interruzioni Driver dei dispositivi Software di sistema indipendente dal dispositivo.
Processi e Thread Processi Thread
1 Processi e Thread Processi e thread in Windows 2000.
Gestione dei segnali I segnali sono interrupt software.I segnali –interrompono i processi qualunque cosa stiano essi facendo al momento della generazione.
1.1 Il concetto di processo Un sistema operativo può eseguire una grande varietà di attività diverse:  sistemi batch – jobs;  sistemi time-shared – programmi.
1.1 Corso di Sistemi Operativi: Programmazione di Sistema Corso di Laurea in Informatica, Università di Firenze Anno accademico 2010/2011 Prof. Luca Ferrari.
1 Processi e Thread Processi Thread Meccanismi di comunicazione fra processi (IPC) Problemi classici di IPC Scheduling Processi e thread in Unix Processi.
1 Processi e Thread Processi Thread Meccanismi di comunicazione fra processi (IPC) Problemi classici di IPC Scheduling Processi e thread in Unix Processi.
1 Processi e Thread Processi e thread in Unix. 2 UNIX/Linux Molte versioni di UNIX –trattiamo le caratteristiche più comuni) Ci riferiamo allo standard.
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
Informatica Generale Marzia Buscemi
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Gli interrupt Richiesta di attenzione alla cpu. Viene generato un segnale detto di interrupt diretto alla cpu.
Albero genealogico. Si abbia un albero genealogico come nella figura sotto. Si supponga che i nomi propri delle persone siano tutti diversi, e quindi.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Modulo 7 System call relative ai segnali
LINUX: struttura generale
Transcript della presentazione:

I segnali

I segnali Prima un po’ di teoria…...

Stati dei processi in UNIX Fork terminata Idle Runnable Fork iniziata L’evento accade scheduling Sleeping Running Attesa di un evento exit waitpid Zombified

Segnali Sono ‘interruzioni’ software comunicano al processo il verificarsi di un evento ad ogni evento corrisponde un segnale numerato un processo all’arrivo di un segnale di un certo tipo può decidere di ignorarlo lasciarlo gestire al kernel con l’azione di default definita per quel segnale specificare una funzione (signal handler) che viene mandata in esecuzione appena il segnale viene rilevato

Segnali (2) Da chi sono inviati i segnali? da processo all’altro usando la SC kill() solo processi del gruppo (discendenti o antenati) dall’utente con particolari combinazioni di tasti (al processo in foregroud) Control-C corrisponde a SIGINT (ANSI) Control-Z corresponde a SIGTSTP dall’utente con l’utility kill della shell dal SO per a comunicare al processo il verificarsi di particolari eventi (es. SIGFPE, errore floating-point, SIGSEGV, segmentation fault)

Segnali (3) Lo standard POSIX stabilisce un insieme di segnali riconosciuti in tutti i sistemi conformi sono interi definiti come macro in /usr/include/bits/signum.h esempi: SIGKILL (9) : il processo viene terminato (non può essere intercettata) (quit) SIGALRM (14): è passato il tempo richiesto (quit)

Segnali (4) Sono di uso comune anche segnali non POSIX: SIGINT (2) Control-C (ANSI) richiesta di terminazione da tastiera (quit) SIGTSTP (POSIX) Control-Z richiesta di sospensione da tastiera (suspend fino all’arrivo SIGCONT) SIGFPE (8) (ANSI) si è verificato un errore Floating Point (dump) SIGCHLD(17) (POSIX) si è verificato un cambiamento di stato in un processo figlio (ignore) SIGPIPE(13) (POSIX) la pipe è stata chiusa in lettura (quit) …….

Segnali (5) SD del kernel relative ai segnali signal handler array : descrive cosa fare quando arriva un segnale di un certo tipo ignorare, trattare + puntatore al codice della funzione da eseguire (handler) pending signal bitmap (signal mask): che contiene un bit per ogni tipo di segnale il bit X è a 1 se c’è un segnale pendente di tipo X ogni processo ha un signal handler array (nella user area) ed una pending signal bitmap (nella process table)

Segnali (6) Cosa accade quando arriva un segnale? il processo che lo riceve viene interrotto il kernel stabilisce quale comportamento adottare controllando il contenuto del signal handler array se deve essere eseguito un signal handler safun: lo stato del processo interrotto viene salvato si esegue la funzione safun il processo riprende l’esecuzione dallo stato in cui e’ stato interrotto

Stati dei processi in UNIX (2) Fork terminata Idle Runnable Fork iniziata L’evento accade scheduling Sleeping Running Attesa di un evento Segnale SIGCONT exit Segnale SIGSTOP (CTRL Z) Stopped waitpid Zombified

alarm(), sigaction(),pause(),kill(),…... SC per i segnali alarm(), sigaction(),pause(),kill(),…...

Segnali: system call Come si definisce un signal handler personalizzato? usando la SC sigaction() ci sono SC che permettono di inviare segnali alarm(), kill() ci sono SC che permettono di mettersi in attesa dell’arrivo di un segnale pause()

Segnali di sveglia: alarm() int alarm(unsigned int count); serve a implementare un timeout invia un segnale SIGALRM al processo che l’ha invocata dopo count secondi se count è 0 non viene settato nessun allarme in ogni caso tutte le richieste di allarme già settate sono cancellate restituisce (0) se non c’erano allarmi settati oppure (x>0) se macavano x secondi allo scadere dell’ultimo allarme settato

Invio di una SIGALRM int main (void) { alarm(3); /* SIGALRM fra 3 secondi */ WRITELN(”Ciclo infinito ….") ; while (1) ; /* ciclo infinito */ WRITELN(”Pippo") ; /* mai eseguita */ return 0 ; }

Esempio : eseguiamo... cosa accade se eseguiamo il codice dell’esempio : $ a.out Ciclo infinito ... -- per (circa) 3 secondi non accade niente

Esempio : eseguiamo…(2) cosa accade se eseguiamo il codice dell’esempio : $ a.out Ciclo infinito ... Alarm clock -- arriva il segnale -- processo terminato $

Personalizzare la gestione int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact); serve a definire un nuovo handler signum : segnale da trattare &act : struttura che definisce il nuovo trattamento del segnale signum; &oldact : (OUTPUT) ritorna il contenuto precedente del signal handler array (può servire per ristabilire il comportamento precedente) ritorna (-1) se c’è stato errore

Personalizzare la gestione (2) struct sigaction { ... void sa_handler (int); } sa_handler: indica come gestire il segnale può essere: SIG_IGN ignora il segnale SIG_DFL usare la funzione di gestione di default puntatore alla funzione da invocare all’arrivo del segnale gli altri campi di solito si lasciano invariati

Personalizzare la gestione (3) SIGKILL e SIGSTP: non possono essere gestiti se non con la procedura di default il figlio eredita la gestione dei segnali dal padre dopo la exec() le gestioni ritornano quelle di default (ma i segnali ignorati continuano ad essere ignorati) i segnali SIGCHLD sono gli unici ad essere accumulati (stacked) negli altri casi se arriva un segnale dello stesso tipo di uno già settato nella signal mask viene perso

Personalizzare SIGALRM void gestore (int sig) {/* numero segnale */ WRITELN (”SIGALRM catturato\n") ; } int main (void) { struct sigaction s ; ……

Personalizzare SIGALRM (2) int main (void) { … /* inizializzo s con i valori correnti */ IFERROR(sigaction(SIGALRM,NULL,&s), \ ”nella sigaction ") ; s.sa_handler=gestore; /* nuovo gestore */ /* installo nuovo gestore */ IFERROR(sigaction(SIGALRM,&s,NULL), \ alarm(3); /* SIGALRM fra 3 secondi */ WRITELN(”Ciclo infinito ….") ; while (1) ; /* ciclo infinito */ WRITELN(”Pippo") ; /* mai eseguita */ return 0 ;}

Esempio : eseguiamo... cosa accade se eseguiamo il codice dell’esempio : $ a.out Ciclo infinito ... -- per (circa) 3 secondi non accade niente

Esempio : eseguiamo…(2) cosa accade se eseguiamo il codice dell’esempio : $ a.out Ciclo infinito ... SIGALRM catturato -- arriva il segnale -- il processo cicla indefinitamente …

Attesa di segnali: pause() int pause(void); sospende il processo fino all’arrivo di un segnale serve a implementare l’attesa passiva di un segnale ritorna dopo che il segnale è stato catturato ed il gestore è stato eseguito, restituisce sempre (-1)

Attendere SIGALRM /* indica se è arrivato SIGALARM (=1) o no (=0) */ int sigalarm_flag = 0; void gestore (int sig) {/* numero segnale */ sigalarm_flag = 1; } int main (void) { struct sigaction s ; ……

Attendere SIGALRM (2) int main (void) { IFERROR(sigaction(SIGALRM,NULL,&s), ”In spec"); s.sa_handler=gestore; /* nuovo gestore */ IFERROR(sigaction(SIGALRM,&s,NULL), ”In spec"); alarm(3); /* SIGALRM fra 3 secondi */ WRITELN(”Ciclo fino a SIGALRM ….") ; while (sigalarm_flag!= 1) pause(); /* ciclo fino a SIGALRM */ /* serve a non sbloccarsi se arriva un altro segnale */ WRITELN(”SIGALRM arrivato ...") ; return 0 ;}

Esempio : eseguiamo... cosa accade se eseguiamo il codice dell’esempio : $ a.out Ciclo fino a SIGALRM…. -- per (circa) 3 secondi non accade niente

Esempio : eseguiamo…(2) cosa accade se eseguiamo il codice dell’esempio : $ a.out Ciclo infinito ... SIGALRM arrivato -- arriva il segnale -- processo terminato $

Invio di segnali: kill() int kill(pid_t pid, int sig); invia un segnale di tipo sig a uno o più processi (dipende da pid) il segnale è inviato solo se il processo che invia il segnale e chi lo riceve hanno lo stesso owner il processo che invia il segnale è posseduto dal superutente (root) restituisce (0) se OK (-1) se si verifica un errore

Invio di segnali: kill()(2) int kill(pid_t pid, int sig); pid può essere >0 , in questo caso è il pid del processo cui si deve inviare il segnale =0, in questo caso il segnale è inviato a tutti i processi del gruppo di chi esegue la kill -1, in questo caso il segnale è inviato a tutti i processi (tranne init) se il processo è di root, altrimenti come (pid=0) <-1, in questo caso il segnale è inviato a tutti i processi del gruppo (-pid)

Esempio : una shell con timeout /*istallazione gestore SIGCHLD*/ while (TRUE) { /*ciclo infinito*/ flag_sigchld = 0; type_prompt(); /* stampa prompt*/ argv = read_comm(); /*legge command line*/ IFERROR3(pid = fork(),”Nella fork”,continue); if (pid) {/* codice padre */ sleep(1); IFERROR3(kill(pid,SIGKILL),”In kill”, nop()),; while(!flag_sigchld) pause(); } else {/*codice figlio*/ IFERROR(execvp(argv[0],argv),”In execvp”); }

Esempio : una shell con timeout (2) void gestore_chld (int sig) { int pid, stato; pid = wait(&stato); if (WIFEXITED(stato)) /* term con exit*/ printf(”%d: Terminato con exit %d”, pid, WEXITSTATUS(stato)); else printf(”%d: Terminato con kill %d”, pid, WTERMSIG(stato)); flag_sigchld = 1; }

Conoscere e settare il gruppo pid_t getpgrp(void); int setpgid(pid_t pid, pid_t pgid); i figli ereditano il gruppo dal padre che non viene modificato dalla exec() getpgrp: restituisce l’identificativo di gruppo del processo che l’ha chiamata setpgid: assegna un gruppo (pgid) ad un processo: i valori di pid possono essere vari (guardare man) ritorna -1 se fallisce

Segnali e system call Nello standard POSIX specifica che se arriva un segnale mentre una SC (es. open(), read()) è in esecuzione la SC deve fallire con errore EINTR si dovrebbe quindi testare EINTR dopo ogni SC e gestirlo esplicitamente è possibile settare opportuni flags durante la sigaction() in modo da non essere interrotti Linux per default NON interrompe le SC all’arrivo di un segnale Se vogliamo essere interrotti possiamo richiederlo esplicitamente con una chiamata alla system call siginterrupt()