Nella semantica \textit{unreliable} la routine di gestione del segnale
specificata dall'utente non resta installata una volta chiamata; è perciò a
carico dell'utente stesso ripetere l'installazione all'interno della routine
-stessa in tutti i casi in cui si vuole che il signal handler esterno resti
-attivo.
-
-Per questo motivo è possibile una race-condition in cui il segnale arriva
-prima che il suo manipolatore sia installato, nel qual caso il segnale può
-essere perso o causare il comportamento originale (in genere la terminazione
-del processo). Questa è la ragione per cui detti segnali sono chiamati
-\textit{inaffidabili}, in quanto la ricezione del segnale e la reinstallazione
-del suo manipolatore non sono operazioni atomiche.
-
-In caso di implementazione inaffidabile le chiamate di sistema non sono fatte
-ripartire automaticamente quando sono interrotte da un segnale, per questo il
-programma deve controllare lo stato di uscita della chiamata al sistema e
-riperterla nel caso l'errore riportato da \texttt{errno} sia \texttt{EINTR}.
+di gestione stessa in tutti i casi in cui si vuole che il signal handler
+esterno resti attivo.
+
+Per questo motivo è possibile una race-condition in cui un secondo segnale
+arriva prima che il manipolatore abbia eseguito la re-installazione di se
+stesso, nel qual caso il segnale può essere perso o causare il comportamento
+originale assegnato al segnale (in genere la terminazione del processo).
+Questa è la ragione per cui detti segnali sono chiamati \textit{inaffidabili},
+in quanto la ricezione del segnale e la reinstallazione del suo manipolatore
+non sono operazioni atomiche.
+
+Nel caso di implementazione inaffidabile le chiamate di sistema non
+sono fatte ripartire automaticamente quando sono interrotte da un segnale, per
+questo il programma deve controllare lo stato di uscita della chiamata al
+sistema e riperterla nel caso l'errore riportato da \texttt{errno} sia
+\texttt{EINTR}.
Inoltre in questo caso non esiste una modalità semplice per ottenere una
operazione di pausa atomica (cioè mandare in sleep un processo fino all'arrivo
\subsubsection{Tipi di segnali}
\label{sec:sig_types}
-
In generale gli eventi che generano i segnali si possono dividere in tre
categorie principali: errori, eventi e richieste esplicite.
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.
+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]
+ \centering
+ \begin{tabular}[c]{|l|c|c|c||c|l|}
+ \hline
+ Segnale & POSIX.1 & SUSv2 & Linux &Azione & Descrizione \\
+ \hline
+ \hline
+ SIGHUP &$\bullet$&&$\bullet$& A & Hangup \\
+ SIGINT &$\bullet$&&$\bullet$& A & Interrupt from keyboard \\
+ SIGQUIT &$\bullet$&&$\bullet$& C & Quit from keyboard \\
+ SIGILL &$\bullet$&&$\bullet$& C & Illegal Instruction \\
+ SIGABRT &$\bullet$&&$\bullet$& C & Abort signal from abort(3) \\
+ SIGFPE &$\bullet$&&$\bullet$& C & Floating point exception \\
+ SIGKILL &$\bullet$&&$\bullet$& AEF & Kill signal \\
+ SIGSEGV &$\bullet$&&$\bullet$& C & Invalid memory reference \\
+ SIGPIPE &$\bullet$&&$\bullet$& A & Broken pipe \\
+ SIGALRM &$\bullet$&&$\bullet$& A & Timer signal from alarm(2) \\
+ SIGTERM &$\bullet$&&$\bullet$& A & Termination signal \\
+ SIGUSR1 &$\bullet$&&$\bullet$& A & User-defined signal 1 \\
+ SIGUSR2 &$\bullet$&&$\bullet$& A & User-defined signal 2 \\
+ SIGCHLD &$\bullet$&&$\bullet$& B & Child stopped or terminated \\
+ SIGCONT &$\bullet$&&$\bullet$& & Continue if stopped \\
+ SIGSTOP &$\bullet$&&$\bullet$& DEF & Stop process \\
+ SIGTSTP &$\bullet$&&$\bullet$& D & Stop typed at tty \\
+ SIGTTIN &$\bullet$&&$\bullet$& D & tty input for background process \\
+ SIGTTOU &$\bullet$&&$\bullet$& D & tty output for background process \\
+ SIGBUS &&$\bullet$&$\bullet$& C & Bus error (bad memory access) \\
+ SIGPOLL &&$\bullet$&$\bullet$& A & Pollable event (Sys V). Synonym of SIGIO\\
+ SIGPROF &&$\bullet$&$\bullet$& A & Profiling timer expired \\
+ SIGSYS &&$\bullet$&$\bullet$& C & Bad argument to routine (SVID) \\
+ SIGTRAP &&$\bullet$&$\bullet$& C & Trace/breakpoint trap \\
+ SIGURG &&$\bullet$&$\bullet$& B & Urgent condition on socket (4.2 BSD) \\
+ SIGVTALRM &&$\bullet$&$\bullet$& A & Virtual alarm clock (4.2 BSD) \\
+ SIGXCPU &&$\bullet$&$\bullet$& C & CPU time limit exceeded (4.2 BSD) \\
+ SIGXFSZ &&$\bullet$&$\bullet$& C & File size limit exceeded (4.2 BSD) \\
+ SIGIOT &&&$\bullet$& C & IOT trap. A synonym for SIGABRT \\
+ SIGEMT &&&$\bullet$& & \\
+ SIGSTKFLT &&&$\bullet$& A & Stack fault on coprocessor \\
+ SIGIO &&&$\bullet$& A & I/O now possible (4.2 BSD) \\
+ SIGCLD &&&$\bullet$& & A synonym for SIGCHLD \\
+ SIGPWR &&&$\bullet$& A & Power failure (System V) \\
+ SIGINFO &&&$\bullet$& & A synonym for SIGPWR \\
+ SIGLOST &&&$\bullet$& A & File lock lost \\
+ SIGWINCH &&&$\bullet$& B & Window resize signal (4.3 BSD, Sun) \\
+ SIGUNUSED &&&$\bullet$& A & Unused signal (will be SIGSYS) \\
+ \hline
+ \end{tabular}
+ \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 è:
+\begin{table}[htb]
+ \centering
+ \begin{tabular}[c]{c p{6cm}}
+ 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
+ dump}. \\
+ D & L'azione di default è fermare il processo. \\
+ E & Il segnale non può essere intercettato. \\
+ F & Il segnale non può essere ignorato.\\
+ \end{tabular}
+ \caption{Legenda delle caratteristiche dei segnali riportate in
+ \tabref{tab:sig_signal_list}. }
+ \label{tab:sig_action_leg}
+\end{table}
+
+
\subsubsection{Segnali di errore di programma}
+\label{sec:sig_prog_error}
Questi segnali sono generati quando il sistema, o in certi casi direttamente
l'hardware (come per i page fault non validi) rileva un qualche errore
Questi segnali sono:
-\begin{itemize}
+\begin{list}
\item \texttt{SIGFPE} Riporta un errore aritmetico fatale. Benché il nome
derivi da \textit{floating point exception} si applica a tutti gli errori
- aritmetici compresa la divisione per zero e l'overflow.
+ aritmetici compresa la divisione per zero e l'overflow.
% Per questo segnale le cose sono complicate dal fatto che possono esserci
% molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo
È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
inizializzato leggendo al di la della fine di un vettore.
-
-\item \texttt{SIGBUS}
-\item \texttt{SIGABRT}
+
+\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}
+\item \texttt{SIGSYS} Sta ad indicare che si è eseguta una istruzione che
+ richiede l'esecuzione di una system call, ma si è fornito un codice
+ sbagliato per quest'ultima.
+\end{list}
+
+
+\subsection{I segnali di terminazione}
+\label{sec:sig_termination}
+
+Questo tipo di segnali sono usati per terminare un processo; hanno vari nomi a
+causa del differente uso che se ne può fare, ed i programmi possono
+trattarli in maniera differente.
+
+La ragione per cui può essere necessario trattare questi segnali è che il
+programma può dover eseguire una serie di azioni di pulizia prima di
+terminare, come salvare informazioni sullo stato in cui si trova, cancellare
+file temporanei, o ripristinare delle condizioni alterate durante il
+funzionamento (tipi il modo del terminale o i settaggi di una qualche
+periferica).
+
+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}
+\end{description}
+
+\subsection{I segnali di allarme}
+\label{sec:sig_alarm}
+
+\begin{description}
+\item \texttt{SIGALRM}
+\item \texttt{SIGVTALRM}
+\item \texttt{SIGPROF}
+\end{description}
+
+
+\subsection{I segnali di I/O asincrono}
+\label{sec:sig_asyncio}
+
+\begin{description}
+\item \texttt{SIGIO}
+\item \texttt{SIGURG}
+\item \texttt{SIGPOLL}
+\end{description}
+
+\subsection{I segnali per il controllo di sessione}
+\label{sec:sig_job_control}
+
+
+\begin{description}
+\item \texttt{SIGCHLD}
+\item \texttt{SIGCONT}
+\item \texttt{SIGSTOP}
+\item \texttt{SIGTSTP}
+\item \texttt{SIGTTIN}
+\item \texttt{SIGTTOU}
+\end{description}
+
+\subsection{I segnali di operazioni errate}
+\label{sec:sig_oper_error}
+
+\begin{description}
+\item \texttt{SIGPIPE}
+\item \texttt{SIGLOST}
+\item \texttt{SIGXCPU}
+\item \texttt{SIGXFSZ}
+\end{description}
+
+
+\subsection{Ulteriori segnali}
+\label{sec:sig_misc_sig}
+
+\begin{description}
+\item \texttt{SIGUSR1} e \texttt{SIGUSR2}
+\item \texttt{SIGWINCH}
+\item \texttt{SIGINFO}
+\end{description}
-\end{itemize}