X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=50e54a86e6ab60e0a75638884cf7dbc00c179304;hp=073a4cddfdb577411d76b20af3d7cd26cce64ba7;hb=877e20d4d68b182eee7f8e466e2a126a00534354;hpb=13d5a5ace5c88b8659e5a96975919b3fb7143d3e diff --git a/signal.tex b/signal.tex index 073a4cd..50e54a8 100644 --- a/signal.tex +++ b/signal.tex @@ -187,16 +187,16 @@ Ciascun segnale diretto di questo numero da parte dei programmi è da evitare, in quanto esso può variare a seconda dell'implementazione del sistema. -Per questo ad ogni tipo di segnale viene associato un nome, che corrisponde -tramite una macro di preprocessore, al suddetto numero, e sono questi nomi, -che sono standardizzati e uniformi rispetto alle varie implementazioni, che si +Per questo ad ogni tipo di segnale viene associato un nome, che corrisponde, +tramite una macro di preprocessore, al suddetto numero. Sono questi nomi, che +sono standardizzati e uniformi rispetto alle varie implementazioni, che si devono usare nei programmi. Tutti i nomi e le funzioni che concernono i segnali sono definiti nell'header di sistema \texttt{signal.h}. Il numero totale di segnali presenti è dato dalla macro \texttt{NSIG}, e dato che i numeri dei segnali sono allocati progressivamente, essa corrisponde -anche al successivo del valore numerico assegnato all'ultimo segnale definito, -in \ntab\ si è riportato l'elenco completo dei segnali definiti in Linux +anche al successivo del valore numerico assegnato all'ultimo segnale definito. +In \ntab\ si è riportato l'elenco completo dei segnali definiti in Linux (estratto dalle man page), comparati con quelli definiti in vari standard. \begin{table}[htb] @@ -249,8 +249,8 @@ in \ntab\ si \caption{Lista dei segnali in Linux} \label{tab:sig_signal_list} \end{table} -in \curtab\ si sono riportate anche le caratteristiche di ciascun segnale -indicate nel campo azione con una lettera, la cui legenda è: +in \curtab\ si sono riportate anche le caratteristiche di ciascun segnale, +indicate con una lettera nel campo azione, la cui legenda è: \begin{table}[htb] \centering \begin{tabular}[c]{c p{6cm}} @@ -266,8 +266,9 @@ indicate nel campo azione con una lettera, la cui legenda \tabref{tab:sig_signal_list}. } \label{tab:sig_action_leg} \end{table} - - +la descrizione dettagliata del significato dei vari segnali, raggruppati per +tipologia, è a seguire; una descrizione dettagliata del significato delle +varie azioni si trova invece in \secred{sec:sig_handlers}. \subsubsection{Segnali di errore di programma} @@ -290,12 +291,12 @@ non ci fosse stato. L'azione di default per tutti questi segnali è causare la terminazione del processo che li ha causati. In genere oltre a questo il segnale provoca pure -la registrazione su disco di un \textit{core dump file} che viene scritto in -un file \texttt{core} nella directory corrente del processo al momento -dell'errore. +la registrazione su disco di un file di \textit{core dump} che viene scritto +in un file \texttt{core} nella directory corrente del processo al momento +dell'errore, che il debugger può usare per ricostruire lo stato del programma +al momento della terminazione. Questi segnali sono: - \begin{description} \item \texttt{SIGFPE} Riporta un errore aritmetico fatale. Benché il nome derivi da \textit{floating point exception} si applica a tutti gli errori @@ -316,7 +317,6 @@ Questi segnali sono: una variabile locale, andando a corrompere lo stack. Lo stesso segnale viene generato in caso di overflow dello stack o di problemi nell'esecuzione di di un signal handler. - \item \texttt{SIGSEGV} Il nome deriva da \textit{segment violation}, e significa che il programma sta cercando di leggere o scrivere in una zona di memoria protetta al di fuori di quella che gli è stata riservata dal @@ -325,14 +325,12 @@ Questi segnali sono: È tipico ottenere questo segnale dereferenziando un puntatore nullo o non inizializzato leggendo al di la della fine di un vettore. - \item \texttt{SIGBUS} In maniera analoga a \texttt{SIGSEGV} questo è un segnale che viene generato di solito quando si dereferenzia un puntatore non inzializzato, la differenza con con \texttt{SIGSEGV} è che questo indica un accesso non valido su un indirizzo esistente (tipo fuori dallo heap o dallo stack), mentre \texttt{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso di un puntatore non allineato. - \item \texttt{SIGABRT} Il segnale indica che il programma stesso ha rilevato un errore che viene riportato chiamando la funzione \texttt{abort} che genera questo segnale. @@ -370,6 +368,11 @@ segnali sono: \subsection{I segnali di allarme} \label{sec:sig_alarm} +Questi segnali sono generati dalla scadenza di un temporizzatore. Il loro +comportamento di default è quello di causare la terminazione del programma, ma +nessun default ha una utlità avrebbe una utilità particolare, in quanto l'uso +di questi segnali presuppone quasi sempre la necessità di un +manipolatore. Questi segnali sono: \begin{description} \item \texttt{SIGALRM} \item \texttt{SIGVTALRM} @@ -380,6 +383,11 @@ segnali sono: \subsection{I segnali di I/O asincrono} \label{sec:sig_asyncio} +Questi segnali operano in congiunzione con le funzioni di I/O asincrono. Per +questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a +generare questi segnali. + +L'azione di default è di essere ignorati. Questi segnali sono: \begin{description} \item \texttt{SIGIO} \item \texttt{SIGURG} @@ -389,7 +397,9 @@ segnali sono: \subsection{I segnali per il controllo di sessione} \label{sec:sig_job_control} - +Questi sono i segnali usati dal controllo di sessione, il loro uso è specifico +per questo argomento e verrà trattato quando lo affronteremo. +Questi segnali sono: \begin{description} \item \texttt{SIGCHLD} \item \texttt{SIGCONT} @@ -402,6 +412,13 @@ segnali sono: \subsection{I segnali di operazioni errate} \label{sec:sig_oper_error} +Questi segnali sono usati per riportare al programma errori generati da +operazioni da lui eseguite; non indicano errori del programma quanto errori +che impediscono il completamento dell'esecuzione dovute all'interazione con il +resto del sistema. + +L'azione di default di questi segnali è di terminare il processo, questi +segnali sono: \begin{description} \item \texttt{SIGPIPE} \item \texttt{SIGLOST} @@ -413,6 +430,8 @@ segnali sono: \subsection{Ulteriori segnali} \label{sec:sig_misc_sig} +Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non +classificabili in maniera omogenea. Questi segnali sono: \begin{description} \item \texttt{SIGUSR1} e \texttt{SIGUSR2} \item \texttt{SIGWINCH} @@ -420,3 +439,25 @@ segnali sono: \end{description} + +\section{La gestione dei segnali} +\label{sec:sig_handlers} + +I segnali sono il primo e più classico esempio di eventi asincroni, che +possono accadere in un qualunque momento durante l'esecuzione di un programma. +Non essendo sotto il controllo del programma la gestione dei segnali non potrà +essere controllata all'interno del flusso di esecuzione di quest'ultimo, ma +tutto quello che si potrà fare è di specificare (al kernel, che li genera) +quale azione andrà intrapresa quando essi si verificano. + +In questa sezione vedremo allora come si gestiscono i segnali, partendo dalla +descrizione di cosa fanno le azioni di default citate in precedenza, per poi +esaminare le funzioni usate per personalizzare la gestione dei segnali, +analizzando tutte le problematiche relative alla gestione di eventi asincroni +di questo tipo. + + + +\subsection{Le azioni di default} +\label{sec:sig_default_acttion} +