Aggiunte alle semantiche
[gapil.git] / signal.tex
1 \chapter{I segnali}
2 \label{sec:signals}
3
4 I segnali sono il primo e più semplice meccanismo di comunicazione nei
5 confronti dei processi. Non portano con se nessuna informazione che non sia il
6 loro tipo, si tratta in sostanza di un'interruzione software portata ad un
7 processo.
8
9 In genere i segnali vengono usati dal kernel per riportare situazioni
10 eccezionali (come errori di accesso, eccezioni aritmetiche, etc.) ma possono
11 anche essere usati come forma elementare di comunicazione fra processi (ad
12 esempio vengono usati per il controllo di sessione), per notificare eventi
13 (come la terminazione di un processo figlio), etc.
14
15 \section{I concetti base}
16 \label{sec:sig_base}
17
18 Come il nome stesso indica i segnali sono usati per notificare ad un processo
19 l'occorrenza di un evento eccezionale. Gli eventi che possono generare un
20 segnale sono vari; un breve elenco di possibile cause è il seguente:
21
22 \begin{itemize}
23 \item un errore del programma, come una divisione per zero o un tentativo di
24   accesso alla memoria fuori dai limiti validi.
25 \item la terminazione di un processo figlio.
26 \item la scadenza di un timer o di un allarme.
27 \item il tentativo di effettuare un'operazione di input/output che non può
28   essere eseguita.
29 \item una richiesta dell'utente di terminare o fermare il programma. In genere
30   si realizza attraverso un segnale mandato dalla shell in corrispondenza
31   della pressione di tasti del terminale come 'ctrl-c' o 'ctrl-z'.
32 \item l'esecuzione di una \texttt{kill} o di una \texttt{raise} da parte del
33   processo stesso o di un'altro (solo nel caso della \texttt{kill}).
34 \end{itemize}
35
36 Ciascuno di questi eventi (tranne gli ultimi due che sono controllati
37 dall'utente) comporta l'intervento diretto da parte del kernel che causa la
38 generazione un particolare tipo di segnale.
39
40
41 \subsection{Le modalità di funzionamento}
42 \label{sec:sig_semantics}
43
44 Quando un processo riceve un segnale il kernel esegue una apposita routine di
45 gestione (il cosiddetto \textit{signal handler}) che può essere specificata
46 dall'utente.  Negli anni il comportamento del sistema in risposta ai segnali è
47 stato modificato in vari modi nelle differenti implementazioni di unix.  Si
48 possono individuare due tipologie fondamentali di comportamento dei segnali
49 (dette semantiche) che vengono chiamate rispettivamente \textit{reliable} e
50 \textit{unreliable}.
51
52 Nella semantica \textit{unreliable} (quella implementata dalle prime versioni
53 di unix) la routine di gestione del segnale specificata dall'utente non resta
54 installata una volta chiamata; è perciò a carico dell'utente stesso ripetere
55 l'installazione all'interno della routine di gestione stessa in tutti i casi
56 in cui si vuole che il signal handler esterno resti attivo.
57
58 Per questo motivo è possibile una race-condition in cui un secondo segnale
59 arriva prima che il manipolatore abbia eseguito la re-installazione di se
60 stesso.  In questo caso il segnale può essere perso o causare il comportamento
61 originale assegnato al segnale (in genere la terminazione del processo).
62
63 Questa è la ragione per cui l'implementazione dei segnali secondo questa
64 semantica viene chiamata \textit{inaffidabile}, in quanto la ricezione del
65 segnale e la reinstallazione del suo manipolatore non sono operazioni
66 atomiche.
67
68 Un'altro problema è che in questa semantica è che non esiste un modo per
69 bloccare i segnali quando non si vuole che arrivino; i processi possono
70 ignorare il segnale, ma non è possibile istruire il sistema a non fare nulla
71 in occasione di un segnale, pur mantenendo memoria del fatto che è avvenuto.
72
73 Un caso classico, riportato da Stevens, in cui si incontra questo problema, è
74 quello in cui si usa il manipolatore per settare un flag che riporta al
75 processo l'occorrenza del segnale, se si considera il seguente segmento di
76 codice: 
77 \begin{lstlisting}
78 int signal_flag = 0;
79 main ()
80 {
81     int sig_handler();            /* handler function */
82     ...
83     signal(SIGINT, sig_handler);  /* establish handler */
84     ...
85     while(signal_flag == 0)       /* while flag is zero */
86         pause();                  /* go to sleep */
87     ... 
88 }
89 int sig_handler() 
90 {
91     signal(SIGINT, sig_handler);  /* restablish handler */
92     signal_flag = 1;              /* set flag */
93 }
94 \end{lstlisting}
95
96
97 % non supporta l'ultima delle due ma vale la pena parlarne
98 % dato che è stata la prima ad essere stata implementata (e se ne trovano
99 % conseguenze in alcuni programmi e funzioni di libreria) ed illustra bene
100 % alcune delle caratteristiche dei segnali.
101
102
103 % Un'altra caratteristica della implementazione inaffidabile è che le chiamate
104 % di sistema non sono fatte ripartire automaticamente quando sono interrotte da
105 % un segnale, per questo un programma deve controllare lo stato di uscita della
106 % chiamata al sistema e riperterla nel caso l'errore riportato da \texttt{errno}
107 % sia \texttt{EINTR}.
108
109 Inoltre in questo caso non esiste una modalità semplice per ottenere una
110 operazione di pausa atomica (cioè mandare in sleep un processo fino all'arrivo
111 di un segnale), dato che ci sono casi in cui un segnale può arrivare quando il
112 programma non è in grado di accorgersene.
113
114 Nella semantica \textit{reliable} (quella utilizzata da Linux e da ogni Unix
115 moderno) invece il signal handler una volta installato resta attivo e non si
116 hanno tutti i problemi precedenti. In questa semantica i segnali vengono
117 \textsl{generati} dal kernel per un processo all'occorrenza dell'evento che
118 causa il segnale. In genere questo viene fatto dal kernel settanto un flag
119 nella process table del processo.
120
121 Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
122 \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre
123 per tutto il tempo che passa fra la generazione del segnale e la sua consegna
124 esso è detto \textsl{pendente}. In genere questa procedura viene effettuata
125 dal kernel quando, riprendendo l'esecuzione del processo in questione, verifica
126 la presenza del flag del segnale nella process table.
127
128 In questa semantica un processo può bloccare i segnali 
129
130
131 % Torneremo su
132 % questo più avanti in \secref{sec:sig_linux_sematic}.
133
134 % Inoltre alcune
135 % chiamate di sistema possono essere fatte ripartire automaticamente e si può
136 % ottenere un'operazione di pausa atomica (usando la funzione POSIX
137 % \texttt{sigsuspend}).
138
139
140 \subsubsection{Tipi di segnali}
141 \label{sec:sig_types}
142
143 In generale gli eventi che generano i segnali si possono dividere in tre
144 categorie principali: errori, eventi e richieste esplicite. 
145
146 Un errore significa che un programma ha fatto qualcosa di sbagliato e non può
147 continuare ad essere eseguito. Non tutti gli errori causano dei segnali, in
148 genere la condizione di errore più comune comporta la restituzione di un
149 codice di errore da parte di una funzione di libreria, sono gli errori che
150 possono avvenire ovunque in un programma che causano l'emissione di un
151 segnale, come le divisioni per zero o l'uso di indirizzi di memoria non validi.
152
153 Un evento esterno ha in genere a che fare con l'I/O o con altri processi;
154 esempi di segnali di questo tipo sono quelli legati all'arrivo di dati di
155 input, scadenze di un timer, terminazione di processi figli.
156
157 Una richiesta esplicita significa l'uso di una chiamata di sistema (come
158 \texttt{kill} o \texttt{raise}) per la generazione di un segnale, cosa che
159 viene fatta usualmente dalla shell quando l'utente invoca la sequenza di tasti
160 di stop o di suspend, ma può essere pure inserita all'interno di un programma.
161
162 Si dice poi che i segnali possono essere \textit{asincroni} o
163 \textit{sincroni}. Un segnale sincrono è legato ad una azione specifica di un
164 programma ed è inviato (a meno che non sia bloccato) durante tale azione;
165 molti errori generano segnali sincroni, così come la richiesta esplicita da
166 parte del processo tramite le chiamate al sistema. Alcuni errori come la
167 divisione per zero non sono completamente sincroni e possono arrivare dopo
168 qualche istruzione.
169
170 I segnali asincroni sono generati da eventi fuori dal controllo del processo
171 che li riceve e arrivano in tempi impredicibili nel corso dell'esecuzione del
172 programma. Eventi esterni come la terminazione di un processo figlio generano
173 segnali asincroni, così come le richieste di generazione di un segnale
174 effettuate da altri processi.
175
176 In generale un tipo di segnale o è sincrono o è asincrono, salvo il caso in
177 cui esso sia generato attraverso una richiesta esplicita tramite chiamata al
178 sistema, nel qual caso qualunque tipo di segnale (quello scelto nella
179 chiamata) può diventare sincrono o asincrono a seconda che sia generato
180 internamente o esternamente al processo.
181
182 \subsection{La notifica dei segnali}
183 \label{sec:sig_notification}
184
185 Quando un segnale viene generato il kernel prende nota del fatto; si dice così
186 che diventa \textit{pending} (sospeso), e rimarrà tale fino al momento in cui
187 verrà notificato al processo a cui deve essere inviato.
188
189 Normalmente l'invio al processo che deve ricevere il segnale è immediato, a
190 meno che il segnale in questione non sia stato bloccato (\textit{blocked}) nel
191 qual caso l'invio non avviene ed il segnale resta sospeso indefinitamente. Una
192 volta però che esso venga sbloccato il segnale sarà subito notificato.
193
194 Una volta che il segnale viene notificato (che questo avvenga subito o dopo
195 una attesa più o meno lunga) viene eseguita l'azione specificata per detto
196 segnale. Per alcuni segnali (\texttt{SIGKILL} e \texttt{SIGSTOP}) questa azione
197 è fissa e non può essere cambiata, ma per tutti gli altri il programma può
198 specificare una scelta fra le tre seguenti:
199
200 \begin{itemize}
201 \item ignorare il segnale
202 \item utilizzare il manipolatore (\textit{signal handler}) specificato
203 \item accettare l'azione di default per quel segnale.
204 \end{itemize}
205
206 Il programma può specificare queste scelte usano le due routine
207 \texttt{signal} e \texttt{sigaction}; se si è installato un manipolatore sarà
208 quest'ultimo a intercettare il segnale ed ad essere eseguito, e mentre viene
209 eseguito (onde evitare race conditions) il segnale viene bloccato.
210
211 Se l'azione specificata per un certo tipo di segnale è quella di ignorarlo
212 questo sarà scartato immediatamente ogni volta che verrà generato, e questo
213 avverrà anche se in quel momento il segnale è bloccato. Per questo un segnale
214 ignorato non sarà mai notificato, anche se in seguito si sarà specificata una
215 diversa azione per lo stesso segnale.
216
217 Se arriva un segnale per il quale non è stato specificata un'azione viene
218 utilizzata l'azione standard. Questa è diversa da segnale a segnale (come
219 vedremo in \secref{sec:sig_standard}) ma per la maggior parte essa comporta la
220 terminazione del processo, per alcuni che invece rappresentano eventi innocui
221 l'azione standard è di non fare nulla.
222
223 Quando un segnale termina un processo, il padre può determinare la causa della
224 terminazione esaminando il codice di stato riportato delle funzioni
225 \texttt{wait} e \texttt{waitpid} in cui è riportato anche se la causa è un
226 segnale e nel caso quale; questo è il modo in cui la shell determina i motivi
227 della terminazione di un programma e scrive un eventuale messaggio di errore.
228
229 I segnali che rappresentano errori del programma (divisione per zero o
230 violazioni di accesso) hanno anche la caratteristica di scrivere un file
231 \textit{core dump} che registra lo stato del processo prima della terminazione
232 e può essere esaminato da un debugger per investigare sulla causa dell'errore.
233 Lo stesso avviene se i suddetti segnale vengono generati artificialmente con
234 una \texttt{kill}.
235
236
237
238 \section{I segnali standard}
239 \label{sec:sig_standard}
240
241 Esaminiamo ora i vari segnali disponibili e le loro caratteristiche. 
242 Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso
243 diretto di questo numero da parte dei programmi è da evitare, in quanto esso
244 può variare a seconda dell'implementazione del sistema.
245
246 Per questo ad ogni tipo di segnale viene associato un nome, che corrisponde,
247 tramite una macro di preprocessore, al suddetto numero. Sono questi nomi, che
248 sono standardizzati e uniformi rispetto alle varie implementazioni, che si
249 devono usare nei programmi. Tutti i nomi e le funzioni che concernono i
250 segnali sono definiti nell'header di sistema \texttt{signal.h}.
251
252 Il numero totale di segnali presenti è dato dalla macro \texttt{NSIG}, e dato
253 che i numeri dei segnali sono allocati progressivamente, essa corrisponde
254 anche al successivo del valore numerico assegnato all'ultimo segnale definito.
255 In \ntab\ si è riportato l'elenco completo dei segnali definiti in Linux
256 (estratto dalle man page), comparati con quelli definiti in vari standard.
257 \begin{table}[htb]
258   \centering
259   \begin{tabular}[c]{|l|c|c|c||c|l|}
260     \hline
261     Segnale  & POSIX.1 & SUSv2 & Linux  &Azione &  Descrizione                \\
262     \hline
263     \hline
264     SIGHUP   &$\bullet$&&$\bullet$&  A  & Hangup                                \\
265     SIGINT   &$\bullet$&&$\bullet$&  A  & Interrupt from keyboard               \\
266     SIGQUIT  &$\bullet$&&$\bullet$&  C  & Quit from keyboard                    \\
267     SIGILL   &$\bullet$&&$\bullet$&  C  & Illegal Instruction                   \\
268     SIGABRT  &$\bullet$&&$\bullet$&  C  & Abort signal from abort(3)            \\
269     SIGFPE   &$\bullet$&&$\bullet$&  C  & Floating point exception              \\
270     SIGKILL  &$\bullet$&&$\bullet$& AEF & Kill signal                           \\
271     SIGSEGV  &$\bullet$&&$\bullet$&  C  & Invalid memory reference              \\
272     SIGPIPE  &$\bullet$&&$\bullet$&  A  & Broken pipe                           \\
273     SIGALRM  &$\bullet$&&$\bullet$&  A  & Timer signal from alarm(2)            \\
274     SIGTERM  &$\bullet$&&$\bullet$&  A  & Termination signal                    \\
275     SIGUSR1  &$\bullet$&&$\bullet$&  A  & User-defined signal 1                 \\
276     SIGUSR2  &$\bullet$&&$\bullet$&  A  & User-defined signal 2                 \\
277     SIGCHLD  &$\bullet$&&$\bullet$&  B  & Child stopped or terminated           \\
278     SIGCONT  &$\bullet$&&$\bullet$&     & Continue if stopped                   \\
279     SIGSTOP  &$\bullet$&&$\bullet$& DEF & Stop process                          \\
280     SIGTSTP  &$\bullet$&&$\bullet$&  D  & Stop typed at tty                     \\
281     SIGTTIN  &$\bullet$&&$\bullet$&  D  & tty input for background process      \\
282     SIGTTOU  &$\bullet$&&$\bullet$&  D  & tty output for background process     \\
283     SIGBUS    &&$\bullet$&$\bullet$& C & Bus error (bad memory access)         \\
284     SIGPOLL   &&$\bullet$&$\bullet$& A & Pollable event (Sys V). Synonym of SIGIO\\
285     SIGPROF   &&$\bullet$&$\bullet$& A & Profiling timer expired               \\
286     SIGSYS    &&$\bullet$&$\bullet$& C & Bad argument to routine (SVID)        \\
287     SIGTRAP   &&$\bullet$&$\bullet$& C & Trace/breakpoint trap                 \\
288     SIGURG    &&$\bullet$&$\bullet$& B & Urgent condition on socket (4.2 BSD)  \\
289     SIGVTALRM &&$\bullet$&$\bullet$& A & Virtual alarm clock (4.2 BSD)         \\
290     SIGXCPU   &&$\bullet$&$\bullet$& C & CPU time limit exceeded (4.2 BSD)     \\
291     SIGXFSZ   &&$\bullet$&$\bullet$& C & File size limit exceeded (4.2 BSD)    \\
292     SIGIOT    &&&$\bullet$& C &     IOT trap. A synonym for SIGABRT        \\
293     SIGEMT    &&&$\bullet$&   &                                            \\
294     SIGSTKFLT &&&$\bullet$& A &     Stack fault on coprocessor             \\
295     SIGIO     &&&$\bullet$& A &     I/O now possible (4.2 BSD)             \\
296     SIGCLD    &&&$\bullet$&   &     A synonym for SIGCHLD                  \\
297     SIGPWR    &&&$\bullet$& A &     Power failure (System V)               \\
298     SIGINFO   &&&$\bullet$&   &     A synonym for SIGPWR                   \\
299     SIGLOST   &&&$\bullet$& A &     File lock lost                         \\
300     SIGWINCH  &&&$\bullet$& B &     Window resize signal (4.3 BSD, Sun)    \\
301     SIGUNUSED &&&$\bullet$& A &     Unused signal (will be SIGSYS)         \\
302     \hline
303   \end{tabular}
304   \caption{Lista dei segnali in Linux}
305   \label{tab:sig_signal_list}
306 \end{table}
307 in \curtab\ si sono riportate le azioni di default di ciascun segnale
308 (riassunte con delle lettere, la cui legenda completa è in \ntab), quando
309 nessun manipolatore è installato un segnale può essere ignorato o causare la
310 terminazione del processo.
311
312 In alcuni casi alla terminazione del processo è associata la creazione di un
313 file (posto nella directory corrente del processo e chiamato \file{core}) su
314 cui viene salvata un'immagine della memoria del processo (il cosiddetto
315 \textit{core dump}), che può essere usata da un debugger per esaminare lo
316 stato dello stack e delle variabili al momento della ricezione del segnale.
317
318 \begin{table}[htb]
319   \centering
320   \begin{tabular}[c]{c p{6cm}}
321     A & L'azione di default è terminare il processo. \\
322     B & L'azione di default è ignorare il segnale. \\
323     C & L'azione di default è terminare il processo e scrivere un \textit{core
324         dump}. \\
325     D & L'azione di default è fermare il processo. \\
326     E & Il segnale non può essere intercettato. \\
327     F & Il segnale non può essere ignorato.\\
328   \end{tabular}
329   \caption{Legenda delle caratteristiche dei segnali riportate in 
330     \tabref{tab:sig_signal_list}. }
331   \label{tab:sig_action_leg}
332 \end{table}
333 la descrizione dettagliata del significato dei vari segnali, raggruppati per
334 tipologia, è a seguire.
335
336 \subsubsection{Segnali di errore di programma}
337 \label{sec:sig_prog_error}
338
339 Questi segnali sono generati quando il sistema, o in certi casi direttamente
340 l'hardware (come per i page fault non validi) rileva un qualche errore
341 insanabile nel programma in esecuzione. In generale la generazione di questi
342 segnali significa che il programma ha dei gravi problemi (ad esempio ha
343 dereferenziato un puntatore non valido o ha eseguito una operazione aritmetica
344 proibita) e l'esecuzione non può essere proseguita.
345
346 In genere si intercettano questi segnali per permettere al programma di
347 terminare in maniera pulita, ad esempio per ripristinare i settaggi della
348 console o eliminare i file di lock prima dell'uscita.  In questo caso il
349 manipolatore deve concludersi ripristinando l'azione di default e rialzando il
350 segnale, in questo modo il programma si concluderà senza effetti spiacevoli,
351 ma riportando lo stesso stato di uscita che avrebbe avuto se il manipolatore
352 non ci fosse stato.
353
354 L'azione di default per tutti questi segnali è causare la terminazione del
355 processo che li ha causati. In genere oltre a questo il segnale provoca pure
356 la registrazione su disco di un file di \textit{core dump} che viene scritto
357 in un file \texttt{core} nella directory corrente del processo al momento
358 dell'errore, che il debugger può usare per ricostruire lo stato del programma
359 al momento della terminazione.
360
361 Questi segnali sono:
362 \begin{description}
363 \item \texttt{SIGFPE} Riporta un errore aritmetico fatale. Benché il nome
364   derivi da \textit{floating point exception} si applica a tutti gli errori
365   aritmetici compresa la divisione per zero e l'overflow. 
366
367 %   Per questo segnale le cose sono complicate dal fatto che possono esserci
368 %   molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo
369 %   standard IEEE per le operazioni in virgola mobile definisce vaire eccezioni
370 %   aritmetiche e richiede che esse siano notificate.  
371
372 \item \texttt{SIGILL} Il nome deriva da \textit{illegal instruction},
373   significa che il programma sta cercando di eseguire una istruzione
374   privilegiata o inesistente, in generale del codice illegale. Poiché il
375   compilatore del C genera del codice valido si ottiene questo segnale se il
376   file eseguibile è corrotto o si stanno cercando di eseguire dei dati.
377   Quest'ultimo caso può accadere quando si passa un puntatore sbagliato al
378   posto di un puntatore a funzione, o si eccede la scrittura di un vettore di
379   una variabile locale, andando a corrompere lo stack. Lo stesso segnale viene
380   generato in caso di overflow dello stack o di problemi nell'esecuzione di di
381   un signal handler.
382 \item \texttt{SIGSEGV} Il nome deriva da \textit{segment violation}, e
383   significa che il programma sta cercando di leggere o scrivere in una zona di
384   memoria protetta al di fuori di quella che gli è stata riservata dal
385   sistema. In genere è il meccanismo della protezione della memoria che si
386   accorge dell'errore ed il kernel genera il segnale.
387
388   È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
389   inizializzato leggendo al di la della fine di un vettore. 
390 \item \texttt{SIGBUS} In maniera analoga a \texttt{SIGSEGV} questo è un
391   segnale che viene generato di solito quando si dereferenzia un puntatore non
392   inzializzato, la differenza con con \texttt{SIGSEGV} è che questo indica un
393   accesso non valido su un indirizzo esistente (tipo fuori dallo heap o dallo
394   stack), mentre \texttt{SIGBUS} indica l'accesso ad un indirizzo non valido,
395   come nel caso di un puntatore non allineato. 
396 \item \texttt{SIGABRT} Il segnale indica che il programma stesso ha rilevato
397   un errore che viene riportato chiamando la funzione \texttt{abort} che
398   genera questo segnale. 
399 \item \texttt{SIGTRAP} 
400 \item \texttt{SIGSYS} Sta ad indicare che si è eseguta una istruzione che
401   richiede l'esecuzione di una system call, ma si è fornito un codice
402   sbagliato per quest'ultima.
403 \end{description}
404
405
406 \subsection{I segnali di terminazione}
407 \label{sec:sig_termination}
408
409 Questo tipo di segnali sono usati per terminare un processo; hanno vari nomi a
410 causa del differente uso che se ne può fare, ed i programmi possono
411 trattarli in maniera differente. 
412
413 La ragione per cui può essere necessario trattare questi segnali è che il
414 programma può dover eseguire una serie di azioni di pulizia prima di
415 terminare, come salvare informazioni sullo stato in cui si trova, cancellare
416 file temporanei, o ripristinare delle condizioni alterate durante il
417 funzionamento (tipi il modo del terminale o i settaggi di una qualche
418 periferica).
419
420 L'azione di default di questi segnali è di terminare il processo, questi
421 segnali sono:
422 \begin{description}
423 \item  \texttt{SIGTERM}
424 \item  \texttt{SIGINT}
425 \item  \texttt{SIGQUIT}
426 \item  \texttt{SIGKILL}
427 \item  \texttt{SIGHUP}
428 \end{description}
429
430 \subsection{I segnali di allarme}
431 \label{sec:sig_alarm}
432
433 Questi segnali sono generati dalla scadenza di un temporizzatore. Il loro
434 comportamento di default è quello di causare la terminazione del programma, ma
435 con questi segnali la scelta di default è irrilevante, in quanto il loro uso
436 presuppone sempre la necessità di un manipolatore.  Questi segnali sono:
437 \begin{description}
438 \item  \texttt{SIGALRM}
439 \item  \texttt{SIGVTALRM}
440 \item  \texttt{SIGPROF}
441 \end{description}
442
443
444 \subsection{I segnali di I/O asincrono}
445 \label{sec:sig_asyncio}
446
447 Questi segnali operano in congiunzione con le funzioni di I/O asincrono. Per
448 questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a
449 generare questi segnali. 
450
451 L'azione di default è di essere ignorati. Questi segnali sono:
452 \begin{description}
453 \item  \texttt{SIGIO}
454 \item  \texttt{SIGURG}
455 \item  \texttt{SIGPOLL}
456 \end{description}
457
458 \subsection{I segnali per il controllo di sessione}
459 \label{sec:sig_job_control}
460
461 Questi sono i segnali usati dal controllo di sessione, il loro uso è specifico
462 per questo argomento e verrà trattato quando lo affronteremo. 
463 Questi  segnali sono:
464 \begin{description}
465 \item  \texttt{SIGCHLD}
466 \item  \texttt{SIGCONT}
467 \item  \texttt{SIGSTOP}
468 \item  \texttt{SIGTSTP}
469 \item  \texttt{SIGTTIN}
470 \item  \texttt{SIGTTOU}
471 \end{description}
472
473 \subsection{I segnali di operazioni errate}
474 \label{sec:sig_oper_error}
475
476 Questi segnali sono usati per riportare al programma errori generati da
477 operazioni da lui eseguite; non indicano errori del programma quanto errori
478 che impediscono il completamento dell'esecuzione dovute all'interazione con il
479 resto del sistema.
480
481 L'azione di default di questi segnali è di terminare il processo, questi
482 segnali sono:
483 \begin{description}
484 \item  \texttt{SIGPIPE}
485 \item  \texttt{SIGLOST}
486 \item  \texttt{SIGXCPU}
487 \item  \texttt{SIGXFSZ}
488 \end{description}
489
490
491 \subsection{Ulteriori segnali}
492 \label{sec:sig_misc_sig}
493
494 Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non
495 classificabili in maniera omogenea. Questi segnali sono:
496 \begin{description}
497 \item  \texttt{SIGUSR1} e \texttt{SIGUSR2} Sono due segnali a disposizione
498   dell'utente che li può usare per quello che vuole. Possono essere utili per
499   implementare una comunicazione elementare fra processi diversi, o per
500   eseguire a richiesta una operazione utlizzando un manipolatore. L'azione di
501   default è terminare il processo.  
502 \item \texttt{SIGWINCH} Il nome sta per \textit{window (size) change} ed è
503   generato da molti sistemi (GNU/Linux compreso) quando le dimensioni (in
504   righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
505   programmi testuali per riformattare l'uscita su schermo quando si cambia
506   dimensione a quest'ultimo. L'azione di default è di essere ignorato.
507 \item  \texttt{SIGINFO} Il segnale indica una richiesta di informazioni. È
508   usato con il controllo di sessione, causa la stampa di informazioni da parte
509   del processo leader del gruppo associato al terminale di controllo, gli
510   altri processi lo ignorano.
511 \end{description}
512
513
514
515 \section{La gestione dei segnali}
516 \label{sec:sig_handlers}
517
518 I segnali sono il primo e più classico esempio di eventi asincroni, che
519 possono accadere in un qualunque momento durante l'esecuzione di un programma.
520 Non essendo sotto il controllo del programma la gestione dei segnali non potrà
521 essere controllata all'interno del flusso di esecuzione di quest'ultimo, ma
522 tutto quello che si potrà fare è di specificare (al kernel, che li genera)
523 quale azione andrà intrapresa quando essi si verificano.
524
525 In questa sezione vedremo allora come si gestiscono i segnali, esaminando le
526 funzioni che si usano per effettuare la gestione dei segnali ed analizzando le
527 problematiche relative alla gestione di eventi asincroni di questo tipo.
528
529
530 \subsection{La semantica dei segnali in Linux}
531 \label{sec:sig_linux_semantic}
532
533
534
535 \subsection{La funzione \func{signal}}
536 \label{sec:sig_signal}
537
538
539