966e32a1aa0759a2d1d6b15210171c3f2680d5e7
[gapil.git] / signal.tex
1 \chapter{I segnali}
2 \label{cha:signals}
3
4 I segnali sono il primo e più semplice meccanismo di comunicazione nei
5 confronti dei processi. Non portano con sé 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 essi vengono usati dal kernel per riportare ai processi 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), ecc.
14
15 In questo capitolo esamineremo i vari aspetti della gestione dei segnali,
16 partendo da una introduzione relativa ai concetti base con cui essi vengono
17 realizzati, per poi affrontarne la classificazione a secondo di uso e modalità
18 di generazione fino ad esaminare in dettaglio funzioni e le metodologie di
19 gestione.
20
21
22
23 \section{Introduzione}
24 \label{sec:sig_intro}
25
26 In questa sezione esamineremo i concetti generali relativi ai segnali, vedremo
27 le loro caratteristiche di base, introdurremo le nozioni di fondo relative
28 all'architettura del funzionamento dei segnali e alle modalità con cui il
29 sistema gestisce l'interazione fra di essi ed i processi.
30
31
32 \subsection{I concetti base}
33 \label{sec:sig_base}
34
35 Come il nome stesso indica i segnali sono usati per notificare ad un processo
36 l'occorrenza di un qualche evento. Gli eventi che possono generare un segnale
37 sono vari; un breve elenco di possibili cause per l'emissione di un segnale è
38 il seguente:
39
40 \begin{itemize*}
41 \item un errore del programma, come una divisione per zero o un tentativo di
42   accesso alla memoria fuori dai limiti validi.
43 \item la terminazione di un processo figlio.
44 \item la scadenza di un timer o di un allarme.
45 \item il tentativo di effettuare un'operazione di input/output che non può
46   essere eseguita.
47 \item una richiesta dell'utente di terminare o fermare il programma. In genere
48   si realizza attraverso un segnale mandato dalla shell in corrispondenza
49   della pressione di tasti del terminale come \code{C-c} o
50   \code{C-z}.\footnote{indichiamo con \code{C-x} la pressione simultanea al
51     tasto \code{x} del tasto control (ctrl in molte tastiere).}
52 \item l'esecuzione di una \func{kill} o di una \func{raise} da parte del
53   processo stesso o di un'altro (solo nel caso della \func{kill}).
54 \end{itemize*}
55
56 Ciascuno di questi eventi (compresi gli ultimi due che pure sono controllati
57 dall'utente o da un altro processo) comporta l'intervento diretto da parte del
58 kernel che causa la generazione un particolare tipo di segnale.
59
60 Quando un processo riceve un segnale, invece del normale corso del programma,
61 viene eseguita una azione di default o una apposita routine di gestione (il
62 cosiddetto \textit{signal handler} o \textsl{manipolatore}) che può essere
63 stata specificata dall'utente (nel qual caso si dice che si
64 \textsl{intercetta} il segnale).
65
66
67 \subsection{Le modalità di funzionamento}
68 \label{sec:sig_semantics}
69
70 Negli anni il comportamento del sistema in risposta ai segnali è stato
71 modificato in vari modi nelle differenti implementazioni di Unix.  Si possono
72 individuare due tipologie fondamentali di comportamento dei segnali (dette
73 semantiche) che vengono chiamate rispettivamente semantica \textsl{affidabile}
74 (o \textit{reliable}) e semantica \textsl{inaffidabile} (o
75 \textit{unreliable}).
76
77 Nella semantica \textsl{inaffidabile} (quella implementata dalle prime
78 versioni di Unix) la routine di gestione del segnale specificata dall'utente
79 non resta attiva una volta che è stata eseguita; è perciò compito dell'utente
80 stesso ripetere l'installazione della stessa all'interno della routine di
81 gestione, in tutti i casi in cui si vuole che il manipolatore esterno resti
82 attivo.
83
84 In questo caso è possibile una situazione in cui i segnali possono essere
85 perduti. Si consideri il seguente segmento di codice, in cui la prima
86 operazione del manipolatore è quella di reinstallare se stesso: 
87 se un secondo segnale arriva prima che il manipolatore invocato dal primo
88 abbia eseguito la reinstallazione di se stesso il segnale può essere perso o
89 causare il comportamento originale assegnato al segnale (in genere la
90 terminazione del processo).
91
92 Questa è la ragione per cui l'implementazione dei segnali secondo questa
93 semantica viene chiamata \textsl{inaffidabile}; infatti la ricezione del
94 segnale e la reinstallazione del suo manipolatore non sono operazioni
95 atomiche, e sono sempre possibili delle race condition (sull'argomento vedi
96 quanto detto in \secref{sec:proc_multi_prog}).
97
98 Un'altro problema è che in questa semantica non esiste un modo per bloccare i
99 segnali quando non si vuole che arrivino; i processi possono ignorare il
100 segnale, ma non è possibile istruire il sistema a non fare nulla in occasione
101 di un segnale, pur mantenendo memoria del fatto che è avvenuto.
102
103 % Un caso classico in cui si incontra questo problema, è quello in cui si usa il
104 % manipolatore per settare un flag che riporta al processo l'occorrenza del
105 % segnale, così che questo possa prendere provvedimenti al di fuori del
106 % manipolatore. Si consideri il seguente segmento di codice il cui scopo sarebbe
107 % quello di fermare il processo fino all'occorrenza di un opportuno segnale:
108
109 % \footnotesize
110 % \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
111 % int signal_flag = 0;
112 % main()
113 % {
114 %     int sig_handler();            /* handler function */
115 %     ...
116 %     signal(SIGINT, sig_handler);  /* establish handler */
117 %     ...
118 %     while(signal_flag == 0) {     /* while flag is zero */
119 %         pause();                  /* go to sleep */
120 %     }
121 %     ... 
122 % }
123 % int sig_handler() 
124 % {
125 %     signal(SIGINT, sig_handler);  /* restablish handler */
126 %     signal_flag = 1;              /* set flag */
127 % }
128 % \end{lstlisting}
129 % \normalsize
130 % l'idea è che quando il processo trova il flag a zero viene messo in sleep e
131 % verrà risvegliato solo dalla ricezione di un segnale. Il manipolatore si
132 % limita in questo caso a settare il flag a uno; all'uscita dal manipolatore la
133 % chiamata a \func{pause} è interrotta ed il processo viene risvegliato e
134 % riprende l'esecuzione all'istruzione successiva, ma essendo cambiato il flag
135 % la condizione non è più soddisfatta e il programma prosegue.
136
137 % Il problema con l'implementazione inaffidabile è che niente ci garantisce che
138 % il segnale arrivi fra la valutazione della condizione del \code{while} e la
139 % chiamata a \func{pause}, nel qual caso, se il segnale non viene più generato,
140 % il processo resterà in sleep permanentemente.
141
142 % Questo ci mostra ad esempio come con la semantica inaffidabile non esista una
143 % modalità semplice per ottenere una operazione di attesa mandando in stato di
144 % sleep (vedi \ref{sec:proc_sched}) un processo fino all'arrivo di un segnale.
145
146 Nella semantica \textsl{affidabile} (quella utilizzata da Linux e da ogni Unix
147 moderno) il manipolatore una volta installato resta attivo e non si hanno
148 tutti i problemi precedenti. In questa semantica i segnali vengono
149 \textsl{generati} dal kernel per un processo all'occorrenza dell'evento che
150 causa il segnale. In genere questo viene fatto dal kernel settando l'apposito
151 campo della \var{task\_struct} del processo nella process table (si veda
152 \figref{fig:proc_task_struct}).
153
154 Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
155 \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre
156 per tutto il tempo che passa fra la generazione del segnale e la sua consegna
157 esso è detto \textsl{pendente} (o \textit{pending}). In genere questa
158 procedura viene effettuata dallo scheduler quando, riprendendo l'esecuzione
159 del processo in questione, verifica la presenza del segnale nella
160 \var{task\_struct} e mette in esecuzione il manipolatore.
161
162 In questa semantica un processo ha la possibilità di bloccare la consegna dei
163 segnali, in questo caso, se l'azione per il suddetto segnale non è quella di
164 ignorarlo, il segnale resta \textsl{pendente} fintanto che il processo non lo
165 sblocca (nel qual caso viene consegnato) o setta l'azione di default per
166 ignorarlo.
167
168 Si tenga presente che il kernel stabilisce cosa fare con un segnale che è
169 stato bloccato al momento della consegna, non quando viene generato; questo
170 consente di cambiare l'azione per il segnale prima che esso venga consegnato,
171 e si può usare la funzione \func{sigpending} (vedi
172 \secref{sec:sig_sigpending}) per determinare quali segnali sono bloccati e
173 quali sono pendenti.
174
175
176 \subsection{Tipi di segnali}
177 \label{sec:sig_types}
178
179 In generale gli eventi che generano segnali si possono dividere in tre
180 categorie principali: errori, eventi esterni e richieste esplicite.
181
182 Un errore significa che un programma ha fatto qualcosa di sbagliato e non può
183 continuare ad essere eseguito. Non tutti gli errori causano dei segnali, in
184 genere la condizione di errore più comune comporta la restituzione di un
185 codice di errore da parte di una funzione di libreria, sono gli errori che
186 possono avvenire ovunque in un programma che causano l'emissione di un
187 segnale, come le divisioni per zero o l'uso di indirizzi di memoria non validi.
188
189 Un evento esterno ha in genere a che fare con l'I/O o con altri processi;
190 esempi di segnali di questo tipo sono quelli legati all'arrivo di dati di
191 input, scadenze di un timer, terminazione di processi figli.
192
193 Una richiesta esplicita significa l'uso di una chiamata di sistema (come
194 \func{kill} o \func{raise}) per la generazione di un segnale, cosa che
195 viene fatta usualmente dalla shell quando l'utente invoca la sequenza di tasti
196 di stop o di suspend, ma può essere pure inserita all'interno di un programma.
197
198 Si dice poi che i segnali possono essere \textsl{asincroni} o
199 \textsl{sincroni}. Un segnale \textsl{sincrono} è legato ad una azione
200 specifica di un programma ed è inviato (a meno che non sia bloccato) durante
201 tale azione; molti errori generano segnali \textsl{sincroni}, così come la
202 richiesta esplicita da parte del processo tramite le chiamate al sistema.
203 Alcuni errori come la divisione per zero non sono completamente sincroni e
204 possono arrivare dopo qualche istruzione.
205
206 I segnali \textsl{asincroni} sono generati da eventi fuori dal controllo del
207 processo che li riceve, e arrivano in tempi impredicibili nel corso
208 dell'esecuzione del programma. Eventi esterni come la terminazione di un
209 processo figlio generano segnali \textsl{asincroni}, così come le richieste di
210 generazione di un segnale effettuate da altri processi.
211
212 In generale un tipo di segnale o è sincrono o è asincrono, salvo il caso in
213 cui esso sia generato attraverso una richiesta esplicita tramite chiamata al
214 sistema, nel qual caso qualunque tipo di segnale (quello scelto nella
215 chiamata) può diventare sincrono o asincrono a seconda che sia generato
216 internamente o esternamente al processo.
217
218
219 \subsection{La notifica dei segnali}
220 \label{sec:sig_notification}
221
222 Come accennato quando un segnale viene generato, se la sua azione di default
223 non è quella di essere ignorato, il kernel prende nota del fatto nella
224 \var{task\_struct} del processo; si dice così che il segnale diventa
225 \textsl{pendente} (o \textit{pending}), e rimane tale fino al momento in cui
226 verrà notificato al processo (o verrà specificata come azione di default
227 quella di ignorarlo).
228
229 Normalmente l'invio al processo che deve ricevere il segnale è immediato ed
230 avviene non appena questo viene rimesso in esecuzione dallo scheduler che
231 esegue l'azione specificata. Questo a meno che il segnale in questione non sia
232 stato bloccato prima della notifica, nel qual caso l'invio non avviene ed il
233 segnale resta \textsl{pendente} indefinitamente. Quando lo si sblocca il
234 segnale \textsl{pendente} sarà subito notificato.
235
236 Si ricordi però che se l'azione specificata per un segnale è quella di essere
237 ignorato questo sarà scartato immediatamente al momento della sua generazione,
238 e questo anche se in quel momento il segnale è bloccato (perché ciò che viene
239 bloccata è la notifica). Per questo motivo un segnale, fintanto che viene
240 ignorato, non sarà mai notificato, anche se è stato bloccato ed in seguito si
241 è specificata una azione diversa (nel qual caso solo i segnali successivi alla
242 nuova specificazione saranno notificati).
243
244 Una volta che un segnale viene notificato (che questo avvenga subito o dopo
245 una attesa più o meno lunga) viene eseguita l'azione specificata per il
246 segnale. Per alcuni segnali (\macro{SIGKILL} e \macro{SIGSTOP}) questa azione
247 è fissa e non può essere cambiata, ma per tutti gli altri si può selezionare
248 una  delle tre possibilità seguenti:
249
250 \begin{itemize*}
251 \item ignorare il segnale.
252 \item catturare il segnale, ed utilizzare il manipolatore specificato.
253 \item accettare l'azione di default per quel segnale.
254 \end{itemize*}
255
256 Un programma può specificare queste scelte usando le due funzioni
257 \func{signal} e \func{sigaction} (vedi \secref{sec:sig_signal} e
258 \secref{sec:sig_sigaction}). Se si è installato un manipolatore sarà
259 quest'ultimo ad essere eseguito alla notifica del segnale.  Inoltre il sistema
260 farà si che mentre viene eseguito il manipolatore di un segnale, quest'ultimo
261 venga automaticamente bloccato (così si possono evitare race condition).
262
263 Nel caso non sia stata specificata un'azione, viene utilizzata l'azione
264 standard che (come vedremo in \secref{sec:sig_standard}) è propria di ciascun
265 segnale; nella maggior parte dei casi essa porta alla terminazione del
266 processo, ma alcuni segnali che rappresentano eventi innocui vengono ignorati.
267
268 Quando un segnale termina un processo, il padre può determinare la causa della
269 terminazione esaminando il codice di stato riportato delle funzioni
270 \func{wait} e \func{waitpid} (vedi \secref{sec:proc_wait}); questo è il modo
271 in cui la shell determina i motivi della terminazione di un programma e scrive
272 un eventuale messaggio di errore.
273
274 I segnali che rappresentano errori del programma (divisione per zero o
275 violazioni di accesso) hanno anche la caratteristica di scrivere un file di
276 \textit{core dump} che registra lo stato del processo (ed in particolare della
277 memoria e dello stack) prima della terminazione.  Questo può essere esaminato
278 in seguito con un debugger per investigare sulla causa dell'errore.  Lo stesso
279 avviene se i suddetti segnale vengono generati con una \func{kill}.
280
281
282 \section{La classificazione dei segnali}
283 \label{sec:sig_classification}
284
285 Esamineremo in questa sezione quali sono i vari segnali definiti nel sistema,
286 le loro caratteristiche e tipologia, le varie macro e costanti che permettono
287 di identificarli, e le funzioni che ne stampano la descrizione.
288
289
290 \subsection{I segnali standard}
291 \label{sec:sig_standard}
292
293 Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso
294 diretto di questo numero da parte dei programmi è da evitare, in quanto esso
295 può variare a seconda dell'implementazione del sistema, e nel caso si Linux,
296 anche a seconda dell'architettura hardware. 
297 Per questo motivo ad ogni segnale viene associato un nome, definendo con una
298 macro di preprocessore una costante uguale al suddetto numero. Sono questi
299 nomi, che sono standardizzati e sostanzialmente uniformi rispetto alle varie
300 implementazioni, che si devono usare nei programmi. Tutti i nomi e le funzioni
301 che concernono i segnali sono definiti nell'header di sistema \file{signal.h}.
302
303 Il numero totale di segnali presenti è dato dalla macro \macro{NSIG}, e dato
304 che i numeri dei segnali sono allocati progressivamente, essa corrisponde
305 anche al successivo del valore numerico assegnato all'ultimo segnale definito.
306 In \tabref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali
307 definiti in Linux (estratto dalle man page), comparati con quelli definiti in
308 vari standard.
309
310 \begin{table}[htb]
311   \footnotesize
312   \centering
313   \begin{tabular}[c]{|c|p{8cm}|}
314     \hline
315     \textbf{Sigla} & \textbf{Significato} \\
316     \hline
317     \hline
318     A & L'azione di default è terminare il processo. \\
319     B & L'azione di default è ignorare il segnale. \\
320     C & L'azione di default è terminare il processo e scrivere un \textit{core
321         dump}. \\
322     D & L'azione di default è fermare il processo. \\
323     E & Il segnale non può essere intercettato. \\
324     F & Il segnale non può essere ignorato.\\
325     \hline
326   \end{tabular}
327   \caption{Legenda delle azioni di default dei segnali riportate in 
328     \tabref{tab:sig_signal_list}.}
329   \label{tab:sig_action_leg}
330 \end{table}
331
332 In \tabref{tab:sig_signal_list} si sono anche riportate le azioni di default
333 di ciascun segnale (riassunte con delle lettere, la cui legenda completa è in
334 \tabref{tab:sig_action_leg}), quando nessun manipolatore è installato un
335 segnale può essere ignorato o causare la terminazione del processo. Nella
336 colonna standard sono stati indicati anche gli standard in cui ciascun segnale
337 è definito, secondo lo schema di \tabref{tab:sig_standard_leg}.
338
339
340 \begin{table}[htb]
341   \footnotesize
342   \centering
343   \begin{tabular}[c]{|c|l|}
344     \hline
345     \textbf{Sigla} & \textbf{Standard} \\
346     \hline
347     \hline
348     P & POSIX. \\
349     B & BSD. \\
350     L & Linux.\\
351     S & SUSv2.\\
352     \hline
353   \end{tabular}
354   \caption{Legenda dei valori della colonna \textbf{Standard} di 
355     \tabref{tab:sig_signal_list}.}
356   \label{tab:sig_standard_leg}
357 \end{table}
358
359 In alcuni casi alla terminazione del processo è associata la creazione di un
360 file (posto nella directory corrente del processo e chiamato \file{core}) su
361 cui viene salvata un'immagine della memoria del processo (il cosiddetto
362 \textit{core dump}), che può essere usata da un debugger per esaminare lo
363 stato dello stack e delle variabili al momento della ricezione del segnale.
364
365 \begin{table}[htb]
366   \footnotesize
367   \centering
368   \begin{tabular}[c]{|l|c|c|p{8cm}|}
369     \hline
370     \textbf{Segnale}&\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
371     \hline
372     \hline
373     \macro{SIGHUP}   &PL & A & Hangup o fine del processo di controllo      \\
374     \macro{SIGINT}   &PL & A & Interrupt da tastiera (\cmd{C-c})            \\
375     \macro{SIGQUIT}  &PL & C & Quit da tastiera (\cmd{C-y})                 \\
376     \macro{SIGILL}   &PL & C & Istruzione illegale                          \\
377     \macro{SIGABRT}  &PL & C & Segnale di abort da \func{abort}             \\
378     \macro{SIGFPE}   &PL & C & Errore aritmetico                            \\
379     \macro{SIGKILL}  &PL &AEF& Segnale di terminazione forzata              \\
380     \macro{SIGSEGV}  &PL & C & Errore di accesso in memoria                 \\
381     \macro{SIGPIPE}  &PL & A & Pipe spezzata                                \\
382     \macro{SIGALRM}  &PL & A & Segnale del timer da \func{alarm}             \\
383     \macro{SIGTERM}  &PL & A & Segnale di terminazione \verb|C-\|            \\
384     \macro{SIGUSR1}  &PL & A & Segnale utente numero 1                       \\
385     \macro{SIGUSR2}  &PL & A & Segnale utente numero 2                       \\
386     \macro{SIGCHLD}  &PL & B & Figlio terminato o fermato                    \\
387     \macro{SIGCONT}  &PL &   & Continua se fermato                           \\
388     \macro{SIGSTOP}  &PL &DEF& Ferma il processo                             \\
389     \macro{SIGTSTP}  &PL & D & Stop typed at tty                             \\
390     \macro{SIGTTIN}  &PL & D & Input sul terminale per un processo 
391                                in background                                 \\
392     \macro{SIGTTOU}  &PL & D & Output sul terminale per un processo          
393                                in background                                 \\
394     \macro{SIGBUS}   &SL & C & Errore sul bus (bad memory access)            \\
395     \macro{SIGPOLL}  &SL & A & Pollable event (Sys V).                      
396                                Sinonimo di \macro{SIGIO}                     \\
397     \macro{SIGPROF}  &SL & A & Timer del profiling scaduto                   \\
398     \macro{SIGSYS}   &SL & C & Bad argument to routine (SVID)                \\
399     \macro{SIGTRAP}  &SL & C & Trace/breakpoint trap                         \\
400     \macro{SIGURG}   &SLB& B & Urgent condition on socket                    \\
401     \macro{SIGVTALRM}&SLB& A & Virtual alarm clock                           \\
402     \macro{SIGXCPU}  &SLB& C & Ecceduto il limite sul CPU time               \\
403     \macro{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file  \\
404     \macro{SIGIOT}   &L  & C & IOT trap. A synonym for \macro{SIGABRT}       \\
405     \macro{SIGEMT}   &L  &   &                                               \\
406     \macro{SIGSTKFLT}&L  & A & Stack fault on coprocessor                    \\
407     \macro{SIGIO}    &LB & A & I/O now possible (4.2 BSD)                    \\
408     \macro{SIGCLD}   &L  &   & A synonym for \macro{SIGCHLD}                 \\
409     \macro{SIGPWR}   &L  & A & Fallimento dell'alimentazione                 \\
410     \macro{SIGINFO}  &L  &   & A synonym for \macro{SIGPWR}                  \\
411     \macro{SIGLOST}  &L  & A & Perso un lock sul file (per NFS)              \\
412     \macro{SIGWINCH} &LB & B & Window resize signal (4.3 BSD, Sun)           \\
413     \macro{SIGUNUSED}&L  & A & Unused signal (will be SIGSYS)                \\
414     \hline
415   \end{tabular}
416   \caption{Lista dei segnali in Linux.}
417   \label{tab:sig_signal_list}
418 \end{table}
419
420 La descrizione dettagliata del significato dei vari segnali, raggruppati per
421 tipologia, verrà affrontate nel seguito.
422
423
424 \subsection{Segnali di errore di programma}
425 \label{sec:sig_prog_error}
426
427 Questi segnali sono generati quando il sistema, o in certi casi direttamente
428 l'hardware (come per i page fault non validi) rileva un qualche errore
429 insanabile nel programma in esecuzione. In generale la generazione di questi
430 segnali significa che il programma ha dei gravi problemi (ad esempio ha
431 dereferenziato un puntatore non valido o ha eseguito una operazione aritmetica
432 proibita) e l'esecuzione non può essere proseguita.
433
434 In genere si intercettano questi segnali per permettere al programma di
435 terminare in maniera pulita, ad esempio per ripristinare i settaggi della
436 console o eliminare i file di lock prima dell'uscita.  In questo caso il
437 manipolatore deve concludersi ripristinando l'azione di default e rialzando il
438 segnale, in questo modo il programma si concluderà senza effetti spiacevoli,
439 ma riportando lo stesso stato di uscita che avrebbe avuto se il manipolatore
440 non ci fosse stato.
441
442 L'azione di default per tutti questi segnali è causare la terminazione del
443 processo che li ha causati. In genere oltre a questo il segnale provoca pure
444 la registrazione su disco di un file di \textit{core dump} che viene scritto
445 in un file \file{core} nella directory corrente del processo al momento
446 dell'errore, che il debugger può usare per ricostruire lo stato del programma
447 al momento della terminazione.
448
449 Questi segnali sono:
450 \begin{basedescript}{\desclabelwidth{2.0cm}}
451 \item[\macro{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
452   derivi da \textit{floating point exception} si applica a tutti gli errori
453   aritmetici compresa la divisione per zero e l'overflow. 
454   
455   Se il manipolatore ritorna il comportamento del processo è indefinito, ed
456   ignorare questo segnale può condurre ad un loop infinito.
457
458 %   Per questo segnale le cose sono complicate dal fatto che possono esserci
459 %   molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo
460 %   standard IEEE per le operazioni in virgola mobile definisce varie eccezioni
461 %   aritmetiche e richiede che esse siano notificate.  
462   
463 \item[\macro{SIGILL}] Il nome deriva da \textit{illegal instruction},
464   significa che il programma sta cercando di eseguire una istruzione
465   privilegiata o inesistente, in generale del codice illegale. Poiché il
466   compilatore del C genera del codice valido si ottiene questo segnale se il
467   file eseguibile è corrotto o si stanno cercando di eseguire dei dati.
468   Quest'ultimo caso può accadere quando si passa un puntatore sbagliato al
469   posto di un puntatore a funzione, o si eccede la scrittura di un vettore di
470   una variabile locale, andando a corrompere lo stack. Lo stesso segnale viene
471   generato in caso di overflow dello stack o di problemi nell'esecuzione di un
472   manipolatore. Se il manipolatore ritorna il comportamento del processo è
473   indefinito.
474 \item[\macro{SIGSEGV}] Il nome deriva da \textit{segment violation}, e
475   significa che il programma sta cercando di leggere o scrivere in una zona di
476   memoria protetta al di fuori di quella che gli è stata riservata dal
477   sistema. In genere è il meccanismo della protezione della memoria che si
478   accorge dell'errore ed il kernel genera il segnale.  Se il manipolatore
479   ritorna il comportamento del processo è indefinito.
480
481   È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
482   inizializzato leggendo al di la della fine di un vettore. 
483 \item[\macro{SIGBUS}] Il nome deriva da \textit{bus error}. Come
484   \macro{SIGSEGV} questo è un segnale che viene generato di solito quando si
485   dereferenzia un puntatore non inizializzato, la differenza è che
486   \macro{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
487   (tipo fuori dallo heap o dallo stack), mentre \macro{SIGBUS} indica
488   l'accesso ad un indirizzo non valido, come nel caso di un puntatore non
489   allineato.
490 \item[\macro{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica che
491   il programma stesso ha rilevato un errore che viene riportato chiamando la
492   funzione \func{abort} che genera questo segnale.
493 \item[\macro{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
494   dall'attivazione del tracciamento per il processo. È usato dai programmi per
495   il debugging e se un programma normale non dovrebbe ricevere questo segnale.
496 \item[\macro{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
497   richiede l'esecuzione di una system call, ma si è fornito un codice
498   sbagliato per quest'ultima.
499 \end{basedescript}
500
501
502 \subsection{I segnali di terminazione}
503 \label{sec:sig_termination}
504
505 Questo tipo di segnali sono usati per terminare un processo; hanno vari nomi a
506 causa del differente uso che se ne può fare, ed i programmi possono
507 trattarli in maniera differente. 
508
509 La ragione per cui può essere necessario trattare questi segnali è che il
510 programma può dover eseguire una serie di azioni di pulizia prima di
511 terminare, come salvare informazioni sullo stato in cui si trova, cancellare
512 file temporanei, o ripristinare delle condizioni alterate durante il
513 funzionamento (come il modo del terminale o i settaggi di una qualche
514 periferica).
515
516 L'azione di default di questi segnali è di terminare il processo, questi
517 segnali sono:
518 \begin{basedescript}{\desclabelwidth{2.0cm}}
519 \item[\macro{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
520   generico usato per causare la conclusione di un programma. Al contrario di
521   \macro{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
522   usa per chiedere in maniera ``educata'' ad un processo di concludersi.
523 \item[\macro{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
524   interruzione per il programma. È quello che viene generato di default dal
525   comando \cmd{kill} o dall'invio sul terminale del carattere di controllo
526   INTR (interrupt, generato dalla sequenza \macro{C-c}).
527 \item[\macro{SIGQUIT}] È analogo a \macro{SIGINT} con la differenze che è
528   controllato da un'altro carattere di controllo, QUIT, corrispondente alla
529   sequenza \verb|C-\|. A differenza del precedente l'azione di default,
530   oltre alla terminazione del processo, comporta anche la creazione di un core
531   dump. 
532
533   In genere lo si può pensare come corrispondente ad una condizione di
534   errore del programma rilevata dall'utente. Per questo motivo non è opportuno
535   fare eseguire al manipolatore di questo segnale le operazioni di pulizia
536   normalmente previste (tipo la cancellazione di file temporanei), dato che in
537   certi casi esse possono eliminare informazioni utili nell'esame dei core
538   dump. 
539 \item[\macro{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
540   qualunque programma. Questo segnale non può essere né intercettato, né
541   ignorato, né bloccato, per cui causa comunque la terminazione del processo.
542   In genere esso viene generato solo per richiesta esplicita dell'utente dal
543   comando (o tramite la funzione) \cmd{kill}. Dato che non lo si può
544   intercettare è sempre meglio usarlo come ultima risorsa quando metodi meno
545   brutali, come \macro{SIGTERM} o \macro{C-c} non funzionano. 
546
547   Se un processo non risponde a nessun altro segnale \macro{SIGKILL} ne causa
548   sempre la terminazione (in effetti il fallimento della terminazione di un
549   processo da parte di \macro{SIGKILL} costituirebbe un malfunzionamento del
550   kernel). Talvolta è il sistema stesso che può generare questo segnale quando
551   per condizioni particolari il processo non può più essere eseguito neanche
552   per eseguire un manipolatore.
553 \item[\macro{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
554   terminale dell'utente si è disconnesso (ad esempio perché si è interrotta la
555   rete). Viene usato anche per riportare la terminazione del processo di
556   controllo di un terminale a tutti i processi della sessione, in modo che
557   essi possano disconnettersi dal relativo terminale. 
558   
559   Viene inoltre usato in genere per segnalare ai demoni (che non hanno un
560   terminale di controllo) la necessità di reinizializzarsi e rileggere il/i
561   file di configurazione.
562 \end{basedescript}
563
564
565 \subsection{I segnali di allarme}
566 \label{sec:sig_alarm}
567
568 Questi segnali sono generati dalla scadenza di un timer. Il loro comportamento
569 di default è quello di causare la terminazione del programma, ma con questi
570 segnali la scelta di default è irrilevante, in quanto il loro uso presuppone
571 sempre la necessità di un manipolatore.  Questi segnali sono:
572 \begin{basedescript}{\desclabelwidth{2.0cm}}
573 \item[\macro{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
574   un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
575   usato dalla funzione \func{alarm}.
576 \item[\macro{SIGVTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
577   precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
578   processo. 
579 \item[\macro{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
580   di un timer che misura sia il tempo di CPU speso direttamente dal processo
581   che quello che il sistema ha speso per conto di quest'ultimo. In genere
582   viene usato dai tool che servono a fare il profilo d'uso della CPU da parte
583   del processo.
584 \end{basedescript}
585
586
587 \subsection{I segnali di I/O asincrono}
588 \label{sec:sig_asyncio}
589
590 Questi segnali operano in congiunzione con le funzioni di I/O asincrono. Per
591 questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a
592 generare questi segnali. 
593
594 L'azione di default è di essere ignorati. Questi segnali sono:
595 \begin{basedescript}{\desclabelwidth{2.0cm}}
596 \item[\macro{SIGIO}] Questo segnale viene inviato quando un file descriptor è
597   pronto per eseguire dell'input/output. In molti sistemi solo i socket e i
598   terminali possono generare questo segnale, in Linux questo può essere usato
599   anche per i file, posto che la \func{fcntl} abbia avuto successo.
600 \item[\macro{SIGURG}] Questo segnale è inviato quando arrivano dei dati
601   urgenti o \textit{out of band} su di un socket; per maggiori dettagli al
602   proposito si veda \secref{sec:xxx_urgent_data}.
603 \item[\macro{SIGPOLL}] Questo segnale è equivalente a \macro{SIGIO}, è
604   definito solo per compatibilità con i sistemi System V.
605 \end{basedescript}
606
607
608 \subsection{I segnali per il controllo di sessione}
609 \label{sec:sig_job_control}
610
611 Questi sono i segnali usati dal controllo delle sessioni e dei processi, il
612 loro uso è specifico e viene trattato in maniera specifica nelle sezioni in
613 cui si trattano gli argomenti relativi.  Questi segnali sono:
614 \begin{basedescript}{\desclabelwidth{2.0cm}}
615 \item[\macro{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
616   figlio termina o viene fermato. L'azione di default è di ignorare il
617   segnale, la sua gestione è trattata in \secref{sec:proc_wait}.
618 \item[\macro{SIGCLD}] Per Linux questo è solo un segnale identico al
619   precedente, il nome è obsoleto e andrebbe evitato. 
620 \item[\macro{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
621   usato per fare ripartire un programma precedentemente fermato da
622   \macro{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
623   ripartire il processo prima della sua consegna. Il comportamento di default
624   è di fare solo questo; il segnale non può essere bloccato. Si può anche
625   installare un manipolatore, ma il segnale provoca comunque il riavvio del
626   processo.
627   
628   La maggior pare dei programmi non hanno necessità di intercettare il
629   segnale, in quanto esso è completamente trasparente rispetto all'esecuzione
630   che riparte senza che il programma noti niente. Si possono installare dei
631   manipolatori per far si che un programma produca una qualche azione speciale
632   se viene fermato e riavviato, come per esempio riscrivere un prompt, o
633   inviare un avviso. 
634 \item[\macro{SIGSTOP}] Il segnale ferma un processo (lo porta in uno stato di
635   sleep); il segnale non può essere né intercettato, né ignorato, né bloccato.
636 \item[\macro{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
637   ferma il processo interattivamente, ed è generato dal carattere SUSP
638   (prodotto dalla combinazione \macro{C-z}), ed al contrario di
639   \macro{SIGSTOP} può essere intercettato e ignorato. In genere un programma
640   installa un manipolatore per questo segnale quando vuole lasciare il sistema
641   o il terminale in uno stato definito prima di fermarsi; se per esempio un
642   programma ha disabilitato l'eco sul terminale può installare un manipolatore
643   per riabilitarlo prima di fermarsi.
644 \item[\macro{SIGTTIN}] Un processo non può leggere dal terminale se esegue una
645   sessione di lavoro in background. Quando un processo in background tenta di
646   leggere da un terminale viene inviato questo segnale a tutti i processi
647   della sessione di lavoro. L'azione di default è di fermare il processo.
648   L'argomento è trattato in \secref{sec:sess_xxx}.
649 \item[\macro{SIGTTOU}] Segnale analogo al precedente \macro{SIGTTIN}, ma
650   generato quando si tenta di scrivere o modificare uno dei modi del
651   terminale. L'azione di default è di fermare il processo, l'argomento è
652   trattato in \secref{sec:sess_xxx}.
653 \end{basedescript}
654
655
656 \subsection{I segnali di operazioni errate}
657 \label{sec:sig_oper_error}
658
659 Questi segnali sono usati per riportare al programma errori generati da
660 operazioni da lui eseguite; non indicano errori del programma quanto errori
661 che impediscono il completamento dell'esecuzione dovute all'interazione con il
662 resto del sistema.
663
664 L'azione di default di questi segnali è di terminare il processo, questi
665 segnali sono:
666 \begin{basedescript}{\desclabelwidth{2.0cm}}
667 \item[\macro{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle pipe o
668   delle FIFO è necessario che, prima che un processo inizi a scrivere su di
669   essa, un'altro abbia aperto la pipe in lettura (si veda
670   \secref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
671   terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
672   segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
673   lo ha causato fallisce restituendo l'errore \macro{EPIPE} 
674 \item[\macro{SIGLOST}] Sta per \textit{Resource lost}. Viene generato quando
675   c'è un advisory lock su un file NFS, ed il server riparte dimenticando la
676   situazione precedente.
677 \item[\macro{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
678   segnale è generato quando un processo eccede il limite impostato per il
679   tempo di CPU disponibile, vedi \secref{sec:sys_xxx}. 
680 \item[\macro{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
681   segnale è generato quando un processo tenta di estendere un file oltre le
682   dimensioni specificate dal limite impostato per le dimensioni massime di un
683   file, vedi \secref{sec:sys_xxx}. 
684 \end{basedescript}
685
686
687 \subsection{Ulteriori segnali}
688 \label{sec:sig_misc_sig}
689
690 Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non
691 classificabili in maniera omogenea. Questi segnali sono:
692 \begin{basedescript}{\desclabelwidth{2.0cm}}
693 \item[\macro{SIGUSR1} e \macro{SIGUSR2}] Sono due segnali a disposizione
694   dell'utente che li può usare per quello che vuole. Possono essere utili per
695   implementare una comunicazione elementare fra processi diversi, o per
696   eseguire a richiesta una operazione utilizzando un manipolatore. L'azione di
697   default è terminare il processo.
698 \item[\macro{SIGWINCH}] Il nome sta per \textit{window (size) change} ed è
699   generato da molti sistemi (GNU/Linux compreso) quando le dimensioni (in
700   righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
701   programmi testuali per riformattare l'uscita su schermo quando si cambia
702   dimensione a quest'ultimo. L'azione di default è di essere ignorato.
703 \item[\macro{SIGINFO}] Il segnale indica una richiesta di informazioni. È
704   usato con il controllo di sessione, causa la stampa di informazioni da parte
705   del processo leader del gruppo associato al terminale di controllo, gli
706   altri processi lo ignorano.
707 \end{basedescript}
708
709
710 \subsection{Le funzioni \func{strsignal} e \func{psignal}}
711 \label{sec:sig_strsignal}
712
713 Per la descrizione dei segnali il sistema mette a disposizione due funzioni,
714 \func{strsignal} e \func{psignal}, che stampano un messaggio di descrizione
715 dato il numero. In genere si usano quando si vuole notificare all'utente il
716 segnale avvenuto (nel caso di terminazione di un processo figlio o di un
717 manipolatore che gestisce più segnali); la prima funzione è una estensione
718 GNU, accessibile avendo definito \macro{\_GNU\_SOURCE}, ed è analoga alla
719 funzione \func{strerror} (si veda \secref{sec:sys_strerror}) per gli errori:
720 \begin{prototype}{string.h}{char *strsignal(int signum)} 
721   Ritorna il puntatore ad una stringa che contiene la descrizione del segnale
722   \var{signum}.
723 \end{prototype}
724 \noindent dato che la stringa è allocata staticamente non se ne deve
725 modificare il contenuto, che resta valido solo fino alla successiva chiamata
726 di \func{strsignal}. Nel caso si debba mantenere traccia del messaggio sarà
727 necessario copiarlo.
728
729 La seconda funzione deriva da BSD ed è analoga alla funzione \func{perror}
730 descritta in \secref{sec:sys_strerror}; il suo prototipo è:
731 \begin{prototype}{signal.h}{void psignal(int sig, const char *s)} 
732   Stampa sullo standard error un messaggio costituito dalla stringa \param{s},
733   seguita da due punti ed una descrizione del segnale indicato da \param{sig}.
734 \end{prototype}
735
736 Una modalità alternativa per utilizzare le descrizioni restituite da
737 \func{strsignal} e \func{psignal} è quello di fare usare la variabile
738 \var{sys\_siglist}, che è definita in \file{signal.h} e può essere acceduta
739 con la dichiarazione:
740 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
741     extern const char *const sys_siglist[]
742 \end{lstlisting}
743 l'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione,
744 indicizzate per numero di segnale, per cui una chiamata del tipo di \code{char
745   *decr = strsignal(SIGINT)} può essere sostituita dall'equivalente \code{char
746   *decr = sys\_siglist[SIGINT]}.
747
748
749
750 \section{La gestione dei segnali}
751 \label{sec:sig_management}
752
753 I segnali sono il primo e più classico esempio di eventi asincroni, cioè di
754 eventi che possono accadere in un qualunque momento durante l'esecuzione di un
755 programma. Per questa loro caratteristica la loro gestione non può essere
756 effettuata all'interno del normale flusso di esecuzione dello stesso, ma è
757 delegata appunto agli eventuali manipolatori che si sono installati.
758
759 In questa sezione vedremo come si effettua gestione dei segnali, a partire
760 dalla loro interazione con le system call, passando per le varie funzioni che
761 permettono di installare i manipolatori e controllare le reazioni di un
762 processo alla loro occorrenza.
763
764
765 \subsection{Il comportamento generale del sistema.}
766   \label{sec:sig_gen_beha}
767
768 Abbiamo già trattato in \secref{sec:sig_intro} le modalità con cui il sistema
769 gestisce l'interazione fra segnali e processi, ci resta da esaminare però il
770 comportamento delle system call; in particolare due di esse, \func{fork} ed
771 \func{exec}, dovranno essere prese esplicitamente in considerazione, data la
772 loro stretta relazione con la creazione di nuovi processi.
773
774 Come accennato in \secref{sec:proc_fork} quando viene creato un nuovo processo
775 con \func{fork} esso eredita dal padre sia le azioni che sono state settate
776 per i singoli segnali, che la maschera dei segnali bloccati (tratteremo
777 quest'ultimo argomento in \ref{sec:sig_sigpending}). Invece tutti i segnali
778 pendenti e gli allarmi vengono cancellati; essi infatti devono essere
779 recapitati solo al padre, al figlio dovranno arrivare solo i segnali dovuti
780 alle sue azioni.
781
782 Quando si mette in esecuzione un nuovo programma con \func{exec} (si ricordi
783 quanto detto in \secref{sec:proc_exec}) tutti i segnali per i quali è stato
784 installato un manipolatore vengono resettati a \macro{SIG\_DFL}. Non ha più
785 senso infatti fare riferimento a funzioni definite nel programma originario,
786 che non sono presenti nello spazio di indirizzi del nuovo programma.
787
788 Si noti che questo vale solo per le azioni per le quali è stato installato un
789 manipolatore; viene mantenuto invece ogni eventuale settaggio dell'azione a
790 \macro{SIG\_IGN}. Questo permette ad esempio alla shell di settare ad
791 \macro{SIG\_IGN} le risposte per \macro{SIGINT} e \macro{SIGQUIT} per i
792 programmi eseguiti in background, che altrimenti sarebbero interrotti da una
793 successiva pressione di \texttt{C-c} o \texttt{C-y}.
794
795 Per quanto riguarda tutte le altre system call esse vengono tradizionalmente
796 classificate, proprio in base al loro comportamento nei confronti dei segnali,
797 in \textsl{lente} (\textit{slow}) e \textsl{veloci} (\textit{fast}). La gran
798 parte appartiene a quest'ultima categoria che non è influenzata dall'arrivo di
799 un segnale. In tal caso un eventuale manipolatore viene sempre eseguito dopo
800 che la system call è stata completata. Esse sono dette \textsl{veloci} proprio
801 in quanto la loro esecuzione è sostanzialmente immediata e attendere per
802 eseguire un manipolatore non comporta nessun inconveniente.
803
804 Esistono però dei casi in cui questo non è possibile perché renderebbe
805 impossibile una risposta pronta al segnale. In generale questo avviene tutte
806 le volte che si ha a che fare con system call che possono bloccarsi
807 indefinitamente, (quelle che, per questo, vengono chiamate \textsl{lente}). Un
808 elenco dei casi in cui si presenta questa situazione è il seguente:
809 \begin{itemize*}
810 \item lettura da file che possono bloccarsi in attesa di dati non ancora
811   presenti (come per certi file di dispositivo, la rete o le pipe).
812 \item scrittura sugli stessi file, nel caso in cui dati non possano essere
813   accettati immediatamente.
814 \item apertura di un file di dispositivo che richiede operazioni non immediate
815   per una una risposta. 
816 \item operazioni eseguite con \func{ioctl} che non è detto possano essere
817   eseguite immediatamente.
818 \item le funzioni di intercomunicazione che si bloccano in attesa di risposte
819   da altri processi.
820 \item la funzione \func{pause} (usata appunto per attendere l'-arrivo di un
821   segnale).
822 \item la funzione \func{wait} (se nessun processo figlio è ancora terminato).
823 \end{itemize*}
824
825 In questo caso si pone il problema di cosa fare una volta che il manipolatore
826 sia ritornato. La scelta originaria dei primi Unix era quella di far ritornare
827 anche la system call restituendo l'errore di \macro{EINTR}. Questa è a
828 tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
829 manipolatori controllino lo stato di uscita delle funzioni per ripeterne la
830 chiamata qualora l'errore fosse questo.
831
832 Dimenticarsi di richiamare una system call interrotta da un segnale è un
833 errore comune, tanto che le \acr{glibc} provvedono una macro
834 \code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente,
835 ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato
836 non è diverso dall'uscita con un errore \macro{EINTR}.
837
838 La soluzione è comunque poco elegante e BSD ha scelto un approccio molto
839 diverso, che è quello di fare ripartire automaticamente la system call invece
840 di farla fallire. In questo caso ovviamente non c'è da preoccuparsi di
841 controllare il codice di errore; si perde però la possibilità di eseguire
842 azioni specifiche all'occorrenza di questa particolare condizione. 
843
844 Linux e le \acr{glibc} consentono di utilizzare entrambi gli approcci,
845 attraverso una opportuna opzione di \func{sigaction} (vedi
846 \secref{sec:sig_sigaction}). È da chiarire comunque che nel caso di
847 interruzione nel mezzo di un trasferimento parziale di dati, le system call
848 ritornano sempre indicando i byte trasferiti.
849
850
851 \subsection{La funzione \func{signal}}
852 \label{sec:sig_signal}
853
854 L'interfaccia più semplice per la gestione dei segnali è costituita dalla
855 funzione \func{signal} che è definita fin dallo standard ANSI C.  Quest'ultimo
856 però non considera sistemi multitasking, per cui la definizione è tanto vaga
857 da essere del tutto inutile in un sistema Unix; è questo il motivo per cui
858 ogni implementazione successiva ne ha modificato e ridefinito il
859 comportamento, pur mantenendone immutato il prototipo\footnote{in realtà
860   alcune vecchie implementazioni (SVR4 e 4.3+BSD) usano parametri aggiuntivi
861   per definire il comportamento della funzione.} che è:
862 \begin{prototype}{signal.h}
863   {sighandler\_t signal(int signum, sighandler\_t handler)} 
864   
865   Installa la funzione di gestione \param{handler} (il manipolatore) per il
866   segnale \param{signum}.
867   
868   \bodydesc{La funzione ritorna il precedente manipolatore in caso di successo
869     o \macro{SIG\_ERR} in caso di errore.}
870 \end{prototype}
871
872 In questa definizione si è usato il tipo \type{sighandler\_t} che è una
873 estensione GNU, definita dalle \acr{glibc}, che permette di riscrivere il
874 prototipo in una forma più leggibile dell'originario:
875 \begin{verbatim}
876 void (*signal(int signum, void (*handler)(int)))int)
877 \end{verbatim}
878 questa infatti, per la poca chiarezza della sintassi del C quando si vanno a
879 trattare puntatori a funzioni, è molto meno comprensibile.  Da un confronto
880 con il precedente prototipo si può dedurre la definizione di
881 \type{sighandler\_t} che è:
882 \begin{verbatim}
883     typedef void (* sighandler_t)(int) 
884 \end{verbatim}
885 e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
886 e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le
887   parentesi intorno al nome della funzione per via delle precedenze degli
888   operatori del C, senza di esse si sarebbe definita una funzione che ritorna
889   un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.}
890 La funzione \func{signal} quindi restituisce e prende come secondo argomento
891 un puntatore a una funzione di questo tipo, che è appunto il manipolatore del
892 segnale.
893
894 Il numero di segnale passato in \param{signum} può essere indicato
895 direttamente con una delle costanti definite in \secref{sec:sig_standard}. Il
896 manipolatore \param{handler} invece, oltre all'indirizzo della funzione da
897 chiamare all'occorrenza del segnale, può assumere anche i due valori costanti
898 \macro{SIG\_IGN} con cui si dice ignorare il segnale e \macro{SIG\_DFL} per
899 installare l'azione di di default.\footnote{si ricordi però che i due segnali
900   \macro{SIGKILL} e \macro{SIGSTOP} non possono essere ignorati né
901   intercettati.}
902
903 La funzione restituisce l'indirizzo dell'azione precedente, che può essere
904 salvato per poterlo ripristinare (con un'altra chiamata a \func{signal}) in un
905 secondo tempo. Si ricordi che se si setta come azione \macro{SIG\_IGN} (o si
906 setta un \macro{SIG\_DFL} per un segnale il cui default è di essere ignorato),
907 tutti i segnali pendenti saranno scartati, e non verranno mai notificati.
908
909 L'uso di \func{signal} è soggetto a problemi di compatibilità, dato che essa
910 si comporta in maniera diversa per sistemi derivati da BSD o da System V. In
911 questi ultimi infatti la funzione è conforme al comportamento originale dei
912 primi Unix in cui il manipolatore viene disinstallato alla sua chiamata,
913 secondo la semantica inaffidabile; Linux seguiva questa convenzione fino alle
914 \acr{libc5}. Al contrario BSD segue la semantica affidabile, non resettando il
915 manipolatore e bloccando il segnale durante l'esecuzione dello stesso. Con
916 l'utilizzo delle \acr{glibc2} anche Linux è passato a questo comportamento;
917 quello della versione originale della funzione, il cui uso è deprecato per i
918 motivi visti in \secref{sec:sig_semantics}, può essere ottenuto chiamando
919 \func{sysv\_signal}.  In generale, per evitare questi problemi, tutti i nuovi
920 programmi dovrebbero usare \func{sigaction}.
921
922 È da tenere presente che, seguendo lo standard POSIX, il comportamento di un
923 processo che ignora i segnali \macro{SIGFPE}, \macro{SIGILL}, o
924 \macro{SIGSEGV} (qualora non originino da una \func{kill} o una \func{raise})
925 è indefinito. Un manipolatore che ritorna da questi segnali può dare luogo ad
926 un ciclo infinito.
927
928
929 \subsection{Le funzioni \func{kill} e \func{raise}}
930 \label{sec:sig_kill_raise}
931
932 Come accennato in \secref{sec:sig_types}, un segnale può essere generato
933 direttamente da un processo. L'invio di un segnale generico può essere
934 effettuato attraverso delle funzioni \func{kill} e \func{raise}. La prima
935 serve per inviare un segnale al processo corrente, ed il suo prototipo è:
936 \begin{prototype}{signal.h}{int raise(int sig)}
937   Invia il segnale \param{sig} al processo corrente.
938   
939   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
940     errore, il solo errore restituito è \macro{EINVAL} qualora si sia
941     specificato un numero di segnale invalido.}
942 \end{prototype}
943
944 Il valore di \param{sig} specifica il segnale che si vuole inviare e può
945 essere specificato con una delle macro definite in
946 \secref{sec:sig_classification}.  In genere questa funzione viene usata per
947 riprodurre il comportamento di default di un segnale che sia stato
948 intercettato. In questo caso, una volta eseguite le operazioni volute, il
949 manipolatore potrà reinstallare l'azione di default, e attivarla con
950 \func{raise}.
951
952 Se invece si vuole inviare un segnale ad un altro processo occorre utilizzare
953 la funzione \func{kill}; il cui prototipo è:
954 \begin{functions}
955   \headdecl{sys/types.h}
956   \headdecl{signal.h}
957   \funcdecl{int kill(pid\_t pid, int sig)} Invia il segnale \param{sig} al
958   processo specificato con \param{pid}.
959   
960   \bodydesc{ La funzione restituisce 0 in caso di successo e -1 in caso di
961     errore nel qual caso \var{errno} può assumere i valori:
962     \begin{errlist}
963     \item[\macro{EINVAL}] Il segnale specificato non esiste.
964     \item[\macro{ESRCH}] Il processo selezionato non esiste.
965     \item[\macro{EPERM}] Non si hanno privilegi sufficienti ad inviare il
966       segnale.
967     \end{errlist}}
968 \end{functions}
969
970 Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
971 specificare il segnale nullo.  Se le funzioni vengono chiamate con questo
972 valore non viene inviato nessun segnale, ma viene eseguito il controllo degli
973 errori, in tal caso si otterrà un errore \macro{EPERM} se non si hanno i
974 permessi necessari ed un errore \macro{ESRCH} se il processo specificato non
975 esiste. Si tenga conto però che il sistema ricicla i \acr{pid} (come accennato
976 in \secref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
977 esso sia realmente quello a cui si intendeva mandare il segnale.
978
979 Il valore dell'argomento \param{pid} specifica il processo (o i processi) di
980 destinazione a cui il segnale deve essere inviato e può assumere i valori
981 riportati in \tabref{tab:sig_kill_values}.
982 \begin{table}[htb]
983   \footnotesize
984   \centering
985   \begin{tabular}[c]{|r|l|}
986     \hline
987     \textbf{Valore} & \textbf{Significato} \\
988     \hline
989     \hline
990     $>0$ & il segnale è mandato al processo con il \acr{pid} indicato.\\
991     0    & il segnale è mandato ad ogni processo del \textit{process group}
992     del chiamante.\\ 
993     $-1$ & il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
994     $<-1$ & il segnale è mandato ad ogni processo del process group 
995     $|\code{pid}|$.\\
996     \hline
997   \end{tabular}
998   \caption{Valori dell'argomento \param{pid} per la funzione
999     \func{kill}.}
1000   \label{tab:sig_kill_values}
1001 \end{table}
1002
1003 Si noti pertanto che la funzione \code{raise(sig)} può essere definita in
1004 termini di \func{kill}, ed è sostanzialmente equivalente ad una
1005 \code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello
1006 standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale
1007 l'uso di \func{kill} finisce per essere più portabile.
1008
1009 Solo l'amministratore può inviare un segnale ad un processo qualunque, in
1010 tutti gli altri casi il \textit{real user id} o l'\textit{effective user id}
1011 del processo chiamante devono corrispondere al \textit{real user id} o al
1012 \textit{saved user id} della destinazione. Fa eccezione il caso in cui il
1013 segnale inviato sia \macro{SIGCONT}, nel quale occorre che entrambi i processi
1014 appartengano alla stessa sessione. Inoltre, dato il ruolo fondamentale che
1015 riveste nel sistema (si ricordi quanto visto in \secref{sec:sig_termination}),
1016 non è possibile inviare al processo 1 (cioè a \cmd{init}) segnali per i quali
1017 esso non abbia un manipolatore installato.
1018
1019 Infine, seguendo le specifiche POSIX 1003.1-2001, l'uso della chiamata
1020 \code{kill(-1, sig)} comporta che il segnale sia inviato (con la solita
1021 eccezione di \cmd{init}) a tutti i processi per i quali i permessi lo
1022 consentano. Lo standard permette comunque alle varie implementazione di
1023 escludere alcuni processi specifici: nel caso in questione Linux non invia il
1024 segnale al processo che ha effettuato la chiamata.
1025
1026
1027 \subsection{Le funzioni \func{alarm} e \func{abort}}
1028 \label{sec:sig_alarm_abort}
1029
1030 Un caso particolare di segnali generati a richiesta è quello che riguarda i
1031 vari segnali di temporizzazione e \macro{SIGABORT}, per ciascuno di questi
1032 segnali sono previste funzioni specifiche che ne effettuino l'invio. La più
1033 comune delle funzioni usate per la temporizzazione è \func{alarm} il cui
1034 prototipo è:
1035 \begin{prototype}{unistd.h}{unsigned int alarm(unsigned int seconds)}
1036   Predispone l'invio di \macro{SIGALARM} dopo \param{seconds} secondi.
1037   
1038   \bodydesc{La funzione restituisce il numero di secondi rimanenti ad un
1039     precedente allarme, o zero se non c'erano allarmi pendenti.}
1040 \end{prototype}
1041
1042 La funzione fornisce un meccanismo che consente ad un processo di predisporre
1043 un'interruzione nel futuro, (ad esempio per effettuare una qualche operazione
1044 dopo un certo periodo di tempo), programmando l'emissione di un segnale (nel
1045 caso in questione \macro{SIGALARM}) dopo il numero di secondi specificato da
1046 \param{seconds}.
1047
1048 Se si specifica per \param{seconds} un valore nullo non verrà inviato nessun
1049 segnale; siccome alla chiamata viene cancellato ogni precedente allarme,
1050 questo può essere usato per cancellare una programmazione precedente. 
1051
1052 La funzione inoltre ritorna il numero di secondi rimanenti all'invio
1053 dell'allarme precedentemente programmato, in modo che sia possibile
1054 controllare se non si cancella un precedente allarme ed eventualmente
1055 predisporre le opportune misure per gestire il caso di necessità di più
1056 interruzioni.
1057
1058 In \secref{sec:sys_unix_time} abbiamo visto che ad ogni processo sono
1059 associati tre tempi diversi: il \textit{clock time}, l'\textit{user time} ed
1060 il \textit{system time}.  Per poterli calcolare il kernel mantiene per ciascun
1061 processo tre diversi timer:
1062 \begin{itemize}
1063 \item un \textit{real-time timer} che calcola il tempo reale trascorso (che
1064   corrisponde al \textit{clock time}). La scadenza di questo timer provoca
1065   l'emissione di \macro{SIGALARM}.
1066 \item un \textit{virtual timer} che calcola il tempo di processore usato dal
1067   processo in user space (che corrisponde all'\textit{user time}). La scadenza
1068   di questo timer provoca l'emissione di \macro{SIGVTALRM}.
1069 \item un \textit{profiling timer} che calcola la somma dei tempi di processore
1070   utilizzati direttamente dal processo in user space, e dal kernel nelle
1071   system call ad esso relative (che corrisponde a quello che in
1072   \secref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La scadenza
1073   di questo timer provoca l'emissione di \macro{SIGPROF}.
1074 \end{itemize}
1075
1076 Il timer usato da \func{alarm} è il \textit{clock time}, e corrisponde cioè al
1077 tempo reale. La funzione come abbiamo visto è molto semplice, ma proprio per
1078 questo presenta numerosi limiti: non consente di usare gli altri timer, non
1079 può specificare intervalli di tempo con precisione maggiore del secondo e
1080 genera il segnale una sola volta.
1081
1082 Per ovviare a questi limiti Linux deriva da BSD la funzione \func{setitimer}
1083 che permette di usare un timer qualunque e l'invio di segnali periodici, al
1084 costo però di una maggiore complessità d'uso e di una minore portabilità. Il
1085 suo prototipo è:
1086 \begin{prototype}{sys/time.h}{int setitimer(int which, const struct
1087     itimerval *value, struct itimerval *ovalue)} 
1088   
1089   Predispone l'invio di un segnale di allarme alla scadenza dell'intervallo
1090   \param{value} sul timer specificato da \func{which}.
1091   
1092   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1093     errore, nel qual caso \var{errno} può assumere i valori \macro{EINVAL} e
1094     \macro{EFAULT}.}
1095 \end{prototype}
1096
1097 Il valore di \param{which} permette di specificare quale dei tre timer
1098 illustrati in precedenza usare; i possibili valori sono riportati in
1099 \tabref{tab:sig_setitimer_values}.
1100 \begin{table}[htb]
1101   \footnotesize
1102   \centering
1103   \begin{tabular}[c]{|l|l|}
1104     \hline
1105     \textbf{Valore} & \textbf{Timer} \\
1106     \hline
1107     \hline
1108     \macro{ITIMER\_REAL}    & \textit{real-time timer}\\
1109     \macro{ITIMER\_VIRTUAL} & \textit{virtual timer}\\
1110     \macro{ITIMER\_PROF}    & \textit{profiling timer}\\
1111     \hline
1112   \end{tabular}
1113   \caption{Valori dell'argomento \param{which} per la funzione
1114     \func{setitimer}.}
1115   \label{tab:sig_setitimer_values}
1116 \end{table}
1117
1118 Il valore della struttura specificata \param{value} viene usato per settare il
1119 timer, se il puntatore \param{ovalue} non è nullo il precedente valore viene
1120 salvato qui. I valori dei timer devono essere indicati attraverso una
1121 struttura \var{itimerval}, definita in \figref{fig:file_stat_struct}.
1122
1123 La struttura è composta da due membri, il primo, \var{it\_interval} definisce
1124 il periodo del timer; il secondo, \var{it\_value} il tempo mancante alla
1125 scadenza. Entrambi esprimono i tempi tramite una struttura \var{timeval} che
1126 permette una precisione fino al microsecondo.
1127
1128 Ciascun timer decrementa il valore di \var{it\_value} fino a zero, poi invia
1129 il segnale e resetta \var{it\_value} al valore di \var{it\_interval}, in
1130 questo modo il ciclo verrà ripetuto; se invece il valore di \var{it\_interval}
1131 è nullo il timer si ferma.
1132
1133 \begin{figure}[!htb]
1134   \footnotesize \centering
1135   \begin{minipage}[c]{15cm}
1136     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
1137 struct itimerval 
1138 {
1139     struct timeval it_interval; /* next value */
1140     struct timeval it_value;    /* current value */
1141 };
1142
1143 struct timeval 
1144 {
1145     long tv_sec;                /* seconds */
1146     long tv_usec;               /* microseconds */
1147 };
1148     \end{lstlisting}
1149   \end{minipage} 
1150   \normalsize 
1151   \caption{La struttura \var{itimerval}, che definisce i valori dei timer di
1152     sistema.} 
1153   \label{fig:sig_itimerval}
1154 \end{figure}
1155
1156 L'uso di \func{setitimer} consente dunque un controllo completo di tutte le
1157 caratteristiche dei timer, ed in effetti la stessa \func{alarm}, benché
1158 definita direttamente nello standard POSIX.1, può a sua volta essere espressa
1159 in termini di \func{setitimer}, come evidenziato dal manuale delle \acr{glibc}
1160 \cite{glibc} che ne riporta la definizione mostrata in
1161 \figref{fig:sig_alarm_def}.
1162
1163 \begin{figure}[!htb]
1164   \footnotesize \centering
1165   \begin{minipage}[c]{15cm}
1166     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
1167 unsigned int alarm(unsigned int seconds)
1168 {
1169     struct itimerval old, new;
1170     new.it_interval.tv_usec = 0;
1171     new.it_interval.tv_sec = 0;
1172     new.it_value.tv_usec = 0;
1173     new.it_value.tv_sec = (long int) seconds;
1174     if (setitimer(ITIMER_REAL, &new, &old) < 0) {
1175         return 0;
1176     }
1177     else {
1178         return old.it_value.tv_sec;
1179     }
1180 }
1181     \end{lstlisting}
1182   \end{minipage} 
1183   \normalsize 
1184   \caption{Definizione di \func{alarm} in termini di \func{setitimer}.} 
1185   \label{fig:sig_alarm_def}
1186 \end{figure}
1187
1188 Si deve comunque tenere presente che la precisione di queste funzioni è
1189 limitata da quella della frequenza del timer di sistema (che nel caso dei PC
1190 significa circa 10~ms). Il sistema assicura comunque che il segnale non sarà
1191 mai generato prima della scadenza programmata (l'arrotondamento cioè è sempre
1192 effettuato per eccesso).  
1193
1194 Una seconda causa di potenziali ritardi è che il segnale viene generato alla
1195 scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo
1196 è attivo (questo è sempre vero per \macro{ITIMER\_VIRT}) la consegna è
1197 immediata, altrimenti può esserci un ulteriore ritardo che può variare a
1198 seconda del carico del sistema.
1199
1200 Questo ha una conseguenza che può indurre ad errori molto subdoli, si tenga
1201 conto poi che in caso di sistema molto carico, si può avere il caso patologico
1202 in cui un timer scade prima che il segnale di una precedente scadenza sia
1203 stato consegnato; in questo caso, per il comportamento dei segnali descritto
1204 in \secref{sec:sig_sigchld}, un solo segnale sarà consegnato.
1205
1206
1207 Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il
1208 valore corrente di un timer senza modificarlo, è possibile usare la funzione
1209 \func{getitimer}, il cui prototipo è:
1210 \begin{prototype}{sys/time.h}{int getitimer(int which, struct
1211     itimerval *value)}
1212   
1213   Legge in \param{value} il valore del timer specificato da \func{which}.
1214   
1215   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
1216     errore e restituisce gli stessi errori di \func{getitimer}}
1217 \end{prototype}
1218 \noindent i cui parametri hanno lo stesso significato e formato di quelli di
1219 \func{setitimer}. 
1220
1221
1222 L'ultima funzione che permette l'invio diretto di un segnale è \func{abort};
1223 che, come accennato in \ref{sec:proc_termination}, permette di abortire
1224 l'esecuzione di un programma tramite l'invio di \macro{SIGABRT}. Il suo
1225 prototipo è:
1226 \begin{prototype}{stdlib.h}{void abort(void)}
1227   
1228   Abortisce il processo corrente.
1229   
1230   \bodydesc{La funzione non ritorna, il processo è terminato inviando il
1231   segnale di \macro{SIGABRT}.}
1232 \end{prototype}
1233
1234 La differenza fra questa funzione e l'uso di \func{raise} è che anche se il
1235 segnale è bloccato o ignorato, la funzione ha effetto lo stesso. Il segnale
1236 può però essere intercettato per effettuare eventuali operazioni di chiusura
1237 prima della terminazione del processo.
1238
1239 Lo standard ANSI C richiede inoltre che anche se il manipolatore ritorna, la
1240 funzione non ritorni comunque. Lo standard POSIX.1 va oltre e richiede che se
1241 il processo non viene terminato direttamente dal manipolatore sia la stessa
1242 \func{abort} a farlo al ritorno dello stesso. Inoltre, sempre seguendo lo
1243 standard POSIX, prima della terminazione tutti i file aperti e gli stream
1244 saranno chiusi ed i buffer scaricati su disco. Non verranno invece eseguite le
1245 eventuali funzioni registrate con \func{at\_exit} e \func{on\_exit}.
1246
1247
1248 \subsection{Le funzioni \func{pause} e \func{sleep}}
1249 \label{sec:sig_pause_sleep}
1250
1251 Il metodo tradizionale per fare attendere\footnote{cioè di porre
1252   temporanemente il processo in stato di \textit{sleep}, vedi
1253   \ref{sec:proc_sched}.}  ad un processo fino all'arrivo di un segnale è
1254 quello di usare la funzione \func{pause}, il cui prototipo è:
1255 \begin{prototype}{unistd.h}{int pause(void)}
1256   
1257   Pone il processo in stato di sleep fino al ritorno di un manipolatore.
1258   
1259   \bodydesc{La funzione ritorna solo dopo che un segnale è stato ricevuto ed
1260     il relativo manipolatore è ritornato, nel qual caso restituisce -1 e setta
1261     \var{errno} a \macro{EINTR}.}
1262 \end{prototype}
1263
1264 La funzione segnala sempre una condizione di errore (il successo sarebbe
1265 quello di aspettare indefinitamente). In genere si usa questa funzione quando
1266 si vuole mettere un processo in attesa di un qualche evento specifico che non
1267 è sotto il suo diretto controllo (ad esempio la si può usare per far reagire
1268 il processo ad un segnale inviato da un altro processo).
1269
1270 Se invece si vuole fare attendere un processo per un determinato intervallo di
1271 tempo nello standard POSIX.1 viene definita la funzione \func{sleep}, il cui
1272 prototipo è:
1273 \begin{prototype}{unistd.h}{unsigned int sleep(unsigned int seconds)}
1274   
1275   Pone il processo in stato di sleep per \param{seconds} secondi.
1276   
1277   \bodydesc{La funzione restituisce zero se l'attesa viene completata, o il
1278   numero di secondi restanti se viene interrotta da un segnale.}
1279 \end{prototype}
1280
1281 La funzione attende per il tempo specificato, a meno di non essere interrotta
1282 da un segnale. In questo caso non è una buona idea ripetere la chiamata per il
1283 tempo rimanente, in quanto la riattivazione del processo può avvenire in un
1284 qualunque momento, ma il valore restituito sarà sempre arrotondato al secondo,
1285 con la conseguenza che, se la successione dei segnali è particolarmente
1286 sfortunata e le differenze si accumulano, si potranno avere ritardi anche di
1287 parecchi secondi. In genere la scelta più sicura è quella di stabilire un
1288 termine per l'attesa, e ricalcolare tutte le volte il numero di secondi da
1289 aspettare.
1290
1291 In alcune implementazioni inoltre l'uso di \func{sleep} può avere conflitti
1292 con quello di \macro{SIGALRM}, dato che la funzione può essere realizzata con
1293 l'uso di \func{pause} e \func{alarm} (in maniera analoga all'esempio che
1294 vedremo in \secref{sec:sig_example}). In tal caso mescolare chiamata di
1295 \func{alarm} e \func{sleep} o modificare l'azione di \macro{SIGALRM}, può
1296 causare risultati indefiniti. Nel caso delle \acr{glibc} è stata usata una
1297 implementazione completamente indipendente e questi problemi non ci sono.
1298
1299 La granularità di \func{sleep} permette di specificare attese in secondi, per
1300 questo sia sotto BSD4.3 che in SUSv2 è stata definita la funzione
1301 \func{usleep} (dove la \texttt{u} è intesa come sostituzione di $\mu$); i due
1302 standard hanno delle definizioni diverse, ma le \acr{glibc}
1303 seguono\footnote{secondo la man page almeno dalla versione 2.2.2.} seguono
1304 quella di SUSv2 che prevede il seguente prototipo:
1305 \begin{prototype}{unistd.h}{int usleep(unsigned long usec)}
1306   
1307   Pone il processo in stato di sleep per \param{usec} microsecondi.
1308   
1309   \bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in
1310     caso di errore, nel qual caso \var{errno} è settata a \macro{EINTR}.}
1311
1312 \end{prototype}
1313
1314 Anche questa funzione, a seconda delle implementazioni, può presentare
1315 problemi nell'interazione con \func{alarm} e \macro{SIGALRM}. È pertanto
1316 deprecata in favore della funzione \func{nanosleep}, definita dallo standard
1317 POSIX1.b, il cui prototipo è:
1318 \begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct
1319     timespec *rem)}
1320   
1321   Pone il processo in stato di sleep per il tempo specificato da \param{req}.
1322   In caso di interruzione restituisce il tempo restante in \param{rem}.
1323   
1324   \bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in
1325     caso di errore, nel qual caso \var{errno} è settata a 
1326     \begin{errlist}
1327     \item[\macro{EINVAL}] si è specificato un numero di secondi negativo o un
1328       numero di nanosecondi maggiore di 999.999.999.
1329     \item[\macro{EINTR}] la funzione è stata interrotta da un segnale.
1330     \end{errlist}}
1331 \end{prototype}
1332
1333 Lo standard richiede che la funzione sia implementata in maniera del tutto
1334 indipendente da \func{alarm}\footnote{nel caso di Linux questo è fatto
1335   utilizzando direttamente il timer del kernel.} e sia utilizzabile senza
1336 interferenze con l'uso di \macro{SIGALRM}. La funzione prende come parametri
1337 delle strutture di tipo \var{timespec}, la cui definizione è riportata in 
1338 \figref{fig:sig_timespec_def}, che permettono di specificare un tempo con una
1339 precisione (teorica) fino al nanosecondo. 
1340
1341 La funzione risolve anche il problema di proseguire l'attesa dopo
1342 l'interruzione dovuta ad un segnale; infatti in tal caso in \param{rem} viene
1343 restituito il tempo rimanente rispetto a quanto richiesto inizialmente, e
1344 basta richiamare la funzione per completare l'attesa. 
1345
1346 Chiaramente, anche se il tempo può essere specificato con risoluzioni fino al
1347 nanosecondo, la precisione di \func{nanosleep} è determinata dalla risoluzione
1348 temporale del timer di sistema. Perciò la funzione attenderà comunque il tempo
1349 specificato, ma prima che il processo possa tornare ad essere eseguito
1350 occorrerà almeno attendere il successivo giro di scheduler e cioè un tempo che
1351 a seconda dei casi può arrivare fino a 1/\macro{HZ}, (sempre che il sistema
1352 sia scarico ed il processa venga immediatamente rimesso in esecuzione); per
1353 questo motivo il valore restituito in \param{rem} è sempre arrotondato al
1354 multiplo successivo di 1/\macro{HZ}.
1355
1356 \begin{figure}[!htb]
1357   \footnotesize \centering
1358   \begin{minipage}[c]{15cm}
1359     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
1360 struct timespec {
1361     time_t  tv_sec;         /* seconds */
1362     long    tv_nsec;        /* nanoseconds */
1363 };
1364     \end{lstlisting}
1365   \end{minipage} 
1366   \normalsize 
1367   \caption{La struttura \var{timespec} di \func{nanosleep}.} 
1368   \label{fig:sig_timespec_def}
1369 \end{figure}
1370
1371 In realtà è possibile ottenere anche pause più precise del centesimo di
1372 secondo usando politiche di scheduling real time come \macro{SCHED\_FIFO} o
1373 \macro{SCHED\_RR}; in tal caso infatti il meccanismo di scheduling ordinario
1374 viene evitato, e si raggiungono pause fino ai 2~ms con precisioni del $\mu$s.
1375
1376
1377
1378 \subsection{Un esempio elementare}
1379 \label{sec:sig_sigchld}
1380
1381 Un semplice esempio per illustrare il funzionamento di un manipolatore di
1382 segnale è quello della gestione di \macro{SIGCHLD}. Abbiamo visto in
1383 \secref{sec:proc_termination} che una delle azioni eseguite dal kernel alla
1384 conclusione di un processo è quella di inviare questo segnale al
1385 padre.\footnote{in realtà in SRV4 eredita la semantica di System V, in cui il
1386   segnale si chiama \macro{SIGCLD} e viene trattato in maniera speciale; in
1387   System V infatti se si setta esplicitamente l'azione a \macro{SIG\_IGN} il
1388   segnale non viene generato ed il sistema non genera zombie (lo stato di
1389   terminazione viene scartato senza dover chiamare una \func{wait}). L'azione
1390   di default è sempre quella di ignorare il segnale, ma non attiva questo
1391   comportamento. Linux, come BSD e POSIX, non supporta questa semantica ed usa
1392   il nome di \macro{SIGCLD} come sinonimo di \macro{SIGCHLD}.} In generale
1393 dunque, quando non interessa elaborare lo stato di uscita di un processo, si
1394 può completare la gestione della terminazione installando un manipolatore per
1395 \macro{SIGCHLD} il cui unico compito sia quello chiamare \func{waitpid} per
1396 completare la procedura di terminazione in modo da evitare la formazione di
1397 zombie.
1398
1399 In \figref{fig:sig_sigchld_handl} è mostrato il codice della nostra
1400 implementazione del manipolatore; se aggiungiamo al codice di
1401 \file{ForkTest.c} l'intallazione di questo manipolatore potremo verificare che
1402 ripetendo l'esempio visto in \secref{sec:proc_termination} che non si ha più
1403 la creazione di zombie.
1404
1405 %  è pertanto
1406 % naturale usare un esempio che ci permette di concludere la trattazione della
1407 % terminazione dei processi.
1408 % In questo caso si è tratterà di illustrare un esempio relativo ad un
1409 % manipolatore per che è previsto ritornare,
1410
1411
1412 \begin{figure}[!htb]
1413   \footnotesize \centering
1414   \begin{minipage}[c]{15cm}
1415     \begin{lstlisting}{}
1416 #include <errno.h>       /* error simbol definitions */
1417 #include <signal.h>      /* signal handling declarations */
1418 #include <sys/types.h>
1419 #include <sys/wait.h>
1420 #include "macro.h"
1421
1422 void Hand_CHLD(int sig)
1423 {
1424     int errno_save;
1425     int status;
1426     pid_t pid;
1427     /* save errno current value */
1428     errno_save = errno;
1429     /* loop until no */
1430     do {
1431         errno = 0;
1432         pid = waitpid(WAIT_ANY, &status, WNOHANG);
1433         if (pid > 0) {
1434             debug("child %d terminated with status %x\n", pid, status);
1435         }
1436     } while ((pid > 0) && (errno == EINTR));
1437     /* restore errno value */
1438     errno = errno_save;
1439     /* return */
1440     return;
1441 }
1442     \end{lstlisting}
1443   \end{minipage} 
1444   \normalsize 
1445   \caption{Un manipolatore per il segnale \texttt{SIGCHLD}.} 
1446   \label{fig:sig_sigchld_handl}
1447 \end{figure}
1448
1449 Il codice del manipolatore è di lettura immediata; come buona norma di
1450 programmazione (si ricordi quanto accennato \secref{sec:sys_errno}) si
1451 comincia (\texttt{\small 12-13}) con il salvare lo stato corrente di
1452 \var{errno}, in modo da poterlo ripristinare prima del ritorno del
1453 manipolatore (\texttt{\small 22-23}). In questo modo si preserva il valore
1454 della variabile visto dal corso di esecuzione principale del processo, che
1455 sarebbe altrimenti sarebbe sovrascritto dal valore restituito nella successiva
1456 chiamata di \func{wait}.
1457
1458 Il compito principale del manipolatore è quello di ricevere lo stato di
1459 terminazione del processo, cosa che viene eseguita nel ciclo in
1460 (\texttt{\small 15-21}).  Il ciclo è necessario a causa di una caratteristica
1461 fondamentale della gestione dei segnali: abbiamo già accennato come fra la
1462 generazione di un segnale e l'esecuzione del manipolatore possa passare un
1463 certo lasso di tempo e niente ci assicura che il manipolatore venga eseguito
1464 prima della generazione di ulteriori segnali dello stesso tipo. In questo caso
1465 normalmente i segnali segnali successivi vengono ``fusi'' col primo ed al
1466 processo ne viene recapitato soltanto uno.
1467
1468 Questo può essere un caso comune proprio con \macro{SIGCHLD}, qualora capiti
1469 che molti processi figli terminino in rapida successione. Esso inoltre si
1470 presenta tutte le volte che un segnale viene bloccato: per quanti siano i
1471 segnali emessi durante il periodo di blocco, una volta che quest'ultimo sarà
1472 rimosso sarà recapitato un solo segnale.
1473
1474 Allora nel caso della terminazione dei processi figli, se si chiamasse
1475 \func{waitpid} una sola volta, essa leggerebbe lo stato di teminazione per un
1476 solo processo, anche se i processi terminati sono più di uno, e gli altri
1477 resterebbero in stato di zombie per un tempo indefinito.
1478
1479 Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non
1480 ritorni un valore nullo, segno che non resta nessun processo di cui si debba
1481 ancora ricevere lo stato di terminazione (si veda \secref{sec:proc_wait} per
1482 la sintassi della funzione). Si noti anche come la funzione venga invocata con
1483 il parametro \macro{WNOHANG} che permette di evitare il suo blocco quando
1484 tutti gli stati di terminazione sono stati ricevuti.
1485
1486
1487
1488 \section{Gestione avanzata}
1489 \label{sec:sig_control}
1490
1491 Le funzioni esaminate finora fanno riferimento ad alle modalità più elementari
1492 della gestione dei segnali; non si sono pertanto ancora prese in
1493 considerazione le tematiche più complesse, collegate alle varie race condition
1494 che i segnali possono generare e alla natura asincrona degli stessi.
1495
1496 Affronteremo queste problematiche in questa sezione, partendo da un esempio
1497 che le evidenzi, per poi prendere in esame le varie funzioni che permettono di
1498 risolvere i problemi più complessi connessi alla programmazione con i segnali,
1499 fino a trattare le caratteristiche generali della gestione dei medesimi nella
1500 casistica ordinaria.
1501
1502
1503 \subsection{Alcune problematiche aperte}
1504 \label{sec:sig_example}
1505
1506 Come accennato in \secref{sec:sig_pause_sleep} è possibile implementare
1507 \func{sleep} a partire da dall'uso di \func{pause} e \func{alarm}. A prima
1508 vista questo può sembrare di implementazione immediata; ad esempio una
1509 semplice versione di \func{sleep} potrebbe essere quella illustrata in
1510 \figref{fig:sig_sleep_wrong}.
1511
1512
1513 Dato che è nostra intenzione utilizzare \macro{SIGALARM} il primo passo della
1514 nostra implementazione di sarà quello di installare il relativo manipolatore
1515 salvando il precedente (\texttt{\small 4-7}).  Si effettuerà poi una chiamata
1516 ad \func{alarm} per specificare il tempo d'attesa per l'invio del segnale a
1517 cui segue la chiamata a \func{pause} per fermare il programma (\texttt{\small
1518   8-9}) fino alla sua ricezione.  Al ritorno di \func{pause}, causato dal
1519 ritorno del manipolatore (\texttt{\small 15-23}), si ripristina il
1520 manipolatore originario (\texttt{\small 10-11}) restituendo l'eventuale tempo
1521 rimanente (\texttt{\small 12-13}) che potrà essere diverso da zero qualora
1522 l'interruzione di \func{pause} venisse causata da un altro segnale.
1523
1524 \begin{figure}[!htb]
1525   \footnotesize \centering
1526   \begin{minipage}[c]{15cm}
1527     \begin{lstlisting}{}
1528 unsigned int sleep(unsigned int seconds)
1529 {
1530     signandler_t prev_handler;
1531     if ((prev_handler = signal(SIGALRM, alarm_hand)) == SIG_ERR) {
1532         printf("Cannot set handler for alarm\n");
1533         exit(1);
1534     }
1535     alarm(second);
1536     pause(); 
1537     /* restore previous signal handler */
1538     signal(SIGALRM, prev_handler);
1539     /* remove alarm, return remaining time */
1540     return alarm(0);
1541 }
1542 void alarm_hand(int sig) 
1543 {
1544     /* check if the signal is the right one */
1545     if (sig != SIGALRM) { /* if not exit with error */
1546         printf("Something wrong, handler for SIGALRM\n");
1547         exit(1);
1548     } else {    /* do nothing, just interrupt pause */
1549         return;
1550     }
1551 }      
1552     \end{lstlisting}
1553   \end{minipage} 
1554   \normalsize 
1555   \caption{Una implementazione pericolosa di \func{sleep}.} 
1556   \label{fig:sig_sleep_wrong}
1557 \end{figure}
1558
1559 Questo codice però, a parte il non gestire il caso in cui si è avuta una
1560 precedente chiamata a \func{alarm} (che si è tralasciato per brevità),
1561 presenta una pericolosa race condition.  Infatti se il processo viene
1562 interrotto fra la chiamata di \func{alarm} e \func{pause} può capitare (ad
1563 esempio se il sistema è molto carico) che il tempo di attesa scada prima
1564 dell'esecuzione quest'ultima, cosicchè essa sarebbe eseguita dopo l'arrivo di
1565 \macro{SIGALRM}. In questo caso ci si troverebbe di fronte ad un deadlock, in
1566 quanto \func{pause} non verrebbe mai più interrotta (se non in caso di un
1567 altro segnale).
1568
1569 Questo problema può essere risolto (ed è la modalità con cui veniva fatto in
1570 SVr2) usando la funzione \func{longjump} (vedi \secref{sec:proc_longjmp}) per
1571 uscire dal manipolatore; in questo modo, con una condizione sullo stato di
1572 uscita di quest'ultima, si può evitare la chiamata a \func{pause}, usando un
1573 codice del tipo di quello riportato in \figref{fig:sig_sleep_incomplete}.
1574
1575 \begin{figure}[!htb]
1576   \footnotesize \centering
1577   \begin{minipage}[c]{15cm}
1578     \begin{lstlisting}{}
1579 static jmp_buff alarm_return;
1580 unsigned int sleep(unsigned int seconds)
1581 {
1582     signandler_t prev_handler;
1583     if ((prev_handler = signal(SIGALRM, alarm_hand)) == SIG_ERR) {
1584         printf("Cannot set handler for alarm\n");
1585         exit(1);
1586     }
1587     if (setjmp(alarm_return) == 0) { /* if not returning from handler */
1588         alarm(second);      /* call alarm */
1589         pause();            /* then wait */
1590     }
1591     /* restore previous signal handler */
1592     signal(SIGALRM, prev_handler);
1593     /* remove alarm, return remaining time */
1594     return alarm(0);
1595 }
1596 void alarm_hand(int sig) 
1597 {
1598     /* check if the signal is the right one */
1599     if (sig != SIGALRM) { /* if not exit with error */
1600         printf("Something wrong, handler for SIGALRM\n");
1601         exit(1);
1602     } else {    /* return in main after the call to pause */
1603         longjump(alarm_return, 1);
1604     }
1605 }      
1606     \end{lstlisting}
1607   \end{minipage} 
1608   \normalsize 
1609   \caption{Una implementazione ancora malfunzionante di \func{sleep}.} 
1610   \label{fig:sig_sleep_incomplete}
1611 \end{figure}
1612
1613 In questo caso il manipolatore (\texttt{\small 18-26}) non ritorna come in
1614 \figref{fig:sig_sleep_wrong}, ma usa \func{longjmp} (\texttt{\small 24}) per
1615 rientrare nel corpo principale del programma; dato che in questo caso il
1616 valore di uscita di \func{setjmp} è 1 grazie alla condizione in
1617 (\texttt{\small 9-12}) si evita comunque che \func{pause} sia chiamata a
1618 vuoto.
1619
1620 Ma anche questa implementazione comporta dei problemi; in questo caso infatti
1621 non viene gestita correttamente l'interazione con gli altri segnali; se
1622 infatti il segnale di allarme interrompe un altro manipolatore, in questo caso
1623 l'esecuzione non riprenderà nel manipolatore in questione, ma nel ciclo
1624 principale, interrompendone inopportunamente l'esecuzione.  
1625
1626 Lo stesso tipo di problema si presenterebbe se si volesse usare \func{alarm}
1627 per stabilire un timeout su una sistem call bloccante. Un secondo esempio è
1628 quello in cui si usa il segnale per notificare una quelche forma di evento; in
1629 genere quello che si fa in questo caso è settare nel manipolatore un opportuno
1630 flag da controllare nel corpo principale del programma (con un codice del tipo
1631 di quello riportato in 
1632
1633 \begin{figure}[!htb]
1634   \footnotesize \centering
1635   \begin{minipage}[c]{15cm}
1636     \begin{lstlisting}{}
1637 sig_atomic_t flag;
1638 unsigned int control(unsigned int seconds)
1639 {
1640     da fare
1641 }
1642 void alarm_hand(int sig) 
1643 {
1644     /* set the flag 
1645     flag = 1;
1646 }      
1647     \end{lstlisting}
1648   \end{minipage} 
1649   \normalsize 
1650   \caption{Un esempio non funzionante di restituzione di un evento da parte di
1651     un segnale.} 
1652   \label{fig:sig_event_wrong}
1653 \end{figure}
1654
1655
1656
1657 È per questo motivo che occorrono funzioni più sofisticate della semplice
1658 \func{signal} che permettano di gestire i segnali in maniera più completa.
1659
1660
1661
1662
1663
1664
1665 \subsection{I \textit{signal set}}
1666 \label{sec:sig_sigset}
1667
1668 Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali
1669 dei primi Unix, nate con la semantica inaffidabile, hanno dei limiti non
1670 superabili; in particolare non è prevista nessuna funzione che permetta di
1671 gestire gestire il blocco dei segnali o di verificare lo stato dei segnali
1672 pendenti.
1673
1674 Per questo motivo lo standard POSIX.1, insieme alla nuova semantica dei
1675 segnali ha introdotto una interfaccia di gestione completamente nuova, che
1676 permette di ottenete un controllo molto più dettagliato. In particolare lo
1677 standard ha introdotto un nuovo tipo di dato \type{sigset\_t}, che permette di
1678 rappresentare un insieme di segnali (un \textit{signal set}, come viene
1679 usualmente chiamato), che è il tipo di dato che viene usato per gestire il
1680 blocco dei segnali.
1681
1682 In genere un \textit{signal set} è rappresentato da un intero di dimensione
1683 opportuna, di solito si pari al numero di bit dell'architettura della
1684 macchina\footnote{nel caso dei PC questo comporta un massimo di 32 segnali
1685   distinti, dato che in Linux questi sono sufficienti non c'è necessità di
1686   nessuna struttura più complicata.}, ciascun bit del quale è associato ad uno
1687 specifico segnale; in questo modo è di solito possibile implementare le
1688 operazioni direttamente con istruzioni elementari del processore; lo standard
1689 POSIX.1 definisce cinque funzioni per la manipolazione dei \textit{signal set},
1690 \func{sigemptyset}, \func{sigfillset}, \func{sigaddset}, \func{sigdelset} e
1691 \func{sigismember}, i cui prototipi sono:
1692 \begin{functions}
1693   \headdecl{signal.h} 
1694
1695   \funcdecl{int sigemptyset(sigset\_t *set)} Inizializza un \textit{signal set}
1696   vuoto.
1697  
1698   \funcdecl{int sigfillset(sigset\_t *set)} Inizializza un \textit{signal set}
1699   pieno (con tutti i segnali).
1700   
1701   \funcdecl{int sigaddset(sigset\_t *set, int signum)} Aggiunge il segnale
1702   \param{signum} al  \textit{signal set} \param{set}.
1703
1704   \funcdecl{int sigdelset(sigset\_t *set, int signum)} Toglie il segnale
1705   \param{signum} dal \textit{signal set} \param{set}.
1706   
1707   \funcdecl{int sigismember(const sigset\_t *set, int signum)} Controlla se il
1708   segnale \param{signum} è nel \textit{signal set} \param{set}
1709   
1710   \bodydesc{Le prime quattro funzioni ritornano 0 in caso di successo, mentre
1711     \func{sigismember} ritorna 1 se \param{signum} è in \param{set} e 0
1712     altrimenti. In caso di errore tutte ritornano -1, con \var{errno} settata a
1713     \macro{EINVAL} (il solo errore possibile è che \param{signum} non sia un
1714     segnale valido).}
1715 \end{functions}
1716
1717 Dato che in generale non si può fare conto sulle caratteristiche di una
1718 implementazione (non è detto che si disponga di un numero di bit sufficienti
1719 per mettere tutti i segnali in un intero, o in \type{sigset\_t} possono essere
1720 immagazzinate ulteriori informazioni) tutte le operazioni devono essere
1721 comunque eseguite attraverso queste funzioni.
1722
1723 In genere si usa un \textit{signal set} per specificare quali segnali si vuole
1724 bloccare, o per riottenere dalle varie funzioni di gestione la maschera dei
1725 segnali attivi. Essi possono essere definiti in due diverse maniere,
1726 aggiungendo i segnali voluti ad un insieme vuoto ottenuto con
1727 \func{sigemptyset} o togliendo quelli che non servono da un insieme completo
1728 ottenuto con \func{sigfillset}. Infine \func{sigismember} permette di vericare
1729 la presenza di uno specifico segnale in un \textit{signal set}.
1730
1731
1732 \subsection{La funzione \func{sigaction}}
1733 \label{sec:sig_sigaction}
1734
1735 La funzione principale dell'interfaccia standard POSIX.1 per i segnali è
1736 \func{sigaction}, essa ha sostanzialemente le stesse funzioni di
1737 \func{signal}, permette cioè di specificare come un segnale può essere gestito
1738 da un processo. Il suo prototipo è:
1739
1740 \begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
1741     *act, struct sigaction *oldact)} 
1742   
1743   Installa un nuovo manipolatore per il segnale \param{signum}.
1744   
1745   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
1746     errore, nel qual caso \var{errno} assumerà i valori:
1747   \begin{errlist}
1748   \item[\macro{EINVAL}] Si è specificato un numero di segnale invalido o si è
1749     cercato di installare il manipolatore per \macro{SIGKILL} o
1750     \macro{SIGSTOP}.
1751   \item[\macro{EFAULT}] Si sono specificati indirizzi non validi.
1752   \end{errlist}}
1753 \end{prototype}
1754
1755 La funzione serve ad installare una nuova \textsl{azione} per il segnale
1756 \param{signum}; si parla di \textsl{azione} e non di \textsl{manipolatore}
1757 come nel caso di \func{signal}, in quanto la funzione consente di specificare
1758 le varie caratteristiche della risposta al segnale, non solo la funzione del
1759 manipolatore.  Per questo lo standard raccomanda di usare sempre questa
1760 funzione al posto di \func{signal} (che in genere viene definita tramite
1761 essa), in quanto offre un controllo completo su tutti gli aspetti della
1762 gestione di un segnale, sia pure al prezzo di una maggiore complessità d'uso.
1763
1764 Se il puntatore \param{act} non è nullo, la funzione installa la nuova azione
1765 da esso specificata, se \param{oldact} non è nullo il valore dell'azione
1766 corrente viene restituito indietro.  Questo permette (specificando \param{act}
1767 nullo e \param{oldact} non nullo) di superare uno dei limiti di \func{signal},
1768 che non consente di ottenere l'azione corrente senza installarne una nuova.
1769
1770 Entrambi i puntatori fanno riferimento alla struttura \var{sigaction}, tramite
1771 la quale si specificano tutte le caratteristiche dell'azione associata ad un
1772 segnale.  Anch'essa è descritta dallo standard POSIX.1 ed in Linux è definita
1773 secondo quanto riportato in \figref{fig:sig_sigaction}. Il campo
1774 \var{sa\_restorer}, non previsto dallo standard, è obsoleto e non deve essere
1775 più usato.
1776
1777 \begin{figure}[!htb]
1778   \footnotesize \centering
1779   \begin{minipage}[c]{15cm}
1780     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
1781 struct sigaction 
1782 {
1783     void (*sa_handler)(int);
1784     void (*sa_sigaction)(int, siginfo_t *, void *);
1785     sigset_t sa_mask;
1786     int sa_flags;
1787     void (*sa_restorer)(void);
1788 }
1789     \end{lstlisting}
1790   \end{minipage} 
1791   \normalsize 
1792   \caption{La struttura \var{sigaction}.} 
1793   \label{fig:sig_sigaction}
1794 \end{figure}
1795
1796 Come si può notare da quanto riportato in \figref{fig:sig_sigaction} in Linux
1797 \func{sigaction} permette di specificare il manipolatore in due forme diverse,
1798 indicate dai campi \var{sa\_handler} e \var{sa\_sigaction}; esse devono essere
1799 usate in maniera alternativa (in certe implementazioni questi vengono
1800 specificati come \ctyp{union}): la prima è quella classica usata anche con
1801 \func{signal}, la seconda permette invece di usare un manipolatore in grado di
1802 ricevere informazioni più dettagliate dal sistema (ad esempio il tipo di
1803 errore in caso di \macro{SIGFPE}), attraverso dei parametri aggiuntivi; per i
1804 dettagli si consulti la man page di \func{sigaction}).
1805
1806 Il campo \var{sa\_mask} serve ad indicare l'insieme dei segnali che devono
1807 essere bloccati durante l'esecuzione del manipolatore, ad essi viene comunque
1808 sempre aggiunto il segnale che ne ha causato la chiamata, a meno che non si
1809 sia specificato con \var{sa\_flag} un comportamento diverso.
1810
1811 Il valore di \var{sa\_flag} permette di specificare vari aspetti del
1812 comportamento di \func{sigaction}, e della reazione del processo ai vari
1813 segnali; i valori possibili ed il relativo significato sono riportati in
1814 \tabref{tab:sig_sa_flag}. 
1815
1816 \begin{table}[htb]
1817   \footnotesize
1818   \centering
1819   \begin{tabular}[c]{|l|p{8cm}|}
1820     \hline
1821     \textbf{Valore} & \textbf{Timer} \\
1822     \hline
1823     \hline
1824     \macro{SA\_NOCLDSTOP}& Se il segnale è \macro{SIGCHLD} allora non deve
1825     essere notificato quando il processo figlio viene fermato da uno dei
1826     segnali \macro{SIGSTOP}, \macro{SIGTSTP}, \macro{SIGTTIN} or 
1827     \macro{SIGTTOU}.\\
1828     \macro{SA\_ONESHOT}  & Ristabilisce l'azione per il segnale al valore di
1829     default una volta che il manipolatore è stato lanciato, riproduce cioè il
1830     comportamento della semantica inaffidabile.\\
1831     \macro{SA\_RESETHAND}& Sinonimo di \macro{SA\_ONESHOT}. \\
1832     \macro{SA\_RESTART}  & Riavvia automaticamente le \textit{slow system
1833     call} quando vengono interrotte dal suddetto segnale; riproduce cioè il
1834     comportamento standard di BSD.\\
1835     \macro{SA\_NOMASK}   & Evita che il segnale corrente sia bloccato durante
1836     l'esecuzione del manipolatore.\\
1837     \macro{SA\_NODEFER}  & Sinonimo di  \macro{SA\_NOMASK}.\\
1838     \macro{SA\_SIGINFO}  & Deve essere specificato quando si vuole usare un
1839     manipolatore in forma estesa usando \var{sa\_sigaction} al posto di
1840     \var{sa\_handler}. \\
1841     \macro{SA\_ONSTACK}   & Stabilisce l'uso di uno stack alternativo per
1842     l'esecuzione del manipolatore (vedi \secref{sec:sig_altstack}).\\
1843     \hline
1844   \end{tabular}
1845   \caption{Valori del campo \var{sa\_flag} della struttura \var{sigaction}.}
1846   \label{tab:sig_sa_flag}
1847 \end{table}
1848
1849 Benché sia possibile usare nello stesso programma sia \func{sigaction} che
1850 \func{signal} occorre molta attenzione, in quanto le due funzioni possono
1851 interagire in maniera anomala. Infatti l'azione specificata con
1852 \var{sigaction} contiene un maggior numero di informazioni rispetto al
1853 semplice indirizzo del manipolatore restituito da \func{signal}.  Per questo
1854 motivo se si usa quest'ultima per installare un manipolatore sostituendone uno
1855 precedentemente installato con \func{sigaction}, non sarà possibile effettuare
1856 un ripristino corretto dello stesso.
1857
1858 Per questo è sempre opportuno usare \func{sigaction}, che è in grado di
1859 ripristinare correttamente un manipolatore precedente, anche se questo è stato
1860 installato con \func{signal}. In generale poi non è il caso di usare il valore
1861 di ritorno di \func{signal} come campo \var{sa\_handler}, o viceversa, dato
1862 che in certi sistemi questi possono essere diversi. In generale dunque, a meno
1863 che non si sia vincolati allo standard ISO C, è sempre il caso di evitare
1864 l'uso di \func{signal} a favore di \func{sigaction}.
1865
1866
1867
1868 \subsection{La gestione del blocco dei segnali}
1869 \label{sec:sig_sigmask}
1870
1871 Come spiegato in \secref{sec:sig_semantics} tutti i moderni sistemi unix-like
1872 permettono si bloccare temporaneamente (o di eliminare completamente, settando
1873 \macro{SIG\_IGN} come azione) la consegna dei segnali ad un processo. Questo è
1874 fatto specificando la cosiddetta \textit{signal mask} del
1875 processo\footnote{nel caso di Linux essa è mantenuta dal campo \var{blocked}
1876   della relativa \var{task\_struct}} che viene espressa come il signal set dei
1877 segnali la cui consegna è bloccata. Abbiamo accennato in
1878 \secref{sec:proc_fork} che la \textit{signal mask} viene ereditata dal padre
1879 alla creazione di un processo figlio, e abbiamo visto al paragrafo precedente
1880 che essa può essere specificata, durante l'esecuzione di un manipolatore,
1881 attraverso l'uso dal campo \var{sa\_mask} di \var{sigaction}.
1882
1883 Uno dei problemi evidenziatisi con l'esempio di 
1884
1885
1886
1887 \subsection{Le funzioni \func{sigpending} e \func{sigsuspend}}
1888 \label{sec:sig_sigpending}
1889
1890
1891
1892
1893
1894 \subsection{Funzioni rientranti e default dei segnali}
1895 \label{sec:sig_reentrant}
1896
1897
1898
1899
1900
1901 %%% Local Variables: 
1902 %%% mode: latex
1903 %%% TeX-master: "gapil"
1904 %%% End: