\chapter{I segnali}
-\label{sec:signals}
+\label{cha:signals}
I segnali sono il primo e più semplice meccanismo di comunicazione nei
confronti dei processi. Non portano con se nessuna informazione che non sia il
moderno) invece il signal handler una volta installato resta attivo e non si
hanno tutti i problemi precedenti. In questa semantica i segnali vengono
\textsl{generati} dal kernel per un processo all'occorrenza dell'evento che
-causa il segnale. In genere questo viene fatto dal kernel settanto un flag
+causa il segnale. In genere questo viene fatto dal kernel settando un flag
nella process table del processo.
Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
-
-
\subsubsection{Tipi di segnali}
\label{sec:sig_types}
\begin{table}[htb]
\centering
- \begin{tabular}[c]{c p{6cm}}
+ \begin{tabular}[c]{c p{10cm}}
A & L'azione di default è terminare il processo. \\
B & L'azione di default è ignorare il segnale. \\
C & L'azione di default è terminare il processo e scrivere un \textit{core
È 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.
-\item \texttt{SIGTRAP}
-\item \texttt{SIGSYS} Sta ad indicare che si è eseguta una istruzione che
+\item \texttt{SIGBUS} Il nome deriva da \textit{bus error}. Come
+ \texttt{SIGSEGV} questo è un segnale che viene generato di solito quando si
+ dereferenzia un puntatore non inzializzato, la differenza è
+ che\texttt{SIGSEGV} indica un accesso non permesso 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 nome deriva da \textit{abort}. Il segnale indica che
+ il programma stesso ha rilevato un errore che viene riportato chiamando la
+ funzione \texttt{abort} che genera questo segnale.
+\item \texttt{SIGTRAP} È il segnale generato da un'istruzione di breakpoint o
+ dall'attivazione del tracciamento per il processo. È usato dai programmi per
+ il debugging e se un programma normale non dovrebbe ricevere questo segnale.
+\item \texttt{SIGSYS} Sta ad indicare che si è eseguita una istruzione che
richiede l'esecuzione di una system call, ma si è fornito un codice
sbagliato per quest'ultima.
\end{description}
L'azione di default di questi segnali è di terminare il processo, questi
segnali sono:
\begin{description}
-\item \texttt{SIGTERM}
-\item \texttt{SIGINT}
-\item \texttt{SIGQUIT}
-\item \texttt{SIGKILL}
-\item \texttt{SIGHUP}
+\item \macro{SIGTERM} Il nome sta per \textit{terminate}. È un segnale
+ generico usato per causare la conclusione di un programma. Al contrario di
+ \macro{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
+ usa per chiedere in maniera ``educata'' ad un processo di concludersi.
+\item \macro{SIGINT} Il nome sta per \textit{interrupt}. È il segnale di
+ interruzione per il programma. È quello che viene generato di default dal
+ comando \cmd{kill} o dall'invio sul terminale del carattere di controllo
+ INTR (interrupt, generato dalla sequenza \macro{C-c}).
+\item \macro{SIGQUIT} È analogo a \macro{SIGINT} con la differenze che è
+ controllato da un'altro carattere di controllo, QUIT, corrispondente alla
+ sequenza \macro{C-\\}. A differenza del precedente l'azione di default,
+ oltre alla terminazione del processo, comporta anche la creazione di un core
+ dump.
+
+ In genere lo si può pensare come corrispondente ad una condizione di
+ errore del programma rilevata dall'utente. Per questo motivo non è opportuno
+ fare eseguire al manipolatore di questo segnale le operazioni di pulizia
+ normalmente previste (tipo la cancellazione di file temporanei), dato che in
+ certi casi esse possono eliminare informazioni utili nell'esame dei core
+ dump.
+\item \macro{SIGKILL} Il nome è utilizzato per terminare in maniera immediata
+ qualunque programma. Questo segnale non può essere né intercettato, né
+ ignorato, né bloccato, per cui causa comunque la terminazione del processo.
+ In genere esso viene generato solo per richiesta esplicita dell'utente dal
+ comando (o tramite la funzione) \cmd{kill}. Dato che non lo si può
+ intercettare è sempre meglio usarlo come ultima risorsa quando metodi meno
+ brutali, come \macro{SIGTERM} o \macro{C-c} non funzionano.
+
+ Se un processo non risponde a nessun altro segnale \macro{SIGKILL} ne causa
+ sempre la terminazione (in effetti il fallimento della terminazione di un
+ processo da parte di \macro{SIGKILL} costituirebbe un funzionamento del
+ kernel). Talvolta è il sistema stesso che può generare questo segnale quando
+ per condizioni particolari il processo non può più essere eseguito neanche
+ per eseguire il manipolatore.
+\item \macro{SIGHUP} Il nome sta per \textit{hang-up}. Segnala che il
+ terminale dell'utente si è disconnesso (ad esempio perché si è interrotta la
+ rete). Viene usato anche per riportare la terminazione del processo di
+ controllo di un terminale a tutti i processi della sessione, in modo che
+ essi possano disconnettersi dal relativo terminale.
+
+ Viene inoltre usato in genere per segnalare ai demoni (che non hanno un
+ terminale di controllo) la necessità di reinizializzarsi e rileggere il/i
+ file di configurazione.
\end{description}
\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
-con questi segnali la scelta di default è irrilevante, in quanto il loro uso
-presuppone sempre la necessità di un manipolatore. Questi segnali sono:
+Questi segnali sono generati dalla scadenza di un timer. Il loro comportamento
+di default è quello di causare la terminazione del programma, ma con questi
+segnali la scelta di default è irrilevante, in quanto il loro uso presuppone
+sempre la necessità di un manipolatore. Questi segnali sono:
\begin{description}
-\item \texttt{SIGALRM}
-\item \texttt{SIGVTALRM}
-\item \texttt{SIGPROF}
+\item \texttt{SIGALRM} Il nome sta per \textit{alarm}. Segnale la scadenza di
+ un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
+ usato dalla funzione \func{alarm}.
+\item \texttt{SIGVTALRM} Il nome sta per \textit{virtual alarm}. È analogo al
+ precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
+ processo.
+\item \texttt{SIGPROF} Il nome sta per \textit{profiling}. Indica la scadenza
+ di un timer che misura sia il tempo di CPU speso direttamente dal processo
+ che quello che il sistema ha speso per conto di quest'ultimo. In genere
+ viene usato dai tool che servono a fare il profilo d'uso della CPU da parte
+ del processo.
\end{description}
L'azione di default è di essere ignorati. Questi segnali sono:
\begin{description}
-\item \texttt{SIGIO}
-\item \texttt{SIGURG}
-\item \texttt{SIGPOLL}
+\item \texttt{SIGIO} Questo segnale viene inviato quando un file descriptor è
+ pronto per eseguire dell'input/output. In molti sistemi solo i socket e i
+ terminali possono generare questo segnale, in Linux questo può essere usato
+ anche per i file, posto che la \func{fcntl} abbia avuto successo.
+\item \texttt{SIGURG} Questo segnale è inviato quando arrivano dei dati
+ urgenti o \textit{out of band} su di un socket; per maggiori dettagli al
+ proposito si veda \secref{sec:xxx_urgent_data}.
+\item \texttt{SIGPOLL} Questo segnale è equivalente a \macro{SIGIO}, è
+ definito solo per compatibilità con i sistemi System V.
\end{description}
\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}
-\item \texttt{SIGSTOP}
-\item \texttt{SIGTSTP}
-\item \texttt{SIGTTIN}
-\item \texttt{SIGTTOU}
+Questi sono i segnali usati dal controllo delle sessioni e dei processi, il
+loro uso è specifico e viene trattato in maniera specifica nelle sezioni in
+cui si trattano gli argomenti relativi. Questi segnali sono:
+\begin{description}
+\item \macro{SIGCHLD} Questo è il segnale mandato al processo padre quando un
+ figlio termina o viene fermato. L'azione di default è di ignorare il
+ segnale, la sua gestione è trattata in \secref{sec:prochand_wait}.
+\item \macro{SIGCLD} Per Linux questo è solo un segnale identico al
+ precedente, il nome è obsoleto e andrebbe evitato.
+\item \macro{SIGCONT} Il nome sta per \textit{continue}. Il segnale viene
+ usato per fare ripartire un programma precedentemente fermato da
+ \macro{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
+ ripartire il processo prima della sua consegna. Il comportamento di default
+ è di fare solo questo; il segnale non può essere bloccato. Si può anche
+ installare un manipolatore, ma il segnale provoca comunque il riavvio del
+ processo.
+
+ La maggior pare dei programmi non hanno necessità di intercettare il
+ segnale, in quanto esso è completamente trasparente rispetto all'esecuzione
+ che riparte senza che il programma noti niente. Si possono installare dei
+ manipolatori per far si che un programma produca una qualche azione speciale
+ se viene fermato e riavviato, come per esempio riscrivere un prompt, o
+ inviare un avviso.
+\item \macro{SIGSTOP} Il segnale ferma un processo (lo porta in uno stato di
+ sleep); il segnale non può essere né intercettato, né ignorato, né bloccato.
+\item \macro{SIGTSTP} Il nome sta per \textit{interactive stop}. Il segnale
+ ferma il processo interattivamente, ed è generato dal carattere SUSP
+ (prodotto dalla combinazione \macro{C-z}), ed al contrario di
+ \macro{SIGSTOP} può essere intercettato e ignorato. In genere un programma
+ installa un manipolatore per questo segnale quando vuole lasciare il sistema
+ o il terminale in uno stato definito prima di fermarsi; se per esempio un
+ programma ha disabilitato l'eco sul terminale può installare un manipolatore
+ per riabilitarlo prima di fermarsi.
+\item \macro{SIGTTIN}
+\item \macro{SIGTTOU}
\end{description}
\subsection{I segnali di operazioni errate}
L'azione di default di questi segnali è di terminare il processo, questi
segnali sono:
\begin{description}
-\item \texttt{SIGPIPE}
-\item \texttt{SIGLOST}
-\item \texttt{SIGXCPU}
-\item \texttt{SIGXFSZ}
+\item \texttt{SIGPIPE} Sta per \textit{Broken pipe}. Se si usano delle pipes o
+ delle FIFO è necessario che, prima che un processo inizi a scrivere su di
+ essa, un'altro abbia aperto la pipe in lettura (si veda
+ \secref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
+ terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
+ segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
+ lo ha causato fallisce restituendo l'errore \macro{EPIPE}
+\item \texttt{SIGLOST} Sta per \textit{Resource lost}.
+\item \texttt{SIGXCPU} Sta per \textit{CPU time limit exceeded}.
+\item \texttt{SIGXFSZ} Sta per \textit{File size limit exceeded}.
\end{description}
\item \texttt{SIGUSR1} e \texttt{SIGUSR2} Sono due segnali a disposizione
dell'utente che li può usare per quello che vuole. Possono essere utili per
implementare una comunicazione elementare fra processi diversi, o per
- eseguire a richiesta una operazione utlizzando un manipolatore. L'azione di
+ eseguire a richiesta una operazione utilizzando un manipolatore. L'azione di
default è terminare il processo.
\item \texttt{SIGWINCH} Il nome sta per \textit{window (size) change} ed è
generato da molti sistemi (GNU/Linux compreso) quando le dimensioni (in
cioè un puntatore ad una funzione di tipo \type{void} con un parametro di tipo
\type{int}\footnote{si devono usare le parentesi intorno al nome della
funzione per via delle precedenze degli operatori del C, senza di esse si
- sarebbe definita una funzione che ritorna un puntatarore a \type{void} e non
+ sarebbe definita una funzione che ritorna un puntatore a \type{void} e non
un puntatore ad una funzione \type{void}}.
Il numero di segnale passato in \param{signum} segnale può essere indicato