Laboratorio di Sistemi Operativi PDF
Document Details
Uploaded by SteadyBoltzmann
d.unito.it
Daniele Radicioni
Tags
Related
Summary
Questi appunti forniscono una panoramica sui sistemi operativi, in particolare su UNIX, e includono argomenti su segnali, pipe, code di messaggi, memoria condivisa e semafori. Sono riferimenti alla programmazione bash. Il materiale è tratto dal Prof. Gunetti e da altri testi di riferimento.
Full Transcript
laboratorio di sistemi operativi segnali Daniele Radicioni argomenti del laboratorio UNIX introduzione a UNIX; integrazione C: operatori bitwise, precedenze, preprocessore, pacchettizzazione del codice, compilazione condizionale e utility make; controllo dei processi;...
laboratorio di sistemi operativi segnali Daniele Radicioni argomenti del laboratorio UNIX introduzione a UNIX; integrazione C: operatori bitwise, precedenze, preprocessore, pacchettizzazione del codice, compilazione condizionale e utility make; controllo dei processi; segnali; pipe e fifo; code di messaggi; memoria condivisa; semafori; introduzione alla programmazione bash. Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 2 il materiale di questa lezione è tratto: - dai lucidi del Prof. Gunetti degli anni scorsi; - Michael Kerrisk, The Linux Programming interface - a Linux and UNIX® System Programming Handbook, No Starch Press, San Francisco, CA, 2010; - W. Richard Stevens (Author), Stephen A. Rago, Advanced Programming in the UNIX® Environment (2nd Edition), Addison-Wesley, 2005; Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 3 cause che generano i segnali un segnale è una notifica a un processo che è occorso un certo evento. Fra i tipi di eventi che causano il fatto che il kernel generi un segnale per un processo ci sono i seguenti: 1. è occorsa una eccezione hardware, l'HW ha verificato una condizione di errore che è stata notificata al kernel, il quale a propria volta ha inviato un segnale corrispondente al processo in questione. per esempio, l'esecuzione di istruzioni di linguaggio macchina malformate, divisioni per 0, o riferimenti a parti di memoria inaccessibili. Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 4 cause che generano i segnali 2. l'utente ha digitato sul terminale dei caratteri speciali che generano i segnali. questi caratteri includono il carattere interrupt (normalmente associato a Control-C) e il suspend carattere (Control-Z). 3. è occorso un evento software. per esempio, l'input è divenuto disponibile su un descrittore di file, un timer è arrivato a 0, il tempo di processore per il processo è stato superato, o un figlio del processo è terminato. Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 5 symbolic names and numbers i segnali sono definiti con interi unici, la cui sequenza inizia da 1. Tali interi sono definiti in (o in ) con nomi simbolici della forma SIGxxxx. poiché gli effettivi numeri utilizzati per ogni segnale variano a seconda delle implementazioni, all'interno dei programmi è meglio utilizzare questi nomi. - per esempio, quando l'utente digita il carattere dell'interrupt, SIGINT (il segnale numero 2) è inviato a un processo. Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 6 listing signals with strsignal(signum) // NSIG is a macro equal to the total number of signal for (i=0; i 0: il segnale è inviato al processo identificato da pid. - pid == 0: il segnale è inviato a ogni processo nello stesso gruppo del chiamante, chiamante incluso. - pid < –1: il segnale è inviato a tutti i processi nel gruppo del processo il cui ID è uguale al valore assoluto di pid. inviare un segnale a tutti i processi nel gruppo di un processo è utile nel controllo dei job effettuato con la shell. - pid == –1: (broadcast signal) il segnale è inviato a tutti i processi per i quali il processo ha i permessi di inviare un segnale, eccetto init (che ha pid 1) ed il chiamante. se l'utente non è super user, il segnale è inviato a tutti i processi con stesso uid dell'utente, Danieleescluso il processo Radicioni - Laboratorio che invia di Sistemi Operativi, corso Ail- segnale. turno T1 44 #include kill() system call int kill(pid_t pid, int sig); Returns 0 on success, or –1 on error se nessun processo corrisponde al pid predefinito, kill() fallisce e setta errno a ESRCH (“No such process”) verifica dell'esistenza di un processo. se l'argomento sig è settato a 0 (detto null signal), non è inviato alcun segnale. - in questo caso kill() esegue unicamente un controllo degli errori per vedere se è possibile inviare segnali al processo: il null signal può essere utilizzato per testare se un processo con un certo pid esiste. - se la chiamata fallisce con errore EPERM, il processo esiste, ma non abbiamo i permessi per inviargli un segnale. - se la chiamata va aDaniele buon fine, sappiamo che il processo esiste. Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 45 sigaction system call sigaction() system call #include int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); Returns 0 if successful; otherwise the value -1 is returned and the global variable errno is set. syscall utilizzata per impostare un gestore di segnali - signum: numero del segnale da gestire - act, puntatore al nuovo gestore del segnale; se NULL il gestore resta invariato - oldact, puntatore al vecchio gestore; se impostato a NULL non viene restituito alcun handler. NB: sigaction è sia una sys call sia una struct Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 47 sigaction() system call (dichiarazione e) tre possibili invocazioni struct sigaction new, old; sigaction(signum, new, NULL); //set new handler to new sigaction(signum, NULL, old); //current handler in old sigaction(signum, new, old); //do both Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 48 the sigaction structure #include struct sigaction { void (*sa_handler)(int signum); sigset_t sa_mask; int sa_flags; // plus others (for advanced usage) }; sa_handler, puntatore alla funzione per la gestione del segnale; sa_mask, maschera dei segnali bloccati durante l’esecuzione dell’handler; sa_flags, insieme di flag messi in bitwise OR per modificare il comportamentoDaniele delRadicioni segnale. - Laboratorio di Sistemi Operativi, corso A - turno T1 49 mask & fork() the collection of signals that are currently blocked is called the signal mask. - each process has its own signal mask. when a new process is created, it inherits its parent’s mask. - you can block or unblock signals with total flexibility by modifying the signal mask. Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 50 sblocco del segnale durante l’handler quando un segnale è inviato a un processo durante l’esecuzione di un handler, il segnale è automaticamente bloccato fino a quando l’handler restituisce - a meno che non sia settato il flag SA_NODEFER void handle_signal(int signal); int main() { struct sigaction sa; sigset_t my_mask; sa.sa_handler = &handle_signal; // handler ptr sa.sa_flags = SA_NODEFER; // allow nested invocations sigemptyset(&my_mask); // do not mask any signal sa.sa_mask = my_mask; sigaction(SIGUSR1, &sa, NULL); // set the handler // further code } Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 51 signal mask la maschera è la collezione di segnali attualmente blocked. - ogni processo ha la propria maschera di segnali: un nuovo processo eredita la maschera del genitore le maschere sono di tipo sigset_t. le funzioni per la manipolazione dei set sono: int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigaddset(sigset_t *set, int signum); int sigdelset(sigset_t *set, int signum); int sigismember(const sigset_t *set, int signum); Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 52 int sigemptyset(sigset_t *set); initializes a signal set to be empty. int sigfillset(sigset_t *set); initializes a signal set to contain all signals. int sigaddset(sigset_t *set, int signum); adds the specified signal signo to the signal set. int sigdelset(sigset_t *set, int signum); deletes the specified signal signo from the signal set. int sigismember(const sigset_t *set, int signum); returns whether a specified signal signo is contained in the signal set. man sigsetops per ulteriori dettagli Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 53 signal sets the sigset_t data type is used to represent a signal set. internally, it may be implemented as either an integer or structure type. - for portability, use only the listed functions to initialize, change, and retrieve information from sigset_t objects—do not try to manipulate them directly. there are two ways to initialize a signal set. - either you can initially specify it to be empty with sigemptyset, and then add specified signals individually; - or you can specify it to be full with sigfillset and then delete specified signals individually. Daniele Radicioni - Laboratorio di Sistemi Operativi, corso A - turno T1 54 void handle_signal(int signal) { printf("Got signal #%d: %s\n", signal, strsignal(signal)); } int main() { struct sigaction sa; sigset_t my_mask; int i; sa.sa_handler = &handle_signal; sigemptyset(&my_mask); // signal mask is now EMPTY sa.sa_mask = my_mask; sa.sa_flags = 0; // no special behavior for (i=0; i