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
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]
\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}}
\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}
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
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
È 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.
\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}
\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}
\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}
\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}
\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}
\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}
+