è specificata una azione diversa (nel qual caso solo i segnali successivi alla
nuova specificazione saranno notificati).
-Una volta che il segnale viene notificato (che questo avvenga subito o dopo
-una attesa più o meno lunga) viene eseguita l'azione specificata per detto
+Una volta che un segnale viene notificato (che questo avvenga subito o dopo
+una attesa più o meno lunga) viene eseguita l'azione specificata per il
segnale. Per alcuni segnali (\macro{SIGKILL} e \macro{SIGSTOP}) questa azione
-è fissa e non può essere cambiata, ma per tutti gli altri si può specificare
-una scelta fra le tre seguenti:
+è fissa e non può essere cambiata, ma per tutti gli altri si può selezionare
+una delle tre possibilità seguenti:
\begin{itemize*}
\item \textsl{ignorare} il segnale.
\item accettare l'azione di default per quel segnale.
\end{itemize*}
-Un programma può specificare queste scelte usano le due funzioni \func{signal}
-e \func{sigaction} (vedi \secref{sec:sig_signal} e ); se si è installato un
-manipolatore sarà quest'ultimo ad essere eseguito alla notifica del segnale.
-Inoltre il sistema fa si che mentre viene eseguito il manipolatore di un
-segnale, questo ultimo venga automaticamente bloccato (così si possono evitare
-race condition).
+Un programma può specificare queste scelte usando le due funzioni
+\func{signal} e \func{sigaction} (vedi \secref{sec:sig_signal} e
+\secref{sec:sig_sigaction}); se si è installato un manipolatore sarà
+quest'ultimo ad essere eseguito alla notifica del segnale. Inoltre il sistema
+fa si che mentre viene eseguito il manipolatore di un segnale, questo ultimo
+venga automaticamente bloccato (così si possono evitare race condition).
-Se arriva un segnale per il quale non è stato specificata un'azione viene
-utilizzata l'azione standard. Questa è diversa da segnale a segnale (come
-vedremo in \secref{sec:sig_standard}); nella maggior parte dei casi essa
-comporta la terminazione del processo, per alcuni segnali che rappresentano
-eventi innocui invece l'azione di default è quella di essere ignorati.
+Nel caso non sia stata specificata un'azione, viene utilizzata l'azione
+standard che (come vedremo in \secref{sec:sig_standard}) è propria di ciascun
+segnale; nella maggior parte dei casi essa porta alla terminazione del
+processo, ma alcuni segnali che rappresentano eventi innocui vengono ignorati.
Quando un segnale termina un processo, il padre può determinare la causa della
terminazione esaminando il codice di stato riportato delle funzioni
I segnali che rappresentano errori del programma (divisione per zero o
violazioni di accesso) hanno anche la caratteristica di scrivere un file di
-\textit{core dump} che registra lo stato del processo prima della
-terminazione, che e può essere esaminato da un debugger per investigare sulla
-causa dell'errore. Lo stesso avviene se i suddetti segnale vengono generati
-con una \func{kill}.
+\textit{core dump} che registra lo stato del processo (ed in particolare della
+memoria e dello stack) prima della terminazione. Questo può essere esaminato
+in seguito con un debugger per investigare sulla causa dell'errore. Lo stesso
+avviene se i suddetti segnale vengono generati con una \func{kill}.
+
\section{La classificazione dei segnali}
\label{sec:sig_classification}
-Esamineremo in questa sezione i vari segnali definiti nel sistema, le loro
-caratteristiche e tipologia, le varie macro e costanti che permettono di
-identificarli, e le funzioni che ne stampano la descrizione.
+Esamineremo in questa sezione quali sono i vari segnali definiti nel sistema,
+le loro caratteristiche e tipologia, le varie macro e costanti che permettono
+di identificarli, e le funzioni che ne stampano la descrizione.
\subsection{I segnali standard}
Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso
diretto di questo numero da parte dei programmi è da evitare, in quanto esso
-può variare a seconda dell'implementazione del sistema.
+può variare a seconda dell'implementazione del sistema, e nel caso si Linux,
+anche a seconda dell'architettura hardware.
\begin{table}[htb]
\footnotesize
\textbf{Segnale}&\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
\hline
\hline
- \macro{SIGHUP} &PL& A &Hangup o fine del processo di controllo\\
- \macro{SIGINT} &PL& A &Interrupt da tastiera (\cmd{C-c})\\
- \macro{SIGQUIT} &PL& C &Quit da tastiera (\cmd{C-y}) \\
- \macro{SIGILL} &PL& C & Istruzione illegale\\
- \macro{SIGABRT} &PL& C & Segnale di abort da \func{abort} \\
- \macro{SIGFPE} &PL& C & Errore aritmetico\\
- \macro{SIGKILL} &PL&AEF& Segnale di terminazione forzata \\
- \macro{SIGSEGV} &PL& C & Errore di accesso in memoria\\
- \macro{SIGPIPE} &PL& A & Pipe spezzata\\
- \macro{SIGALRM} &PL& A & Segnale del timer da \func{alarm} \\
- \macro{SIGTERM} &PL& A & Segnale di terminazione \verb|C-\|\\
- \macro{SIGUSR1} &PL& A & Segnale utente numero 1\\
- \macro{SIGUSR2} &PL& A & Segnale utente numero 2\\
- \macro{SIGCHLD} &PL& B & Figlio terminato o fermato\\
- \macro{SIGCONT} &PL& & Continua se fermato\\
- \macro{SIGSTOP} &PL&DEF& Ferma il processo\\
- \macro{SIGTSTP} &PL& D & Stop typed at tty \\
- \macro{SIGTTIN} &PL& D & Input sul terminale per un processo
- in background\\
- \macro{SIGTTOU} &PL& D & Output sul terminale per un processo
- in background\\
- \macro{SIGBUS} &SL& C & Errore sul bus (bad memory access) \\
- \macro{SIGPOLL} &SL& A & Pollable event (Sys V).
- Sinonimo di \macro{SIGIO}\\
- \macro{SIGPROF} &SL& A & Timer del profiling scaduto \\
- \macro{SIGSYS} &SL& C & Bad argument to routine (SVID)\\
- \macro{SIGTRAP} &SL & C & Trace/breakpoint trap \\
- \macro{SIGURG} &SLB& B & Urgent condition on socket\\
- \macro{SIGVTALRM}&SLB& A & Virtual alarm clock\\
- \macro{SIGXCPU} &SLB& C & Ecceduto il limite sul CPU time\\
- \macro{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimezsione dei file\\
- \macro{SIGIOT} &L & C & IOT trap. A synonym for SIGABRT \\
- \macro{SIGEMT} &L & & \\
- \macro{SIGSTKFLT}&L & A & Stack fault on coprocessor \\
- \macro{SIGIO} &LB& A & I/O now possible (4.2 BSD) \\
- \macro{SIGCLD} &L & & A synonym for SIGCHLD \\
- \macro{SIGPWR} &L & A & Power failure (System V) \\
- \macro{SIGINFO} &L & & A synonym for SIGPWR \\
- \macro{SIGLOST} &L & A & File lock lost \\
- \macro{SIGWINCH} &LB& B & Window resize signal (4.3 BSD, Sun) \\
- \macro{SIGUNUSED}&L & A & Unused signal (will be SIGSYS) \\
+ \macro{SIGHUP} &PL & A & Hangup o fine del processo di controllo \\
+ \macro{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\
+ \macro{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\
+ \macro{SIGILL} &PL & C & Istruzione illegale \\
+ \macro{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\
+ \macro{SIGFPE} &PL & C & Errore aritmetico \\
+ \macro{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\
+ \macro{SIGSEGV} &PL & C & Errore di accesso in memoria \\
+ \macro{SIGPIPE} &PL & A & Pipe spezzata \\
+ \macro{SIGALRM} &PL & A & Segnale del timer da \func{alarm} \\
+ \macro{SIGTERM} &PL & A & Segnale di terminazione \verb|C-\| \\
+ \macro{SIGUSR1} &PL & A & Segnale utente numero 1 \\
+ \macro{SIGUSR2} &PL & A & Segnale utente numero 2 \\
+ \macro{SIGCHLD} &PL & B & Figlio terminato o fermato \\
+ \macro{SIGCONT} &PL & & Continua se fermato \\
+ \macro{SIGSTOP} &PL &DEF& Ferma il processo \\
+ \macro{SIGTSTP} &PL & D & Stop typed at tty \\
+ \macro{SIGTTIN} &PL & D & Input sul terminale per un processo
+ in background \\
+ \macro{SIGTTOU} &PL & D & Output sul terminale per un processo
+ in background \\
+ \macro{SIGBUS} &SL & C & Errore sul bus (bad memory access) \\
+ \macro{SIGPOLL} &SL & A & Pollable event (Sys V).
+ Sinonimo di \macro{SIGIO} \\
+ \macro{SIGPROF} &SL & A & Timer del profiling scaduto \\
+ \macro{SIGSYS} &SL & C & Bad argument to routine (SVID) \\
+ \macro{SIGTRAP} &SL & C & Trace/breakpoint trap \\
+ \macro{SIGURG} &SLB& B & Urgent condition on socket \\
+ \macro{SIGVTALRM}&SLB& A & Virtual alarm clock \\
+ \macro{SIGXCPU} &SLB& C & Ecceduto il limite sul CPU time \\
+ \macro{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file \\
+ \macro{SIGIOT} &L & C & IOT trap. A synonym for \macro{SIGABRT} \\
+ \macro{SIGEMT} &L & & \\
+ \macro{SIGSTKFLT}&L & A & Stack fault on coprocessor \\
+ \macro{SIGIO} &LB & A & I/O now possible (4.2 BSD) \\
+ \macro{SIGCLD} &L & & A synonym for \macro{SIGCHLD} \\
+ \macro{SIGPWR} &L & A & Fallimento dell'alimentazione \\
+ \macro{SIGINFO} &L & & A synonym for \macro{SIGPWR} \\
+ \macro{SIGLOST} &L & A & Perso un lock sul file (per NFS) \\
+ \macro{SIGWINCH} &LB & B & Window resize signal (4.3 BSD, Sun) \\
+ \macro{SIGUNUSED}&L & A & Unused signal (will be SIGSYS) \\
\hline
\end{tabular}
\caption{Lista dei segnali in Linux.}
\label{tab:sig_signal_list}
\end{table}
-Per questo motivo ad ogni segnale viene associato un nome, che corrisponde,
-tramite una macro di preprocessore, al suddetto numero. Sono questi nomi, che
-sono standardizzati e sostanzialemnte uniformi rispetto alle varie
+Per questo motivo ad ogni segnale viene associato un nome, definendo con una
+macro di preprocessore una costante uguale al suddetto numero. Sono questi
+nomi, che sono standardizzati e sostanzialemnte 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 \file{signal.h}.
\hline
P & POSIX. \\
B & BSD. \\
- L & Linux \\
- S & SUSv2 \\
+ L & Linux.\\
+ S & SUSv2.\\
\hline
\end{tabular}
\caption{Legenda dei valori della colonna \textbf{Standard} di
Una modalità alternativa per utilizzare le descrizioni restituite da
\func{strsignal} e \func{psignal} è quello di fare usare la variabile
-\var{sys\_siglist}, che può essere acceduta dichiarando:
+\var{sys\_siglist}, che è definita in \file{signal.h} e può essere acceduta
+con la dichiarazione:
\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
extern const char *const sys_siglist[]
\end{lstlisting}
-\var{sys\_siglist} contiene le stringhe di descrizione indicizzate per numero
-di segnale, per cui \code{char *decr = strsignal(SIGINT)} può essere
-sostituito dall'equivalente \code{char *decr = sys\_siglist[SIGINT]}.
+l'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione,
+indicizzate per numero di segnale, per cui una chiamata del tipo di \code{char
+ *decr = strsignal(SIGINT)} può essere sostituita dall'equivalente \code{char
+ *decr = sys\_siglist[SIGINT]}.
In questa definizione si è usato il tipo \type{sighandler\_t} che è una
estensione GNU definita in Linux che permette di riscrivere il prototipo in
-forma più leggibile dell'originario \code{void (*signal(int signum, void
- (*handler)(int)))int)}, e che è sostanzialmente equivalente alla
-definizione:
+forma più leggibile dell'originario:
+\begin{verbatim}
+void (*signal(int signum, void (*handler)(int)))int)
+\end{verbatim}
+che, per la poca chiarezza della sintassi del C quando si vanno a trattare
+puntatori a funzioni, è molto meno comprensibile, da questo si può dedurre la
+definizione di \type{sighandler\_t} che è:
\begin{verbatim}
typedef void (* sighandler_t)(int)
\end{verbatim}
-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 puntatore a \type{void} e non
- un puntatore ad una funzione \type{void}}.
+si tratta cioè un puntatore ad una funzione \type{void} (cioè senza valore di
+rtorno) e che prende un argomento 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 puntatore a \type{void} e non un puntatore ad una funzione \type{void}}.
+La funzione \func{signal} quindi restituisce e prende come secondo argomento
+un puntatore a una funzione di questo tipo, che è appunto il manipolatore del
+segnale.
Il numero di segnale passato in \param{signum} segnale può essere indicato
-direttamente con una delle costanti definite in \secref{sec:sig_standard}, il
+direttamente con una delle costanti definite in \secref{sec:sig_standard}. Il
manipolatore \param{handler} invece, oltre all'indirizzo della funzione da
chiamare all'occorrenza del segnale, può assumere anche i valori costanti
\macro{SIG\_IGN} con cui si dice ignorare il segnale e \macro{SIG\_DFL} per
-installare l'azione di di default (si ricordi però che i due segnali
-\macro{SIGKILL} e \macro{SIGSTOP} non possono essere ignorati né
-intercettati).
+installare l'azione di di default\footnote{si ricordi però che i due segnali
+ \macro{SIGKILL} e \macro{SIGSTOP} non possono essere ignorati né
+ intercettati}.
+
+
+
\subsection{Funzioni rientranti e default dei segnali}