From: Simone Piccardi Date: Sun, 24 Jun 2001 16:54:11 +0000 (+0000) Subject: Risistemate le macro, nadato avanti coi segnali, aggiornato il makefile. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=877e20d4d68b182eee7f8e466e2a126a00534354;ds=sidebyside Risistemate le macro, nadato avanti coi segnali, aggiornato il makefile. --- diff --git a/Makefile b/Makefile index e23ceed..905e19b 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,19 @@ all: html dvi ps pdf html: - latex2html -local_icons main.tex + latex2html -local_icons gapil.tex dvi: - latex main.tex + latex gapil.tex pdf: - pdflatex main.tex + pdflatex gapil.tex ps: - dvips -o gapil.ps main.dvi + dvips -o gapil.ps gapil.dvi install: - scp gapil piccardi@firenze.linux.it:public_html + scp -r gapil* piccardi@firenze.linux.it:public_html clean: rm -f *.dvi *.log *.ps *.html *.aux \ No newline at end of file diff --git a/gapil.tex b/gapil.tex index a8b017b..2564ee7 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,4 +1,4 @@ -%% +%% %% GaPiL : Guida alla Programmazione in Linux %% %% S. Piccardi Feb. 2001 diff --git a/macro.tex b/macro.tex index e832de6..c2ef967 100644 --- a/macro.tex +++ b/macro.tex @@ -93,7 +93,7 @@ tab.~\thechapter.\theusercount} % Slighty different envirnoment to be used for multi-header, % multi-functions boxed description % -\newcommand{\headdecl}[1]{\par \texttt{\#include <#1>}} +\newcommand{\headdecl}[1]{\item\texttt{\#include <#1>}} \newcommand{\funcdecl}[1]{\item\texttt{#1}\par} \newenvironment{functions} {% defining what is done by \begin @@ -111,6 +111,14 @@ tab.~\thechapter.\theusercount} \normalsize \par } - - +% +% Wrapper for shell command, functions, filenames, links, +% variables, macros, and everything can be useul, +% +\newcommand{\cmd}[1]{\texttt{#1}} +\newcommand{\func}[1]{\texttt{#1}} +\newcommand{\macro}[1]{\texttt{#1}} +\newcommand{\var}[1]{\texttt{#1}} +\newcommand{\file}[1]{\texttt{#1}} +\newcommand{\link}[1]{\texttt{#1}} diff --git a/process.tex b/process.tex index 741d4bb..adddd09 100644 --- a/process.tex +++ b/process.tex @@ -460,36 +460,7 @@ quattro, i prototipi sono i seguenti: Disalloca lo spazio di memoria puntato da \texttt{ptr}. La funzione non ritorna nulla. - \end{functions} -\begin{prototype}{stdlib.h}{void *calloc(size\_t size)} - Alloca \texttt{size} bytes nello heap. La memoria viene inizializzata a 0. - - La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \texttt{NULL} in caso di fallimento, nel qual caso - \texttt{errno} viene settata a \texttt{ENOMEM}. -\end{prototype} -\begin{prototype}{stdlib.h}{void *malloc(size\_t size)} - Alloca \texttt{size} bytes nello heap. La memoria non viene inizializzata. - - La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \texttt{NULL} in caso di fallimento, nel qual caso - \texttt{errno} viene settata a \texttt{ENOMEM}. -\end{prototype} -\begin{prototype}{stdlib.h}{void free(void *ptr)} - Disalloca lo spazio di memoria puntato da \texttt{ptr}. - - La funzione non ritorna nulla. -\end{prototype} -\begin{prototype}{stdlib.h}{void *realloc(void *ptr, size\_t size)} - Cambia la dimensione del blocco allocato all'indirizzo \texttt{ptr} - portandola a \texttt{size}. - - La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \texttt{NULL} in caso di fallimento, nel qual caso - \texttt{errno} viene settata a \texttt{ENOMEM}. -\end{prototype} - Il puntatore che le funzioni di allocazione ritornano è garantito essere sempre correttamente allineato per tutti i tipi di dati; ad esempio sulle macchine a 32 bit in genere è allineato a multipli di 4 bytes e sulle macchine 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} +