Una (si spera) piu` chiara esposizione dei valori di itimerspec
[gapil.git] / signal.tex
1 %% signal.tex
2 %%
3 %% Copyright (C) 2000-2012 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11
12 \chapter{I segnali}
13 \label{cha:signals}
14
15 I segnali sono il primo e più semplice meccanismo di comunicazione nei
16 confronti dei processi. Nella loro versione originale essi portano con sé
17 nessuna informazione che non sia il loro tipo; si tratta in sostanza di
18 un'interruzione software portata ad un processo.
19
20 In genere essi vengono usati dal kernel per riportare ai processi situazioni
21 eccezionali (come errori di accesso, eccezioni aritmetiche, ecc.) ma possono
22 anche essere usati come forma elementare di comunicazione fra processi (ad
23 esempio vengono usati per il controllo di sessione), per notificare eventi
24 (come la terminazione di un processo figlio), ecc.
25
26 In questo capitolo esamineremo i vari aspetti della gestione dei segnali,
27 partendo da una introduzione relativa ai concetti base con cui essi vengono
28 realizzati, per poi affrontarne la classificazione a secondo di uso e modalità
29 di generazione fino ad esaminare in dettaglio le funzioni e le metodologie di
30 gestione avanzate e le estensioni fatte all'interfaccia classica nelle nuovi
31 versioni dello standard POSIX.
32
33
34 \section{Introduzione}
35 \label{sec:sig_intro}
36
37 In questa sezione esamineremo i concetti generali relativi ai segnali, vedremo
38 le loro caratteristiche di base, introdurremo le nozioni di fondo relative
39 all'architettura del funzionamento dei segnali e alle modalità con cui il
40 sistema gestisce l'interazione fra di essi ed i processi.
41
42
43 \subsection{I concetti base}
44 \label{sec:sig_base}
45
46 Come il nome stesso indica i segnali sono usati per notificare ad un processo
47 l'occorrenza di un qualche evento. Gli eventi che possono generare un segnale
48 sono vari; un breve elenco di possibili cause per l'emissione di un segnale è
49 il seguente:
50
51 \begin{itemize*}
52 \item un errore del programma, come una divisione per zero o un tentativo di
53   accesso alla memoria fuori dai limiti validi;
54 \item la terminazione di un processo figlio;
55 \item la scadenza di un timer o di un allarme;
56 \item il tentativo di effettuare un'operazione di input/output che non può
57   essere eseguita;
58 \item una richiesta dell'utente di terminare o fermare il programma. In genere
59   si realizza attraverso un segnale mandato dalla shell in corrispondenza
60   della pressione di tasti del terminale come \code{C-c} o
61   \code{C-z};\footnote{indichiamo con \code{C-x} la pressione simultanea al
62     tasto \code{x} del tasto control (ctrl in molte tastiere).}
63 \item l'esecuzione di una \func{kill} o di una \func{raise} da parte del
64   processo stesso o di un altro (solo nel caso della \func{kill}).
65 \end{itemize*}
66
67 Ciascuno di questi eventi (compresi gli ultimi due che pure sono controllati
68 dall'utente o da un altro processo) comporta l'intervento diretto da parte del
69 kernel che causa la generazione di un particolare tipo di segnale.
70
71 Quando un processo riceve un segnale, invece del normale corso del programma,
72 viene eseguita una azione predefinita o una apposita funzione di gestione
73 (quello che da qui in avanti chiameremo il \textsl{gestore} del segnale,
74 dall'inglese \textit{signal handler}) che può essere stata specificata
75 dall'utente (nel qual caso si dice che si \textsl{intercetta} il segnale).
76
77
78 \subsection{Le \textsl{semantiche} del funzionamento dei segnali}
79 \label{sec:sig_semantics}
80
81 Negli anni il comportamento del sistema in risposta ai segnali è stato
82 modificato in vari modi nelle differenti implementazioni di Unix.  Si possono
83 individuare due tipologie fondamentali di comportamento dei segnali (dette
84 \textsl{semantiche}) che vengono chiamate rispettivamente \textsl{semantica
85   affidabile} (o \textit{reliable}) e \textsl{semantica inaffidabile} (o
86 \textit{unreliable}).
87
88 Nella \textsl{semantica inaffidabile} (quella implementata dalle prime
89 versioni di Unix) la funzione di gestione del segnale specificata dall'utente
90 non resta attiva una volta che è stata eseguita; è perciò compito dell'utente
91 stesso ripetere l'installazione all'interno del \textsl{gestore} del segnale,
92 in tutti quei casi in cui si vuole che esso resti attivo.
93
94 In questo caso è possibile una situazione in cui i segnali possono essere
95 perduti. Si consideri il segmento di codice riportato in
96 fig.~\ref{fig:sig_old_handler}, nel programma principale viene installato un
97 gestore (\texttt{\small 5}), ed in quest'ultimo la prima operazione
98 (\texttt{\small 11}) è quella di reinstallare se stesso. Se nell'esecuzione
99 del gestore un secondo segnale arriva prima che esso abbia potuto eseguire la
100 reinstallazione, verrà eseguito il comportamento predefinito assegnato al
101 segnale stesso, il che può comportare, a seconda dei casi, che il segnale
102 viene perso (se l'impostazione predefinita era quello di ignorarlo) o la
103 terminazione immediata del processo; in entrambi i casi l'azione prevista non
104 verrà eseguita.
105
106 \begin{figure}[!htbp]
107   \footnotesize \centering
108   \begin{minipage}[c]{\codesamplewidth}
109     \includecodesample{listati/unreliable_sig.c}
110   \end{minipage} 
111   \normalsize 
112   \caption{Esempio di codice di un gestore di segnale per la semantica
113     inaffidabile.} 
114   \label{fig:sig_old_handler}
115 \end{figure}
116
117 Questa è la ragione per cui l'implementazione dei segnali secondo questa
118 semantica viene chiamata \textsl{inaffidabile}; infatti la ricezione del
119 segnale e la reinstallazione del suo gestore non sono operazioni atomiche, e
120 sono sempre possibili delle \itindex{race~condition} \textit{race condition}
121 (sull'argomento vedi quanto detto in sez.~\ref{sec:proc_multi_prog}).
122
123 Un altro problema è che in questa semantica non esiste un modo per bloccare i
124 segnali quando non si vuole che arrivino; i processi possono ignorare il
125 segnale, ma non è possibile istruire il sistema a non fare nulla in occasione
126 di un segnale, pur mantenendo memoria del fatto che è avvenuto.
127
128 Nella semantica \textsl{affidabile} (quella utilizzata da Linux e da ogni Unix
129 moderno) il gestore una volta installato resta attivo e non si hanno tutti i
130 problemi precedenti. In questa semantica i segnali vengono \textsl{generati}
131 dal kernel per un processo all'occorrenza dell'evento che causa il segnale. In
132 genere questo viene fatto dal kernel impostando l'apposito campo della
133 \struct{task\_struct} del processo nella \itindex{process~table}
134 \textit{process table} (si veda fig.~\ref{fig:proc_task_struct}).
135
136 Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
137 \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre
138 per tutto il tempo che passa fra la generazione del segnale e la sua consegna
139 esso è detto \textsl{pendente} (o \textit{pending}). In genere questa
140 procedura viene effettuata dallo \itindex{scheduler} scheduler quando,
141 riprendendo l'esecuzione del processo in questione, verifica la presenza del
142 segnale nella \struct{task\_struct} e mette in esecuzione il gestore.
143
144 In questa semantica un processo ha la possibilità di bloccare la consegna dei
145 segnali, in questo caso, se l'azione per il suddetto segnale non è quella di
146 ignorarlo, il segnale resta \textsl{pendente} fintanto che il processo non lo
147 sblocca (nel qual caso viene consegnato) o imposta l'azione corrispondente per
148 ignorarlo.
149
150 Si tenga presente che il kernel stabilisce cosa fare con un segnale che è
151 stato bloccato al momento della consegna, non quando viene generato; questo
152 consente di cambiare l'azione per il segnale prima che esso venga consegnato,
153 e si può usare la funzione \func{sigpending} (vedi sez.~\ref{sec:sig_sigmask})
154 per determinare quali segnali sono bloccati e quali sono pendenti.
155
156
157 \subsection{Tipi di segnali}
158 \label{sec:sig_types}
159
160 In generale gli eventi che generano segnali si possono dividere in tre
161 categorie principali: errori, eventi esterni e richieste esplicite.
162
163 Un errore significa che un programma ha fatto qualcosa di sbagliato e non può
164 continuare ad essere eseguito. Non tutti gli errori causano dei segnali, in
165 genere le condizioni di errore più comuni comportano la restituzione di un
166 codice di errore da parte di una funzione di libreria; sono gli errori che
167 possono avvenire nella esecuzione delle istruzioni di un programma che causano
168 l'emissione di un segnale, come le divisioni per zero o l'uso di indirizzi di
169 memoria non validi.
170
171 Un evento esterno ha in genere a che fare con l'I/O o con altri processi;
172 esempi di segnali di questo tipo sono quelli legati all'arrivo di dati di
173 input, scadenze di un timer, terminazione di processi figli.
174
175 Una richiesta esplicita significa l'uso di una chiamata di sistema (come
176 \func{kill} o \func{raise}) per la generazione di un segnale, cosa che
177 viene fatta usualmente dalla shell quando l'utente invoca la sequenza di tasti
178 di stop o di suspend, ma può essere pure inserita all'interno di un programma.
179
180 Si dice poi che i segnali possono essere \textsl{asincroni} o
181 \textsl{sincroni}. Un segnale \textsl{sincrono} è legato ad una azione
182 specifica di un programma ed è inviato (a meno che non sia bloccato) durante
183 tale azione; molti errori generano segnali \textsl{sincroni}, così come la
184 richiesta esplicita da parte del processo tramite le chiamate al sistema.
185 Alcuni errori come la divisione per zero non sono completamente sincroni e
186 possono arrivare dopo qualche istruzione.
187
188 I segnali \textsl{asincroni} sono generati da eventi fuori dal controllo del
189 processo che li riceve, e arrivano in tempi impredicibili nel corso
190 dell'esecuzione del programma. Eventi esterni come la terminazione di un
191 processo figlio generano segnali \textsl{asincroni}, così come le richieste di
192 generazione di un segnale effettuate da altri processi.
193
194 In generale un tipo di segnale o è sincrono o è asincrono, salvo il caso in
195 cui esso sia generato attraverso una richiesta esplicita tramite chiamata al
196 sistema, nel qual caso qualunque tipo di segnale (quello scelto nella
197 chiamata) può diventare sincrono o asincrono a seconda che sia generato
198 internamente o esternamente al processo.
199
200
201 \subsection{La notifica dei segnali}
202 \label{sec:sig_notification}
203
204 Come accennato quando un segnale viene generato, se la sua azione predefinita
205 non è quella di essere ignorato, il kernel prende nota del fatto nella
206 \struct{task\_struct} del processo; si dice così che il segnale diventa
207 \textsl{pendente} (o \textit{pending}), e rimane tale fino al momento in cui
208 verrà notificato al processo (o verrà specificata come azione quella di
209 ignorarlo).
210
211 Normalmente l'invio al processo che deve ricevere il segnale è immediato ed
212 avviene non appena questo viene rimesso in esecuzione dallo
213 \itindex{scheduler} scheduler che esegue l'azione specificata. Questo a meno
214 che il segnale in questione non sia stato bloccato prima della notifica, nel
215 qual caso l'invio non avviene ed il segnale resta \textsl{pendente}
216 indefinitamente. Quando lo si sblocca il segnale \textsl{pendente} sarà subito
217 notificato. Si tenga presente però che i segnali \textsl{pendenti} non si
218 accodano, alla generazione infatti il kernel marca un flag nella
219 \struct{task\_struct} del processo, per cui se prima della notifica ne vengono
220 generati altri il flag è comunque marcato, ed il gestore viene eseguito sempre
221 una sola volta.
222
223 Si ricordi però che se l'azione specificata per un segnale è quella di essere
224 ignorato questo sarà scartato immediatamente al momento della sua generazione,
225 e questo anche se in quel momento il segnale è bloccato (perché bloccare su un
226 segnale significa bloccarne la notifica). Per questo motivo un segnale,
227 fintanto che viene ignorato, non sarà mai notificato, anche se prima è stato
228 bloccato ed in seguito si è specificata una azione diversa (nel qual caso solo
229 i segnali successivi alla nuova specificazione saranno notificati).
230
231 Una volta che un segnale viene notificato (che questo avvenga subito o dopo
232 una attesa più o meno lunga) viene eseguita l'azione specificata per il
233 segnale. Per alcuni segnali (\signal{SIGKILL} e \signal{SIGSTOP}) questa azione
234 è fissa e non può essere cambiata, ma per tutti gli altri si può selezionare
235 una  delle tre possibilità seguenti:
236
237 \begin{itemize*}
238 \item ignorare il segnale;
239 \item catturare il segnale, ed utilizzare il gestore specificato;
240 \item accettare l'azione predefinita per quel segnale.
241 \end{itemize*}
242
243 Un programma può specificare queste scelte usando le due funzioni
244 \func{signal} e \func{sigaction} (vedi sez.~\ref{sec:sig_signal} e
245 sez.~\ref{sec:sig_sigaction}). Se si è installato un gestore sarà quest'ultimo
246 ad essere eseguito alla notifica del segnale.  Inoltre il sistema farà si che
247 mentre viene eseguito il gestore di un segnale, quest'ultimo venga
248 automaticamente bloccato (così si possono evitare \itindex{race~condition}
249 \textit{race condition}).
250
251 Nel caso non sia stata specificata un'azione, viene utilizzata l'azione
252 standard che (come vedremo in sez.~\ref{sec:sig_standard}) è propria di ciascun
253 segnale; nella maggior parte dei casi essa porta alla terminazione del
254 processo, ma alcuni segnali che rappresentano eventi innocui vengono ignorati.
255
256 Quando un segnale termina un processo, il padre può determinare la causa della
257 terminazione esaminando il codice di stato riportato dalle funzioni
258 \func{wait} e \func{waitpid} (vedi sez.~\ref{sec:proc_wait}); questo è il modo
259 in cui la shell determina i motivi della terminazione di un programma e scrive
260 un eventuale messaggio di errore.
261
262 I segnali che rappresentano errori del programma (divisione per zero o
263 violazioni di accesso) hanno anche la caratteristica di scrivere un file di
264 \itindex{core~dump} \textit{core dump} che registra lo stato del processo (ed
265 in particolare della memoria e dello \itindex{stack} \textit{stack}) prima
266 della terminazione.  Questo può essere esaminato in seguito con un debugger
267 per investigare sulla causa dell'errore.  Lo stesso avviene se i suddetti
268 segnali vengono generati con una \func{kill}.
269
270
271 \section{La classificazione dei segnali}
272 \label{sec:sig_classification}
273
274 Esamineremo in questa sezione quali sono i vari segnali definiti nel sistema,
275 le loro caratteristiche e tipologia, le varie macro e costanti che permettono
276 di identificarli, e le funzioni che ne stampano la descrizione.
277
278
279 \subsection{I segnali standard}
280 \label{sec:sig_standard}
281
282 Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso
283 diretto di questo numero da parte dei programmi è da evitare, in quanto esso
284 può variare a seconda dell'implementazione del sistema, e nel caso di Linux,
285 anche a seconda dell'architettura hardware.  Per questo motivo ad ogni segnale
286 viene associato un nome, definendo con una macro di preprocessore una costante
287 uguale al suddetto numero. Sono questi nomi, che sono standardizzati e
288 sostanzialmente uniformi rispetto alle varie implementazioni, che si devono
289 usare nei programmi. Tutti i nomi e le funzioni che concernono i segnali sono
290 definiti nell'header di sistema \headfile{signal.h}.
291
292 Il numero totale di segnali presenti è dato dalla macro \const{NSIG}, e dato
293 che i numeri dei segnali sono allocati progressivamente, essa corrisponde
294 anche al successivo del valore numerico assegnato all'ultimo segnale definito.
295 In tab.~\ref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali
296 definiti in Linux (estratto dalle pagine di manuale), comparati con quelli
297 definiti in vari standard.
298
299 \begin{table}[htb]
300   \footnotesize
301   \centering
302   \begin{tabular}[c]{|c|p{8cm}|}
303     \hline
304     \textbf{Sigla} & \textbf{Significato} \\
305     \hline
306     \hline
307     A & L'azione predefinita è terminare il processo.\\
308     B & L'azione predefinita è ignorare il segnale.\\
309     C & L'azione predefinita è terminare il processo e scrivere un 
310         \itindex{core~dump} \textit{core dump}.\\
311     D & L'azione predefinita è fermare il processo.\\
312     E & Il segnale non può essere intercettato.\\
313     F & Il segnale non può essere ignorato.\\
314     \hline
315   \end{tabular}
316   \caption{Legenda delle azioni predefinite dei segnali riportate in 
317     tab.~\ref{tab:sig_signal_list}.}
318   \label{tab:sig_action_leg}
319 \end{table}
320
321 In tab.~\ref{tab:sig_signal_list} si sono anche riportate le azioni predefinite
322 di ciascun segnale (riassunte con delle lettere, la cui legenda completa è in
323 tab.~\ref{tab:sig_action_leg}), quando nessun gestore è installato un
324 segnale può essere ignorato o causare la terminazione del processo. Nella
325 colonna standard sono stati indicati anche gli standard in cui ciascun segnale
326 è definito, secondo lo schema di tab.~\ref{tab:sig_standard_leg}.
327
328
329 \begin{table}[htb]
330   \footnotesize
331   \centering
332   \begin{tabular}[c]{|c|l|}
333     \hline
334     \textbf{Sigla} & \textbf{Standard} \\
335     \hline
336     \hline
337     P & POSIX \\
338     B & BSD \\
339     L & Linux \\
340     S & SUSv2 \\
341     \hline
342   \end{tabular}
343   \caption{Legenda dei valori della colonna \textbf{Standard} di 
344     tab.~\ref{tab:sig_signal_list}.}
345   \label{tab:sig_standard_leg}
346 \end{table}
347
348 In alcuni casi alla terminazione del processo è associata la creazione di un
349 file (posto nella directory corrente del processo e chiamato \file{core}) su
350 cui viene salvata un'immagine della memoria del processo (il cosiddetto
351 \itindex{core~dump} \textit{core dump}), che può essere usata da un debugger
352 per esaminare lo stato dello \itindex{stack} \textit{stack} e delle variabili
353 al momento della ricezione del segnale.
354
355 \begin{table}[!htb]
356   \footnotesize
357   \centering
358   \begin{tabular}[c]{|l|c|c|l|}
359     \hline
360     \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
361     \hline
362     \hline
363     \signal{SIGHUP}  &PL & A & Hangup o terminazione del processo di 
364                                controllo.                                    \\
365     \signal{SIGINT}  &PL & A & Interrupt da tastiera (\cmd{C-c}).            \\
366     \signal{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}).                 \\
367     \signal{SIGILL}  &PL & C & Istruzione illecita.                          \\
368     \signal{SIGABRT} &PL & C & Segnale di abort da \func{abort}.             \\
369     \signal{SIGFPE}  &PL & C & Errore aritmetico.                            \\
370     \signal{SIGKILL} &PL &AEF& Segnale di terminazione forzata.              \\
371     \signal{SIGSEGV} &PL & C & Errore di accesso in memoria.                 \\
372     \signal{SIGPIPE} &PL & A & Pipe spezzata.                                \\
373     \signal{SIGALRM} &PL & A & Segnale del timer da \func{alarm}.            \\
374     \signal{SIGTERM} &PL & A & Segnale di terminazione \texttt{C-\bslash}.   \\
375     \signal{SIGUSR1} &PL & A & Segnale utente numero 1.                      \\
376     \signal{SIGUSR2} &PL & A & Segnale utente numero 2.                      \\
377     \signal{SIGCHLD} &PL & B & Figlio terminato o fermato.                   \\
378     \signal{SIGCONT} &PL &   & Continua se fermato.                          \\
379     \signal{SIGSTOP} &PL &DEF& Ferma il processo.                            \\
380     \signal{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale.    \\
381     \signal{SIGTTIN} &PL & D & Input sul terminale per un processo 
382                                in background.                                \\
383     \signal{SIGTTOU} &PL & D & Output sul terminale per un processo          
384                                in background.                                \\
385     \signal{SIGBUS}  &SL & C & Errore sul bus (bad memory access).           \\
386     \signal{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V);  
387                                Sinonimo di \signal{SIGIO}.                   \\
388     \signal{SIGPROF} &SL & A & Timer del profiling scaduto.                  \\
389     \signal{SIGSYS}  &SL & C & Argomento sbagliato per una subroutine (SVID).\\
390     \signal{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint.             \\
391     \signal{SIGURG}  &SLB& B & Ricezione di una \textit{urgent condition} su 
392                                un socket. \\
393     \signal{SIGVTALRM}&SLB& A & Timer di esecuzione scaduto.                 \\
394     \signal{SIGXCPU}  &SLB& C & Ecceduto il limite sul tempo di CPU.         \\
395     \signal{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file.\\
396     \signal{SIGIOT}   &L  & C & IOT trap. Sinonimo di \signal{SIGABRT}.      \\
397     \signal{SIGEMT}   &L  &   &                                              \\
398 % TODO che roba e` SIGEMT
399     \signal{SIGSTKFLT}&L  & A & Errore sullo stack del coprocessore.         \\
400     \signal{SIGIO}    &LB & A & L'I/O è possibile (4.2 BSD).                 \\
401     \signal{SIGCLD}   &L  &   & Sinonimo di \signal{SIGCHLD}.                \\
402     \signal{SIGPWR}   &L  & A & Fallimento dell'alimentazione.               \\
403     \signal{SIGINFO}  &L  &   & Sinonimo di \signal{SIGPWR}.                 \\
404     \signal{SIGLOST}  &L  & A & Perso un lock sul file (per NFS).            \\
405     \signal{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun).      \\
406     \signal{SIGUNUSED}&L  & A & Segnale inutilizzato (diventerà 
407                                \signal{SIGSYS}).                             \\
408     \hline
409   \end{tabular}
410   \caption{Lista dei segnali in Linux.}
411   \label{tab:sig_signal_list}
412 \end{table}
413
414 La descrizione dettagliata del significato dei vari segnali, raggruppati per
415 tipologia, verrà affrontata nei paragrafi successivi.
416
417
418 \subsection{Segnali di errore di programma}
419 \label{sec:sig_prog_error}
420
421 Questi segnali sono generati quando il sistema, o in certi casi direttamente
422 l'hardware (come per i \itindex{page~fault} \textit{page fault} non validi)
423 rileva un qualche errore insanabile nel programma in esecuzione. In generale
424 la generazione di questi segnali significa che il programma ha dei gravi
425 problemi (ad esempio ha dereferenziato un puntatore non valido o ha eseguito
426 una operazione aritmetica proibita) e l'esecuzione non può essere proseguita.
427
428 In genere si intercettano questi segnali per permettere al programma di
429 terminare in maniera pulita, ad esempio per ripristinare le impostazioni della
430 console o eliminare i \index{file!di lock} file di lock prima dell'uscita.  In
431 questo caso il gestore deve concludersi ripristinando l'azione predefinita e
432 rialzando il segnale, in questo modo il programma si concluderà senza effetti
433 spiacevoli, ma riportando lo stesso stato di uscita che avrebbe avuto se il
434 gestore non ci fosse stato.
435
436 L'azione predefinita per tutti questi segnali è causare la terminazione del
437 processo che li ha causati. In genere oltre a questo il segnale provoca pure
438 la registrazione su disco di un file di \itindex{core~dump} \textit{core dump}
439 che viene scritto in un file \file{core} nella directory corrente del processo
440 al momento dell'errore, che il debugger può usare per ricostruire lo stato del
441 programma al momento della terminazione.  Questi segnali sono:
442 \begin{basedescript}{\desclabelwidth{2.0cm}}
443 \item[\signal{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
444   derivi da \textit{floating point exception} si applica a tutti gli errori
445   aritmetici compresa la divisione per zero e l'overflow.  Se il gestore
446   ritorna il comportamento del processo è indefinito, ed ignorare questo
447   segnale può condurre ad un ciclo infinito.
448
449 %   Per questo segnale le cose sono complicate dal fatto che possono esserci
450 %   molte diverse eccezioni che \signal{SIGFPE} non distingue, mentre lo
451 %   standard IEEE per le operazioni in virgola mobile definisce varie eccezioni
452 %   aritmetiche e richiede che esse siano notificate.
453 % TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni 
454   
455 \item[\signal{SIGILL}] Il nome deriva da \textit{illegal instruction},
456   significa che il programma sta cercando di eseguire una istruzione
457   privilegiata o inesistente, in generale del codice illecito. Poiché il
458   compilatore del C genera del codice valido si ottiene questo segnale se il
459   file eseguibile è corrotto o si stanno cercando di eseguire dei dati.
460   Quest'ultimo caso può accadere quando si passa un puntatore sbagliato al
461   posto di un puntatore a funzione, o si eccede la scrittura di un vettore di
462   una variabile locale, andando a corrompere lo \itindex{stack}
463   \textit{stack}. Lo stesso segnale viene generato in caso di overflow dello
464   \itindex{stack} \textit{stack} o di problemi nell'esecuzione di un gestore.
465   Se il gestore ritorna il comportamento del processo è indefinito.
466 \item[\signal{SIGSEGV}] Il nome deriva da \itindex{segment~violation}
467   \textit{segment violation}, e significa che il programma sta cercando di
468   leggere o scrivere in una zona di memoria protetta al di fuori di quella che
469   gli è stata riservata dal sistema. In genere è il meccanismo della
470   protezione della memoria che si accorge dell'errore ed il kernel genera il
471   segnale.  Se il gestore ritorna il comportamento del processo è indefinito.
472
473   È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
474   inizializzato leggendo al di là della fine di un vettore. 
475 \item[\signal{SIGBUS}] Il nome deriva da \textit{bus error}. Come
476   \signal{SIGSEGV} questo è un segnale che viene generato di solito quando si
477   dereferenzia un puntatore non inizializzato, la differenza è che
478   \signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
479   (tipo fuori dallo heap o dallo \itindex{stack} \textit{stack}), mentre
480   \signal{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso di
481   un puntatore non allineato.
482 \item[\signal{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica che
483   il programma stesso ha rilevato un errore che viene riportato chiamando la
484   funzione \func{abort} che genera questo segnale.
485 \item[\signal{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
486   dall'attivazione del tracciamento per il processo. È usato dai programmi per
487   il debugging e un programma normale non dovrebbe ricevere questo segnale.
488 \item[\signal{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
489   richiede l'esecuzione di una system call, ma si è fornito un codice
490   sbagliato per quest'ultima.
491 \end{basedescript}
492
493
494 \subsection{I segnali di terminazione}
495 \label{sec:sig_termination}
496
497 Questo tipo di segnali sono usati per terminare un processo; hanno vari nomi a
498 causa del differente uso che se ne può fare, ed i programmi possono
499 trattarli in maniera differente. 
500
501 La ragione per cui può essere necessario trattare questi segnali è che il
502 programma può dover eseguire una serie di azioni di pulizia prima di
503 terminare, come salvare informazioni sullo stato in cui si trova, cancellare
504 file temporanei, o ripristinare delle condizioni alterate durante il
505 funzionamento (come il modo del terminale o le impostazioni di una qualche
506 periferica).
507
508 L'azione predefinita di questi segnali è di terminare il processo, questi
509 segnali sono:
510 \begin{basedescript}{\desclabelwidth{2.0cm}}
511 \item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
512   generico usato per causare la conclusione di un programma. Al contrario di
513   \signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
514   usa per chiedere in maniera ``\textsl{educata}'' ad un processo di
515   concludersi.
516
517 \item[\signal{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
518   interruzione per il programma. È quello che viene generato di default dal
519   comando \cmd{kill} o dall'invio sul terminale del carattere di controllo
520   INTR (interrupt, generato dalla sequenza \cmd{C-c}).
521
522 \item[\signal{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
523   controllato da un altro carattere di controllo, QUIT, corrispondente alla
524   sequenza \texttt{C-\bslash}. A differenza del precedente l'azione
525   predefinita, oltre alla terminazione del processo, comporta anche la
526   creazione di un \itindex{core~dump} \textit{core dump}.
527
528   In genere lo si può pensare come corrispondente ad una condizione di errore
529   del programma rilevata dall'utente. Per questo motivo non è opportuno fare
530   eseguire al gestore di questo segnale le operazioni di pulizia normalmente
531   previste (tipo la cancellazione di file temporanei), dato che in certi casi
532   esse possono eliminare informazioni utili nell'esame dei \itindex{core~dump}
533   \textit{core dump}.
534   
535
536 \item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
537   qualunque programma. Questo segnale non può essere né intercettato, né
538   ignorato, né bloccato, per cui causa comunque la terminazione del processo.
539   In genere esso viene generato solo per richiesta esplicita dell'utente dal
540   comando (o tramite la funzione) \cmd{kill}. Dato che non lo si può
541   intercettare è sempre meglio usarlo come ultima risorsa quando metodi meno
542   brutali, come \signal{SIGTERM} o \cmd{C-c} non funzionano. 
543
544   Se un processo non risponde a nessun altro segnale \signal{SIGKILL} ne causa
545   sempre la terminazione (in effetti il fallimento della terminazione di un
546   processo da parte di \signal{SIGKILL} costituirebbe un malfunzionamento del
547   kernel). Talvolta è il sistema stesso che può generare questo segnale quando
548   per condizioni particolari il processo non può più essere eseguito neanche
549   per eseguire un gestore.
550
551 \item[\signal{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
552   terminale dell'utente si è disconnesso (ad esempio perché si è interrotta la
553   rete). Viene usato anche per riportare la terminazione del processo di
554   controllo di un terminale a tutti i processi della sessione, in modo che
555   essi possano disconnettersi dal relativo terminale. 
556   
557   Viene inoltre usato in genere per segnalare ai demoni (che non hanno un
558   terminale di controllo) la necessità di reinizializzarsi e rileggere il/i
559   file di configurazione.
560 \end{basedescript}
561
562
563 \subsection{I segnali di allarme}
564 \label{sec:sig_alarm}
565
566 Questi segnali sono generati dalla scadenza di un timer (vedi
567 sez.~\ref{sec:sig_alarm_abort}). Il loro comportamento predefinito è quello di
568 causare la terminazione del programma, ma con questi segnali la scelta
569 predefinita è irrilevante, in quanto il loro uso presuppone sempre la
570 necessità di un gestore.  Questi segnali sono:
571 \begin{basedescript}{\desclabelwidth{2.0cm}}
572 \item[\signal{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
573   un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
574   usato dalla funzione \func{alarm}.
575
576 \item[\const{SIVGTALRM}] 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
580 \item[\signal{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
581   di un timer che misura sia il tempo di CPU speso direttamente dal processo
582   che quello che il sistema ha speso per conto di quest'ultimo. In genere
583   viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
584   del tempo di CPU da parte del processo.
585 \end{basedescript}
586
587
588 \subsection{I segnali di I/O asincrono}
589 \label{sec:sig_asyncio}
590
591 Questi segnali operano in congiunzione con le funzioni di I/O asincrono. Per
592 questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a
593 generare questi segnali.  L'azione predefinita è di essere ignorati. Questi
594 segnali sono:
595 \begin{basedescript}{\desclabelwidth{2.0cm}}
596 \item[\signal{SIGIO}] Questo segnale viene inviato quando un file descriptor è
597   pronto per eseguire dell'input/output. In molti sistemi solo i
598   socket e i terminali possono generare questo segnale, in Linux
599   questo può essere usato anche per i file, posto che la \func{fcntl} abbia
600   avuto successo.
601
602 \item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati
603   urgenti o \itindex{out-of-band} \textit{out-of-band} su di un
604   socket; per maggiori dettagli al proposito si veda
605   sez.~\ref{sec:TCP_urgent_data}.
606
607 \item[\signal{SIGPOLL}] Questo segnale è equivalente a \signal{SIGIO}, è
608   definito solo per compatibilità con i sistemi System V.
609 \end{basedescript}
610
611
612 \subsection{I segnali per il controllo di sessione}
613 \label{sec:sig_job_control}
614
615 Questi sono i segnali usati dal controllo delle sessioni e dei processi, il
616 loro uso è specializzato e viene trattato in maniera specifica nelle sezioni
617 in cui si trattano gli argomenti relativi.  Questi segnali sono:
618 \begin{basedescript}{\desclabelwidth{2.0cm}}
619 \item[\signal{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
620   figlio termina o viene fermato. L'azione predefinita è di ignorare il
621   segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
622
623 \item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al
624   precedente, il nome è obsoleto e andrebbe evitato. 
625
626 \item[\signal{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
627   usato per fare ripartire un programma precedentemente fermato da
628   \signal{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
629   ripartire il processo prima della sua consegna. Il comportamento predefinito
630   è di fare solo questo; il segnale non può essere bloccato. Si può anche
631   installare un gestore, ma il segnale provoca comunque il riavvio del
632   processo.
633   
634   La maggior pare dei programmi non hanno necessità di intercettare il
635   segnale, in quanto esso è completamente trasparente rispetto all'esecuzione
636   che riparte senza che il programma noti niente. Si possono installare dei
637   gestori per far si che un programma produca una qualche azione speciale
638   se viene fermato e riavviato, come per esempio riscrivere un prompt, o
639   inviare un avviso. 
640 \item[\signal{SIGSTOP}] Il segnale ferma un processo (lo porta cioè in uno
641   stato di sleep, vedi sez.~\ref{sec:proc_sched}); il segnale non può essere né
642   intercettato, né ignorato, né bloccato.
643
644 \item[\signal{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
645   ferma il processo interattivamente, ed è generato dal carattere SUSP
646   (prodotto dalla combinazione \cmd{C-z}), ed al contrario di
647   \signal{SIGSTOP} può essere intercettato e ignorato. In genere un programma
648   installa un gestore per questo segnale quando vuole lasciare il sistema
649   o il terminale in uno stato definito prima di fermarsi; se per esempio un
650   programma ha disabilitato l'eco sul terminale può installare un gestore
651   per riabilitarlo prima di fermarsi.
652
653 \item[\signal{SIGTTIN}] Un processo non può leggere dal terminale se esegue una
654   sessione di lavoro in \textit{background}. Quando un processo in background
655   tenta di leggere da un terminale viene inviato questo segnale a tutti i
656   processi della sessione di lavoro. L'azione predefinita è di fermare il
657   processo.  L'argomento è trattato in
658   sez.~\ref{sec:sess_job_control_overview}.
659
660 \item[\signal{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
661   generato quando si tenta di scrivere o modificare uno dei modi del
662   terminale. L'azione predefinita è di fermare il processo, l'argomento è
663   trattato in sez.~\ref{sec:sess_job_control_overview}.
664 \end{basedescript}
665
666
667 \subsection{I segnali di operazioni errate}
668 \label{sec:sig_oper_error}
669
670 Questi segnali sono usati per riportare al programma errori generati da
671 operazioni da lui eseguite; non indicano errori del programma quanto errori
672 che impediscono il completamento dell'esecuzione dovute all'interazione con il
673 resto del sistema.  L'azione predefinita di questi segnali è di terminare il
674 processo, questi segnali sono:
675 \begin{basedescript}{\desclabelwidth{2.0cm}}
676 \item[\signal{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle pipe,
677   (o delle FIFO o dei socket) è necessario, prima che un processo inizi a
678   scrivere su una di esse, che un altro l'abbia aperta in lettura (si veda
679   sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
680   terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
681   segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
682   lo ha causato fallisce, restituendo l'errore \errcode{EPIPE}.
683 \item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
684   segnale che viene generato quando si perde un advisory lock su un file su
685   NFS perché il server NFS è stato riavviato. Il progetto GNU lo utilizza per
686   indicare ad un client il crollo inaspettato di un server. In Linux è
687   definito come sinonimo di \signal{SIGIO}.\footnote{ed è segnalato come BUG
688     nella pagina di manuale.}
689 \item[\signal{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
690   segnale è generato quando un processo eccede il limite impostato per il
691   tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}. 
692 \item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
693   segnale è generato quando un processo tenta di estendere un file oltre le
694   dimensioni specificate dal limite impostato per le dimensioni massime di un
695   file, vedi sez.~\ref{sec:sys_resource_limit}. 
696 \end{basedescript}
697
698
699 \subsection{Ulteriori segnali}
700 \label{sec:sig_misc_sig}
701
702 Raccogliamo qui infine una serie di segnali che hanno scopi differenti non
703 classificabili in maniera omogenea. Questi segnali sono:
704 \begin{basedescript}{\desclabelwidth{2.0cm}}
705 \item[\signal{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
706   dell'utente che lo può usare per quello che vuole. Viene generato solo
707   attraverso l'invocazione della funzione \func{kill}. Entrambi i segnali
708   possono essere utili per implementare una comunicazione elementare fra
709   processi diversi, o per eseguire a richiesta una operazione utilizzando un
710   gestore. L'azione predefinita è di terminare il processo.
711 \item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Vedi
712   quanto appena detto per \signal{SIGUSR1}.
713 \item[\signal{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
714   generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
715   righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
716   programmi testuali per riformattare l'uscita su schermo quando si cambia
717   dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
718 \item[\signal{SIGINFO}] Il segnale indica una richiesta di informazioni. È
719   usato con il controllo di sessione, causa la stampa di informazioni da parte
720   del processo leader del gruppo associato al terminale di controllo, gli
721   altri processi lo ignorano.
722 \end{basedescript}
723
724
725 \subsection{Le funzioni \func{strsignal} e \func{psignal}}
726 \label{sec:sig_strsignal}
727
728 Per la descrizione dei segnali il sistema mette a disposizione due funzioni
729 che stampano un messaggio di descrizione dato il numero. In genere si usano
730 quando si vuole notificare all'utente il segnale ricevuto (nel caso di
731 terminazione di un processo figlio o di un gestore che gestisce più segnali);
732 la prima funzione, \funcd{strsignal}, è una estensione GNU, accessibile avendo
733 definito \macro{\_GNU\_SOURCE}, ed è analoga alla funzione \func{strerror} (si
734 veda sez.~\ref{sec:sys_strerror}) per gli errori:
735 \begin{prototype}{string.h}{char *strsignal(int signum)} 
736   Ritorna il puntatore ad una stringa che contiene la descrizione del segnale
737   \param{signum}.
738 \end{prototype}
739 \noindent dato che la stringa è allocata staticamente non se ne deve
740 modificare il contenuto, che resta valido solo fino alla successiva chiamata
741 di \func{strsignal}. Nel caso si debba mantenere traccia del messaggio sarà
742 necessario copiarlo.
743
744 La seconda funzione, \funcd{psignal}, deriva da BSD ed è analoga alla funzione
745 \func{perror} descritta sempre in sez.~\ref{sec:sys_strerror}; il suo prototipo
746 è:
747 \begin{prototype}{signal.h}{void psignal(int sig, const char *s)} 
748   Stampa sullo standard error un messaggio costituito dalla stringa \param{s},
749   seguita da due punti ed una descrizione del segnale indicato da \param{sig}.
750 \end{prototype}
751
752 Una modalità alternativa per utilizzare le descrizioni restituite da
753 \func{strsignal} e \func{psignal} è quello di usare la variabile
754 \var{sys\_siglist}, che è definita in \headfile{signal.h} e può essere
755 acceduta con la dichiarazione:
756 \includecodesnip{listati/siglist.c}
757
758 L'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione,
759 indicizzate per numero di segnale, per cui una chiamata del tipo di \code{char
760   *decr = strsignal(SIGINT)} può essere sostituita dall'equivalente \code{char
761   *decr = sys\_siglist[SIGINT]}.
762
763
764
765 \section{La gestione di base dei segnali}
766 \label{sec:sig_management}
767
768 I segnali sono il primo e più classico esempio di eventi asincroni, cioè di
769 eventi che possono accadere in un qualunque momento durante l'esecuzione di un
770 programma. Per questa loro caratteristica la loro gestione non può essere
771 effettuata all'interno del normale flusso di esecuzione dello stesso, ma è
772 delegata appunto agli eventuali gestori che si sono installati.
773
774 In questa sezione vedremo come si effettua la gestione dei segnali, a partire
775 dalla loro interazione con le system call, passando per le varie funzioni che
776 permettono di installare i gestori e controllare le reazioni di un processo
777 alla loro occorrenza.
778
779
780 \subsection{Il comportamento generale del sistema}
781 \label{sec:sig_gen_beha}
782
783 Abbiamo già trattato in sez.~\ref{sec:sig_intro} le modalità con cui il sistema
784 gestisce l'interazione fra segnali e processi, ci resta da esaminare però il
785 comportamento delle system call; in particolare due di esse, \func{fork} ed
786 \func{exec}, dovranno essere prese esplicitamente in considerazione, data la
787 loro stretta relazione con la creazione di nuovi processi.
788
789 Come accennato in sez.~\ref{sec:proc_fork} quando viene creato un nuovo
790 processo esso eredita dal padre sia le azioni che sono state impostate per i
791 singoli segnali, che la maschera dei segnali bloccati (vedi
792 sez.~\ref{sec:sig_sigmask}).  Invece tutti i segnali pendenti e gli allarmi
793 vengono cancellati; essi infatti devono essere recapitati solo al padre, al
794 figlio dovranno arrivare solo i segnali dovuti alle sue azioni.
795
796 Quando si mette in esecuzione un nuovo programma con \func{exec} (si ricordi
797 quanto detto in sez.~\ref{sec:proc_exec}) tutti i segnali per i quali è stato
798 installato un gestore vengono reimpostati a \const{SIG\_DFL}. Non ha più
799 senso infatti fare riferimento a funzioni definite nel programma originario,
800 che non sono presenti nello spazio di indirizzi del nuovo programma.
801
802 Si noti che questo vale solo per le azioni per le quali è stato installato un
803 gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a
804 \const{SIG\_IGN}. Questo permette ad esempio alla shell di impostare ad
805 \const{SIG\_IGN} le risposte per \signal{SIGINT} e \signal{SIGQUIT} per i
806 programmi eseguiti in background, che altrimenti sarebbero interrotti da una
807 successiva pressione di \texttt{C-c} o \texttt{C-y}.
808
809 Per quanto riguarda il comportamento di tutte le altre \textit{system call} si
810 danno sostanzialmente due casi, a seconda che esse siano
811 \index{system~call~lente} \textsl{lente} (\textit{slow}) o \textsl{veloci}
812 (\textit{fast}). La gran parte di esse appartiene a quest'ultima categoria,
813 che non è influenzata dall'arrivo di un segnale. Esse sono dette
814 \textsl{veloci} in quanto la loro esecuzione è sostanzialmente immediata; la
815 risposta al segnale viene sempre data dopo che la \textit{system call} è stata
816 completata, in quanto attendere per eseguire un gestore non comporta nessun
817 inconveniente.
818
819 In alcuni casi però alcune system call (che per questo motivo vengono chiamate
820 \textsl{lente}) possono bloccarsi indefinitamente. In questo caso non si può
821 attendere la conclusione della system call, perché questo renderebbe
822 impossibile una risposta pronta al segnale, per cui il gestore viene
823 eseguito prima che la system call sia ritornata.  Un elenco dei casi in cui si
824 presenta questa situazione è il seguente:
825 \begin{itemize*}
826 \item la lettura da file che possono bloccarsi in attesa di dati non ancora
827   presenti (come per certi \index{file!di~dispositivo} file di dispositivo, i
828   socket o le pipe);
829 \item la scrittura sugli stessi file, nel caso in cui dati non possano essere
830   accettati immediatamente (di nuovo comune per i socket);
831 \item l'apertura di un file di dispositivo che richiede operazioni non
832   immediate per una risposta (ad esempio l'apertura di un nastro che deve
833   essere riavvolto);
834 \item le operazioni eseguite con \func{ioctl} che non è detto possano essere
835   eseguite immediatamente;
836 \item le funzioni di intercomunicazione che si bloccano in attesa di risposte
837   da altri processi;
838 \item la funzione \func{pause} (usata appunto per attendere l'arrivo di un
839   segnale);
840 \item la funzione \func{wait} (se nessun processo figlio è ancora terminato).
841 \end{itemize*}
842
843 In questo caso si pone il problema di cosa fare una volta che il gestore sia
844 ritornato. La scelta originaria dei primi Unix era quella di far ritornare
845 anche la system call restituendo l'errore di \errcode{EINTR}. Questa è a
846 tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
847 gestori controllino lo stato di uscita delle funzioni che eseguono una system
848 call lenta per ripeterne la chiamata qualora l'errore fosse questo.
849
850 Dimenticarsi di richiamare una system call interrotta da un segnale è un
851 errore comune, tanto che le \acr{glibc} provvedono una macro
852 \code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente,
853 ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato
854 non è diverso dall'uscita con un errore \errcode{EINTR}.
855
856 La soluzione è comunque poco elegante e BSD ha scelto un approccio molto
857 diverso, che è quello di fare ripartire automaticamente una system call
858 interrotta invece di farla fallire. In questo caso ovviamente non c'è bisogno
859 di preoccuparsi di controllare il codice di errore; si perde però la
860 possibilità di eseguire azioni specifiche all'occorrenza di questa particolare
861 condizione.
862
863 Linux e le \acr{glibc} consentono di utilizzare entrambi gli approcci,
864 attraverso una opportuna opzione di \func{sigaction} (vedi
865 sez.~\ref{sec:sig_sigaction}). È da chiarire comunque che nel caso di
866 interruzione nel mezzo di un trasferimento parziale di dati, le system call
867 ritornano sempre indicando i byte trasferiti.
868
869 % TODO: alcune syscall danno EINTR anche se il segnale è installato con
870 % SA_RESTART, vedi signal(7)
871
872
873 \subsection{La funzione \func{signal}}
874 \label{sec:sig_signal}
875
876 L'interfaccia più semplice per la gestione dei segnali è costituita dalla
877 funzione \funcd{signal} che è definita fin dallo standard ANSI C.
878 Quest'ultimo però non considera sistemi multitasking, per cui la definizione è
879 tanto vaga da essere del tutto inutile in un sistema Unix; è questo il motivo
880 per cui ogni implementazione successiva ne ha modificato e ridefinito il
881 comportamento, pur mantenendone immutato il prototipo\footnote{in realtà in
882   alcune vecchie implementazioni (SVr4 e 4.3+BSD in particolare) vengono usati
883   alcuni argomenti aggiuntivi per definire il comportamento della funzione,
884   vedremo in sez.~\ref{sec:sig_sigaction} che questo è possibile usando la
885   funzione \func{sigaction}.}  che è:
886 \begin{prototype}{signal.h}
887   {sighandler\_t signal(int signum, sighandler\_t handler)} 
888   
889   Installa la funzione di gestione \param{handler} (il gestore) per il
890   segnale \param{signum}.
891   
892   \bodydesc{La funzione ritorna il precedente gestore in caso di successo
893     o \const{SIG\_ERR} in caso di errore.}
894 \end{prototype}
895
896 In questa definizione si è usato un tipo di dato, \type{sighandler\_t}, che è
897 una estensione GNU, definita dalle \acr{glibc}, che permette di riscrivere il
898 prototipo di \func{signal} nella forma appena vista, molto più leggibile di
899 quanto non sia la versione originaria, che di norma è definita come:
900 \includecodesnip{listati/signal.c}
901 questa infatti, per la poca chiarezza della sintassi del C quando si vanno a
902 trattare puntatori a funzioni, è molto meno comprensibile.  Da un confronto
903 con il precedente prototipo si può dedurre la definizione di
904 \type{sighandler\_t} che è:
905 \includecodesnip{listati/sighandler_t.c}
906 e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno)
907 e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le
908   parentesi intorno al nome della funzione per via delle precedenze degli
909   operatori del C, senza di esse si sarebbe definita una funzione che ritorna
910   un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.}
911 La funzione \func{signal} quindi restituisce e prende come secondo argomento
912 un puntatore a una funzione di questo tipo, che è appunto la funzione che
913 verrà usata come gestore del segnale.
914
915 Il numero di segnale passato nell'argomento \param{signum} può essere indicato
916 direttamente con una delle costanti definite in sez.~\ref{sec:sig_standard}.
917 L'argomento \param{handler} che indica il gestore invece, oltre all'indirizzo
918 della funzione da chiamare all'occorrenza del segnale, può assumere anche i
919 due valori costanti \const{SIG\_IGN} e \const{SIG\_DFL}; il primo indica che
920 il segnale deve essere ignorato,\footnote{si ricordi però che i due segnali
921   \signal{SIGKILL} e \signal{SIGSTOP} non possono essere né ignorati né
922   intercettati; l'uso di \const{SIG\_IGN} per questi segnali non ha alcun
923   effetto.} mentre il secondo ripristina l'azione predefinita.\footnote{e
924   serve a tornare al comportamento di default quando non si intende più
925   gestire direttamente un segnale.}
926
927 La funzione restituisce l'indirizzo dell'azione precedente, che può essere
928 salvato per poterlo ripristinare (con un'altra chiamata a \func{signal}) in un
929 secondo tempo. Si ricordi che se si imposta come azione \const{SIG\_IGN} (o si
930 imposta un \const{SIG\_DFL} per un segnale la cui azione predefinita è di
931 essere ignorato), tutti i segnali pendenti saranno scartati, e non verranno
932 mai notificati.
933
934 L'uso di \func{signal} è soggetto a problemi di compatibilità, dato che essa
935 si comporta in maniera diversa per sistemi derivati da BSD o da System V. In
936 questi ultimi infatti la funzione è conforme al comportamento originale dei
937 primi Unix in cui il gestore viene disinstallato alla sua chiamata, secondo la
938 semantica inaffidabile; anche Linux seguiva questa convenzione con le vecchie
939 librerie del C come le \acr{libc4} e le \acr{libc5}.\footnote{nelle
940   \acr{libc5} esiste però la possibilità di includere \file{bsd/signal.h} al
941   posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} viene
942   ridefinita per seguire la semantica affidabile usata da BSD.}
943
944 Al contrario BSD segue la semantica affidabile, non disinstallando il gestore
945 e bloccando il segnale durante l'esecuzione dello stesso. Con l'utilizzo delle
946 \acr{glibc} dalla versione 2 anche Linux è passato a questo comportamento.  Il
947 comportamento della versione originale della funzione, il cui uso è deprecato
948 per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto
949 chiamando \funcm{sysv\_signal}, una volta che si sia definita la macro
950 \macro{\_XOPEN\_SOURCE}.  In generale, per evitare questi problemi, l'uso di
951 \func{signal}, che tra l'altro ha un comportamento indefinito in caso di
952 processo \itindex{thread} multi-\textit{thread}, è da evitare; tutti i nuovi
953 programmi dovrebbero usare \func{sigaction}.
954
955 È da tenere presente che, seguendo lo standard POSIX, il comportamento di un
956 processo che ignora i segnali \signal{SIGFPE}, \signal{SIGILL}, o
957 \signal{SIGSEGV} (qualora questi non originino da una chiamata ad una
958 \func{kill} o ad una \func{raise}) è indefinito. Un gestore che ritorna da
959 questi segnali può dare luogo ad un ciclo infinito.
960
961
962 \subsection{Le funzioni \func{kill} e \func{raise}}
963 \label{sec:sig_kill_raise}
964
965 Come precedentemente accennato in sez.~\ref{sec:sig_types}, un segnale può
966 anche essere generato direttamente nell'esecuzione di un programma, attraverso
967 la chiamata ad una opportuna system call. Le funzioni che si utilizzano di
968 solito per inviare un segnale generico ad un processo sono due: \func{raise} e
969 \func{kill}.
970
971 La prima funzione è \funcd{raise}, che è definita dallo standard ANSI C, e
972 serve per inviare un segnale al processo corrente,\footnote{non prevedendo la
973   presenza di un sistema multiutente lo standard ANSI C non poteva che
974   definire una funzione che invia il segnale al programma in esecuzione. Nel
975   caso di Linux questa viene implementata come funzione di compatibilità.}  il
976 suo prototipo è:
977 \begin{prototype}{signal.h}{int raise(int sig)}
978   Invia il segnale \param{sig} al processo corrente.
979
980   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
981     errore, il solo errore restituito è \errval{EINVAL} qualora si sia
982     specificato un numero di segnale invalido.}
983 \end{prototype}
984
985 Il valore di \param{sig} specifica il segnale che si vuole inviare e può
986 essere specificato con una delle macro definite in
987 sez.~\ref{sec:sig_classification}.  In genere questa funzione viene usata per
988 riprodurre il comportamento predefinito di un segnale che sia stato
989 intercettato. In questo caso, una volta eseguite le operazioni volute, il
990 gestore dovrà prima reinstallare l'azione predefinita, per poi attivarla
991 chiamando \func{raise}.
992
993 Mentre \func{raise} è una funzione di libreria, quando si vuole inviare un
994 segnale generico ad un processo occorre utilizzare la apposita system call,
995 questa può essere chiamata attraverso la funzione \funcd{kill}, il cui
996 prototipo è:
997 \begin{functions}
998   \headdecl{sys/types.h}
999   \headdecl{signal.h}
1000   \funcdecl{int kill(pid\_t pid, int sig)} Invia il segnale \param{sig} al
1001   processo specificato con \param{pid}.
1002   
1003   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
1004     errore nel qual caso \var{errno} assumerà uno dei valori:
1005     \begin{errlist}
1006     \item[\errcode{EINVAL}] il segnale specificato non esiste.
1007     \item[\errcode{ESRCH}] il processo selezionato non esiste.
1008     \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il
1009       segnale.
1010     \end{errlist}}
1011 \end{functions}
1012
1013 Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per
1014 specificare il segnale nullo.  Se la funzione viene chiamata con questo valore
1015 non viene inviato nessun segnale, ma viene eseguito il controllo degli errori,
1016 in tal caso si otterrà un errore \errcode{EPERM} se non si hanno i permessi
1017 necessari ed un errore \errcode{ESRCH} se il processo specificato non esiste.
1018 Si tenga conto però che il sistema ricicla i \ids{PID} (come accennato in
1019 sez.~\ref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
1020 esso sia realmente quello a cui si intendeva mandare il segnale.
1021
1022 Il valore dell'argomento \param{pid} specifica il processo (o i processi) di
1023 destinazione a cui il segnale deve essere inviato e può assumere i valori
1024 riportati in tab.~\ref{tab:sig_kill_values}.
1025
1026 Si noti pertanto che la funzione \code{raise(sig)} può essere definita in
1027 termini di \func{kill}, ed è sostanzialmente equivalente ad una
1028 \code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello
1029 standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale
1030 l'uso di \func{kill} finisce per essere più portabile.
1031
1032 Una seconda funzione che può essere definita in termini di \func{kill} è
1033 \funcd{killpg}, che è sostanzialmente equivalente a
1034 \code{kill(-pidgrp, signal)}; il suo prototipo è:
1035 \begin{prototype}{signal.h}{int killpg(pid\_t pidgrp, int signal)} 
1036   
1037   Invia il segnale \param{signal} al \itindex{process~group} \textit{process
1038     group} \param{pidgrp}.
1039
1040   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
1041     errore, gli errori sono gli stessi di \func{kill}.}
1042 \end{prototype}
1043 \noindent e permette di inviare un segnale a tutto un \itindex{process~group}
1044 \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}).
1045
1046 \begin{table}[htb]
1047   \footnotesize
1048   \centering
1049   \begin{tabular}[c]{|r|l|}
1050     \hline
1051     \textbf{Valore} & \textbf{Significato} \\
1052     \hline
1053     \hline
1054     $>0$ & Il segnale è mandato al processo con il \ids{PID} indicato.\\
1055     0    & Il segnale è mandato ad ogni processo del \itindex{process~group}
1056            \textit{process group} del chiamante.\\ 
1057     $-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
1058     $<-1$ & Il segnale è mandato ad ogni processo del \textit{process group} 
1059             \itindex{process~group} $|\code{pid}|$.\\
1060     \hline
1061   \end{tabular}
1062   \caption{Valori dell'argomento \param{pid} per la funzione
1063     \func{kill}.}
1064   \label{tab:sig_kill_values}
1065 \end{table}
1066
1067 Solo l'amministratore può inviare un segnale ad un processo qualunque, in
1068 tutti gli altri casi l'\ids{UID} reale o l'\ids{UID} effettivo del processo
1069 chiamante devono corrispondere all'\ids{UID} reale o all'\ids{UID} salvato
1070 della destinazione. Fa eccezione il caso in cui il segnale inviato sia
1071 \signal{SIGCONT}, nel quale occorre che entrambi i processi appartengano alla
1072 stessa sessione. Inoltre, dato il ruolo fondamentale che riveste nel sistema
1073 (si ricordi quanto visto in sez.~\ref{sec:sig_termination}), non è possibile
1074 inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso non abbia
1075 un gestore installato.
1076
1077 Infine, seguendo le specifiche POSIX 1003.1-2001, l'uso della chiamata
1078 \code{kill(-1, sig)} comporta che il segnale sia inviato (con la solita
1079 eccezione di \cmd{init}) a tutti i processi per i quali i permessi lo
1080 consentano. Lo standard permette comunque alle varie implementazioni di
1081 escludere alcuni processi specifici: nel caso in questione Linux non invia il
1082 segnale al processo che ha effettuato la chiamata.
1083
1084
1085 \subsection{Le funzioni \func{alarm}, \func{abort} ed i \textit{timer}}
1086 \label{sec:sig_alarm_abort}
1087
1088 Un caso particolare di segnali generati a richiesta è quello che riguarda i
1089 vari segnali di temporizzazione e \signal{SIGABRT}, per ciascuno di questi
1090 segnali sono previste funzioni specifiche che ne effettuino l'invio. La più
1091 comune delle funzioni usate per la temporizzazione è \funcd{alarm} il cui
1092 prototipo è:
1093 \begin{prototype}{unistd.h}{unsigned int alarm(unsigned int seconds)}
1094   Predispone l'invio di \signal{SIGALRM} dopo \param{seconds} secondi.
1095   
1096   \bodydesc{La funzione restituisce il numero di secondi rimanenti ad un
1097     precedente allarme, o zero se non c'erano allarmi pendenti.}
1098 \end{prototype}
1099
1100 La funzione fornisce un meccanismo che consente ad un processo di predisporre
1101 un'interruzione nel futuro, (ad esempio per effettuare una qualche operazione
1102 dopo un certo periodo di tempo), programmando l'emissione di un segnale (nel
1103 caso in questione \signal{SIGALRM}) dopo il numero di secondi specificato da
1104 \param{seconds}.
1105
1106 Se si specifica per \param{seconds} un valore nullo non verrà inviato nessun
1107 segnale; siccome alla chiamata viene cancellato ogni precedente allarme,
1108 questo può essere usato per cancellare una programmazione precedente. 
1109
1110 La funzione inoltre ritorna il numero di secondi rimanenti all'invio
1111 dell'allarme programmato in precedenza. In questo modo è possibile controllare
1112 se non si è cancellato un precedente allarme e predisporre eventuali misure
1113 che permettano di gestire il caso in cui servono più interruzioni.
1114
1115 In sez.~\ref{sec:sys_unix_time} abbiamo visto che ad ogni processo sono
1116 associati tre tempi diversi: il \textit{clock time}, l'\textit{user time} ed
1117 il \textit{system time}.  Per poterli calcolare il kernel mantiene per ciascun
1118 processo tre diversi timer:
1119 \begin{itemize*}
1120 \item un \textit{real-time timer} che calcola il tempo reale trascorso (che
1121   corrisponde al \textit{clock time}). La scadenza di questo timer provoca
1122   l'emissione di \signal{SIGALRM};
1123 \item un \textit{virtual timer} che calcola il tempo di processore usato dal
1124   processo in user space (che corrisponde all'\textit{user time}). La scadenza
1125   di questo timer provoca l'emissione di \signal{SIGVTALRM};
1126 \item un \textit{profiling timer} che calcola la somma dei tempi di processore
1127   utilizzati direttamente dal processo in user space, e dal kernel nelle
1128   system call ad esso relative (che corrisponde a quello che in
1129   sez.~\ref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La scadenza
1130   di questo timer provoca l'emissione di \signal{SIGPROF}.
1131 \end{itemize*}
1132
1133 Il timer usato da \func{alarm} è il \textit{clock time}, e corrisponde cioè al
1134 tempo reale. La funzione come abbiamo visto è molto semplice, ma proprio per
1135 questo presenta numerosi limiti: non consente di usare gli altri timer, non
1136 può specificare intervalli di tempo con precisione maggiore del secondo e
1137 genera il segnale una sola volta.
1138
1139 Per ovviare a questi limiti Linux deriva da BSD la funzione \funcd{setitimer}
1140 che permette di usare un timer qualunque e l'invio di segnali periodici, al
1141 costo però di una maggiore complessità d'uso e di una minore portabilità. Il
1142 suo prototipo è:
1143 \begin{prototype}{sys/time.h}{int setitimer(int which, const struct
1144     itimerval *value, struct itimerval *ovalue)} 
1145   
1146   Predispone l'invio di un segnale di allarme alla scadenza dell'intervallo
1147   \param{value} sul timer specificato da \param{which}.
1148   
1149   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
1150     errore, nel qual caso \var{errno} assumerà uno dei valori \errval{EINVAL} o
1151     \errval{EFAULT}.}
1152 \end{prototype}
1153
1154 Il valore di \param{which} permette di specificare quale dei tre timer
1155 illustrati in precedenza usare; i possibili valori sono riportati in
1156 tab.~\ref{tab:sig_setitimer_values}.
1157 \begin{table}[htb]
1158   \footnotesize
1159   \centering
1160   \begin{tabular}[c]{|l|l|}
1161     \hline
1162     \textbf{Valore} & \textbf{Timer} \\
1163     \hline
1164     \hline
1165     \const{ITIMER\_REAL}    & \textit{real-time timer}\\
1166     \const{ITIMER\_VIRTUAL} & \textit{virtual timer}\\
1167     \const{ITIMER\_PROF}    & \textit{profiling timer}\\
1168     \hline
1169   \end{tabular}
1170   \caption{Valori dell'argomento \param{which} per la funzione
1171     \func{setitimer}.}
1172   \label{tab:sig_setitimer_values}
1173 \end{table}
1174
1175 Il valore della struttura specificata \param{value} viene usato per impostare
1176 il timer, se il puntatore \param{ovalue} non è nullo il precedente valore
1177 viene salvato qui. I valori dei timer devono essere indicati attraverso una
1178 struttura \struct{itimerval}, definita in fig.~\ref{fig:file_stat_struct}.
1179
1180 La struttura è composta da due membri, il primo, \var{it\_interval} definisce
1181 il periodo del timer; il secondo, \var{it\_value} il tempo mancante alla
1182 scadenza. Entrambi esprimono i tempi tramite una struttura \struct{timeval} che
1183 permette una precisione fino al microsecondo.
1184
1185 Ciascun timer decrementa il valore di \var{it\_value} fino a zero, poi invia
1186 il segnale e reimposta \var{it\_value} al valore di \var{it\_interval}, in
1187 questo modo il ciclo verrà ripetuto; se invece il valore di \var{it\_interval}
1188 è nullo il timer si ferma.
1189
1190 \begin{figure}[!htb]
1191   \footnotesize \centering
1192   \begin{minipage}[c]{\textwidth}
1193     \includestruct{listati/itimerval.h}
1194   \end{minipage} 
1195   \normalsize 
1196   \caption{La struttura \structd{itimerval}, che definisce i valori dei timer
1197     di sistema.}
1198   \label{fig:sig_itimerval}
1199 \end{figure}
1200
1201 L'uso di \func{setitimer} consente dunque un controllo completo di tutte le
1202 caratteristiche dei timer, ed in effetti la stessa \func{alarm}, benché
1203 definita direttamente nello standard POSIX.1, può a sua volta essere espressa
1204 in termini di \func{setitimer}, come evidenziato dal manuale delle \acr{glibc}
1205 \cite{GlibcMan} che ne riporta la definizione mostrata in
1206 fig.~\ref{fig:sig_alarm_def}.\footnote{questo comporta anche che non è il caso
1207   di mescolare chiamate ad \func{abort} e a \func{setitimer}.}
1208
1209 \begin{figure}[!htb]
1210   \footnotesize \centering
1211   \begin{minipage}[c]{\textwidth}
1212     \includestruct{listati/alarm_def.c}
1213   \end{minipage} 
1214   \normalsize 
1215   \caption{Definizione di \func{alarm} in termini di \func{setitimer}.} 
1216   \label{fig:sig_alarm_def}
1217 \end{figure}
1218
1219 Si deve comunque tenere presente che fino al kernel 2.6.16 la precisione di
1220 queste funzioni era limitata dalla frequenza del timer di sistema,\footnote{il
1221   valore della costante \texttt{HZ}, di cui abbiamo già parlato in
1222   sez.~\ref{sec:proc_hierarchy}.} in quanto le temporizzazioni erano calcolate
1223 in numero di interruzioni del timer (i cosiddetti \itindex{jiffies}
1224 ''\textit{jiffies}''), ed era assicurato soltanto che il segnale non sarebbe
1225 stato mai generato prima della scadenza programmata (l'arrotondamento cioè era
1226 effettuato per eccesso).\footnote{questo in realtà non è del tutto vero a
1227   causa di un bug, presente fino al kernel 2.6.12, che in certe circostanze
1228   causava l'emissione del segnale con un arrotondamento per difetto.} L'uso
1229 del contatore dei \itindex{jiffies} \textit{jiffies}, un intero a 32 bit,
1230 comportava inoltre l'impossibilità di specificare tempi molto
1231 lunghi.\footnote{superiori al valore della costante
1232   \const{MAX\_SEC\_IN\_JIFFIES}, pari, nel caso di default di un valore di
1233   \const{HZ} di 250, a circa 99 giorni e mezzo.} Con il cambiamento della
1234 rappresentazione effettuato nel kernel 2.6.16 questo problema è scomparso e
1235 con l'introduzione dei timer ad alta risoluzione (vedi
1236 sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la precisione è diventata
1237 quella fornita dall'hardware disponibile.
1238
1239 Una seconda causa di potenziali ritardi è che il segnale viene generato alla
1240 scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo
1241 è attivo (questo è sempre vero per \const{ITIMER\_VIRT}) la consegna è
1242 immediata, altrimenti può esserci un ulteriore ritardo che può variare a
1243 seconda del carico del sistema.
1244
1245 Questo ha una conseguenza che può indurre ad errori molto subdoli, si tenga
1246 conto poi che in caso di sistema molto carico, si può avere il caso patologico
1247 in cui un timer scade prima che il segnale di una precedente scadenza sia
1248 stato consegnato; in questo caso, per il comportamento dei segnali descritto
1249 in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo
1250 oggi l'uso di questa funzione è deprecato a favore dei \textit{POSIX timer}
1251 che tratteremo in sez.~\ref{sec:sig_timer_adv}.
1252
1253 Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il
1254 valore corrente di un timer senza modificarlo, è possibile usare la funzione
1255 \funcd{getitimer}, il cui prototipo è:
1256 \begin{prototype}{sys/time.h}{int getitimer(int which, struct
1257     itimerval *value)}
1258   
1259   Legge in \param{value} il valore del timer specificato da \param{which}.
1260   
1261   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
1262     errore e restituisce gli stessi errori di \func{getitimer}.}
1263 \end{prototype}
1264 \noindent i cui argomenti hanno lo stesso significato e formato di quelli di
1265 \func{setitimer}. 
1266
1267
1268 L'ultima funzione che permette l'invio diretto di un segnale è \funcd{abort},
1269 che, come accennato in sez.~\ref{sec:proc_termination}, permette di abortire
1270 l'esecuzione di un programma tramite l'invio di \signal{SIGABRT}. Il suo
1271 prototipo è:
1272 \begin{prototype}{stdlib.h}{void abort(void)}
1273   
1274   Abortisce il processo corrente.
1275   
1276   \bodydesc{La funzione non ritorna, il processo è terminato inviando il
1277   segnale di \signal{SIGABRT}.}
1278 \end{prototype}
1279
1280 La differenza fra questa funzione e l'uso di \func{raise} è che anche se il
1281 segnale è bloccato o ignorato, la funzione ha effetto lo stesso. Il segnale
1282 può però essere intercettato per effettuare eventuali operazioni di chiusura
1283 prima della terminazione del processo.
1284
1285 Lo standard ANSI C richiede inoltre che anche se il gestore ritorna, la
1286 funzione non ritorni comunque. Lo standard POSIX.1 va oltre e richiede che se
1287 il processo non viene terminato direttamente dal gestore sia la stessa
1288 \func{abort} a farlo al ritorno dello stesso. Inoltre, sempre seguendo lo
1289 standard POSIX, prima della terminazione tutti i file aperti e gli stream
1290 saranno chiusi ed i buffer scaricati su disco. Non verranno invece eseguite le
1291 eventuali funzioni registrate con \func{atexit} e \func{on\_exit}.
1292
1293
1294 \subsection{Le funzioni di pausa e attesa}
1295 \label{sec:sig_pause_sleep}
1296
1297 Sono parecchie le occasioni in cui si può avere necessità di sospendere
1298 temporaneamente l'esecuzione di un processo. Nei sistemi più elementari in
1299 genere questo veniva fatto con un opportuno loop di attesa, ma in un sistema
1300 multitasking un loop di attesa è solo un inutile spreco di CPU, per questo ci
1301 sono apposite funzioni che permettono di mettere un processo in stato di
1302 attesa.\footnote{si tratta in sostanza di funzioni che permettono di portare
1303   esplicitamente il processo in stato di \textit{sleep}, vedi
1304   sez.~\ref{sec:proc_sched}.}
1305
1306 Il metodo tradizionale per fare attendere ad un processo fino all'arrivo di un
1307 segnale è quello di usare la funzione \funcd{pause}, il cui prototipo è:
1308 \begin{prototype}{unistd.h}{int pause(void)}
1309   
1310   Pone il processo in stato di sleep fino al ritorno di un gestore.
1311   
1312   \bodydesc{La funzione ritorna solo dopo che un segnale è stato ricevuto ed
1313     il relativo gestore è ritornato, nel qual caso restituisce $-1$ e
1314     \var{errno} assumerà il valore \errval{EINTR}.}
1315 \end{prototype}
1316
1317 La funzione segnala sempre una condizione di errore (il successo sarebbe
1318 quello di aspettare indefinitamente). In genere si usa questa funzione quando
1319 si vuole mettere un processo in attesa di un qualche evento specifico che non
1320 è sotto il suo diretto controllo (ad esempio la si può usare per interrompere
1321 l'esecuzione del processo fino all'arrivo di un segnale inviato da un altro
1322 processo).
1323
1324 Quando invece si vuole fare attendere un processo per un intervallo di tempo
1325 già noto nello standard POSIX.1 viene definita la funzione \funcd{sleep}, il
1326 cui prototipo è:
1327 \begin{prototype}{unistd.h}{unsigned int sleep(unsigned int seconds)}
1328   
1329   Pone il processo in stato di sleep per \param{seconds} secondi.
1330   
1331   \bodydesc{La funzione restituisce zero se l'attesa viene completata, o il
1332   numero di secondi restanti se viene interrotta da un segnale.}
1333 \end{prototype}
1334
1335 La funzione attende per il tempo specificato, a meno di non essere interrotta
1336 da un segnale. In questo caso non è una buona idea ripetere la chiamata per il
1337 tempo rimanente, in quanto la riattivazione del processo può avvenire in un
1338 qualunque momento, ma il valore restituito sarà sempre arrotondato al secondo,
1339 con la conseguenza che, se la successione dei segnali è particolarmente
1340 sfortunata e le differenze si accumulano, si potranno avere ritardi anche di
1341 parecchi secondi. In genere la scelta più sicura è quella di stabilire un
1342 termine per l'attesa, e ricalcolare tutte le volte il numero di secondi da
1343 aspettare.
1344
1345 In alcune implementazioni inoltre l'uso di \func{sleep} può avere conflitti
1346 con quello di \signal{SIGALRM}, dato che la funzione può essere realizzata con
1347 l'uso di \func{pause} e \func{alarm} (in maniera analoga all'esempio che
1348 vedremo in sez.~\ref{sec:sig_example}). In tal caso mescolare chiamata di
1349 \func{alarm} e \func{sleep} o modificare l'azione di \signal{SIGALRM}, può
1350 causare risultati indefiniti. Nel caso delle \acr{glibc} è stata usata una
1351 implementazione completamente indipendente e questi problemi non ci sono.
1352
1353 La granularità di \func{sleep} permette di specificare attese soltanto in
1354 secondi, per questo sia sotto BSD4.3 che in SUSv2 è stata definita la funzione
1355 \funcd{usleep} (dove la \texttt{u} è intesa come sostituzione di $\mu$); i due
1356 standard hanno delle definizioni diverse, ma le \acr{glibc}
1357 seguono\footnote{secondo la pagina di manuale almeno dalla versione 2.2.2.}
1358 seguono quella di SUSv2 che prevede il seguente prototipo:
1359 \begin{prototype}{unistd.h}{int usleep(unsigned long usec)}
1360   
1361   Pone il processo in stato di sleep per \param{usec} microsecondi.
1362   
1363   \bodydesc{La funzione restituisce zero se l'attesa viene completata, o $-1$
1364     in caso di errore, nel qual caso \var{errno} assumerà il valore
1365     \errval{EINTR}.}
1366
1367 \end{prototype}
1368
1369 Anche questa funzione, a seconda delle implementazioni, può presentare
1370 problemi nell'interazione con \func{alarm} e \signal{SIGALRM}. È pertanto
1371 deprecata in favore della funzione \funcd{nanosleep}, definita dallo standard
1372 POSIX1.b, il cui prototipo è:
1373 \begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct
1374     timespec *rem)}
1375   
1376   Pone il processo in stato di sleep per il tempo specificato da \param{req}.
1377   In caso di interruzione restituisce il tempo restante in \param{rem}.
1378   
1379   \bodydesc{La funzione restituisce zero se l'attesa viene completata, o $-1$
1380     in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
1381     \begin{errlist}
1382     \item[\errcode{EINVAL}] si è specificato un numero di secondi negativo o un
1383       numero di nanosecondi maggiore di 999.999.999.
1384     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
1385     \end{errlist}}
1386 \end{prototype}
1387
1388 Lo standard richiede che la funzione sia implementata in maniera del tutto
1389 indipendente da \func{alarm}\footnote{nel caso di Linux questo è fatto
1390   utilizzando direttamente il timer del kernel.} e sia utilizzabile senza
1391 interferenze con l'uso di \signal{SIGALRM}. La funzione prende come argomenti
1392 delle strutture di tipo \struct{timespec}, la cui definizione è riportata in
1393 fig.~\ref{fig:sys_timespec_struct}, che permette di specificare un tempo con
1394 una precisione fino al nanosecondo.
1395
1396 La funzione risolve anche il problema di proseguire l'attesa dopo
1397 l'interruzione dovuta ad un segnale; infatti in tal caso in \param{rem} viene
1398 restituito il tempo rimanente rispetto a quanto richiesto
1399 inizialmente,\footnote{con l'eccezione, valida solo nei kernel della serie
1400   2.4, in cui, per i processi riavviati dopo essere stati fermati da un
1401   segnale, il tempo passato in stato \texttt{T} non viene considerato nel
1402   calcolo della rimanenza.} e basta richiamare la funzione per completare
1403 l'attesa.\footnote{anche qui però occorre tenere presente che i tempi sono
1404   arrotondati, per cui la precisione, per quanto migliore di quella ottenibile
1405   con \func{sleep}, è relativa e in caso di molte interruzioni si può avere
1406   una deriva, per questo esiste la funzione \func{clock\_nanosleep} (vedi
1407   sez.~\ref{sec:sig_timer_adv}) che permette di specificare un tempo assoluto
1408   anziché un tempo relativo.}
1409
1410 Chiaramente, anche se il tempo può essere specificato con risoluzioni fino al
1411 nanosecondo, la precisione di \func{nanosleep} è determinata dalla risoluzione
1412 temporale del timer di sistema. Perciò la funzione attenderà comunque il tempo
1413 specificato, ma prima che il processo possa tornare ad essere eseguito
1414 occorrerà almeno attendere la successiva interruzione del timer di sistema,
1415 cioè un tempo che a seconda dei casi può arrivare fino a 1/\const{HZ}, (sempre
1416 che il sistema sia scarico ed il processa venga immediatamente rimesso in
1417 esecuzione); per questo motivo il valore restituito in \param{rem} è sempre
1418 arrotondato al multiplo successivo di 1/\const{HZ}.
1419
1420 Con i kernel della serie 2.4 in realtà era possibile ottenere anche pause più
1421 precise del centesimo di secondo usando politiche di \itindex{scheduler}
1422 scheduling \textit{real-time} come \const{SCHED\_FIFO} o \const{SCHED\_RR}; in
1423 tal caso infatti il calcolo sul numero di interruzioni del timer veniva
1424 evitato utilizzando direttamente un ciclo di attesa con cui si raggiungevano
1425 pause fino ai 2~ms con precisioni del $\mu$s. Questa estensione è stata
1426 rimossa con i kernel della serie 2.6, che consentono una risoluzione più alta
1427 del timer di sistema; inoltre a partire dal kernel 2.6.21, \func{nanosleep}
1428 può avvalersi del supporto dei timer ad alta risoluzione, ottenendo la massima
1429 precisione disponibile sull'hardware della propria macchina.
1430
1431
1432 \subsection{Un esempio elementare}
1433 \label{sec:sig_sigchld}
1434
1435 Un semplice esempio per illustrare il funzionamento di un gestore di segnale è
1436 quello della gestione di \signal{SIGCHLD}. Abbiamo visto in
1437 sez.~\ref{sec:proc_termination} che una delle azioni eseguite dal kernel alla
1438 conclusione di un processo è quella di inviare questo segnale al
1439 padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il
1440   segnale si chiama \signal{SIGCLD} e viene trattato in maniera speciale; in
1441   System V infatti se si imposta esplicitamente l'azione a \const{SIG\_IGN} il
1442   segnale non viene generato ed il sistema non genera \itindex{zombie}
1443   \textit{zombie} (lo stato di terminazione viene scartato senza dover
1444   chiamare una \func{wait}).  L'azione predefinita è sempre quella di ignorare
1445   il segnale, ma non attiva questo comportamento. Linux, come BSD e POSIX, non
1446   supporta questa semantica ed usa il nome di \signal{SIGCLD} come sinonimo di
1447   \signal{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo
1448 stato di uscita di un processo, si può completare la gestione della
1449 terminazione installando un gestore per \signal{SIGCHLD} il cui unico compito
1450 sia quello di chiamare \func{waitpid} per completare la procedura di
1451 terminazione in modo da evitare la formazione di \itindex{zombie}
1452 \textit{zombie}.
1453
1454 In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una
1455 implementazione generica di una funzione di gestione per \signal{SIGCHLD},
1456 (che si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i
1457 test di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con
1458 l'opzione \cmd{-s} (che si limita ad effettuare l'installazione di questa
1459 funzione come gestore di \signal{SIGCHLD}) potremo verificare che non si ha
1460 più la creazione di \itindex{zombie} \textit{zombie}.
1461
1462 \begin{figure}[!htbp]
1463   \footnotesize  \centering
1464   \begin{minipage}[c]{\codesamplewidth}
1465     \includecodesample{listati/hand_sigchild.c}
1466   \end{minipage}
1467   \normalsize 
1468   \caption{Codice di una funzione generica di gestione per il segnale
1469     \signal{SIGCHLD}.}
1470   \label{fig:sig_sigchld_handl}
1471 \end{figure}
1472
1473 Il codice del gestore è di lettura immediata; come buona norma di
1474 programmazione (si ricordi quanto accennato sez.~\ref{sec:sys_errno}) si
1475 comincia (\texttt{\small 6--7}) con il salvare lo stato corrente di
1476 \var{errno}, in modo da poterlo ripristinare prima del ritorno del gestore
1477 (\texttt{\small 16--17}). In questo modo si preserva il valore della variabile
1478 visto dal corso di esecuzione principale del processo, che altrimenti sarebbe
1479 sovrascritto dal valore restituito nella successiva chiamata di \func{waitpid}.
1480
1481 Il compito principale del gestore è quello di ricevere lo stato di
1482 terminazione del processo, cosa che viene eseguita nel ciclo in
1483 (\texttt{\small 9--15}).  Il ciclo è necessario a causa di una caratteristica
1484 fondamentale della gestione dei segnali: abbiamo già accennato come fra la
1485 generazione di un segnale e l'esecuzione del gestore possa passare un certo
1486 lasso di tempo e niente ci assicura che il gestore venga eseguito prima della
1487 generazione di ulteriori segnali dello stesso tipo. In questo caso normalmente
1488 i segnali successivi vengono ``\textsl{fusi}'' col primo ed al processo ne
1489 viene recapitato soltanto uno.
1490
1491 Questo può essere un caso comune proprio con \signal{SIGCHLD}, qualora capiti
1492 che molti processi figli terminino in rapida successione. Esso inoltre si
1493 presenta tutte le volte che un segnale viene bloccato: per quanti siano i
1494 segnali emessi durante il periodo di blocco, una volta che quest'ultimo sarà
1495 rimosso verrà recapitato un solo segnale.
1496
1497 Allora, nel caso della terminazione dei processi figli, se si chiamasse
1498 \func{waitpid} una sola volta, essa leggerebbe lo stato di terminazione per un
1499 solo processo, anche se i processi terminati sono più di uno, e gli altri
1500 resterebbero in stato di \itindex{zombie} \textit{zombie} per un tempo
1501 indefinito.
1502
1503 Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non
1504 ritorni un valore nullo, segno che non resta nessun processo di cui si debba
1505 ancora ricevere lo stato di terminazione (si veda sez.~\ref{sec:proc_wait} per
1506 la sintassi della funzione). Si noti anche come la funzione venga invocata con
1507 il parametro \const{WNOHANG} che permette di evitare il suo blocco quando
1508 tutti gli stati di terminazione sono stati ricevuti.
1509
1510
1511
1512 \section{La gestione avanzata dei segnali}
1513 \label{sec:sig_adv_control}
1514
1515 Le funzioni esaminate finora fanno riferimento alle modalità più elementari
1516 della gestione dei segnali; non si sono pertanto ancora prese in
1517 considerazione le tematiche più complesse, collegate alle varie
1518 \itindex{race~condition} \textit{race condition} che i segnali possono
1519 generare e alla natura asincrona degli stessi.
1520
1521 Affronteremo queste problematiche in questa sezione, partendo da un esempio
1522 che le evidenzi, per poi prendere in esame le varie funzioni che permettono di
1523 risolvere i problemi più complessi connessi alla programmazione con i segnali,
1524 fino a trattare le caratteristiche generali della gestione dei medesimi nella
1525 casistica ordinaria.
1526
1527
1528 \subsection{Alcune problematiche aperte}
1529 \label{sec:sig_example}
1530
1531 Come accennato in sez.~\ref{sec:sig_pause_sleep} è possibile implementare
1532 \func{sleep} a partire dall'uso di \func{pause} e \func{alarm}. A prima vista
1533 questo può sembrare di implementazione immediata; ad esempio una semplice
1534 versione di \func{sleep} potrebbe essere quella illustrata in
1535 fig.~\ref{fig:sig_sleep_wrong}.
1536
1537 \begin{figure}[!htbp]
1538   \footnotesize \centering
1539   \begin{minipage}[c]{\codesamplewidth}
1540     \includecodesample{listati/sleep_danger.c}
1541   \end{minipage}
1542   \normalsize 
1543   \caption{Una implementazione pericolosa di \func{sleep}.} 
1544   \label{fig:sig_sleep_wrong}
1545 \end{figure}
1546
1547 Dato che è nostra intenzione utilizzare \signal{SIGALRM} il primo passo della
1548 nostra implementazione sarà quello di installare il relativo gestore salvando
1549 il precedente (\texttt{\small 14-17}).  Si effettuerà poi una chiamata ad
1550 \func{alarm} per specificare il tempo d'attesa per l'invio del segnale a cui
1551 segue la chiamata a \func{pause} per fermare il programma (\texttt{\small
1552   18-20}) fino alla sua ricezione.  Al ritorno di \func{pause}, causato dal
1553 ritorno del gestore (\texttt{\small 1-9}), si ripristina il gestore originario
1554 (\texttt{\small 21-22}) restituendo l'eventuale tempo rimanente
1555 (\texttt{\small 23-24}) che potrà essere diverso da zero qualora
1556 l'interruzione di \func{pause} venisse causata da un altro segnale.
1557
1558 Questo codice però, a parte il non gestire il caso in cui si è avuta una
1559 precedente chiamata a \func{alarm} (che si è tralasciato per brevità),
1560 presenta una pericolosa \itindex{race~condition} \textit{race condition}.
1561 Infatti, se il processo viene interrotto fra la chiamata di \func{alarm} e
1562 \func{pause}, può capitare (ad esempio se il sistema è molto carico) che il
1563 tempo di attesa scada prima dell'esecuzione di quest'ultima, cosicché essa
1564 sarebbe eseguita dopo l'arrivo di \signal{SIGALRM}. In questo caso ci si
1565 troverebbe di fronte ad un \itindex{deadlock} deadlock, in quanto \func{pause}
1566 non verrebbe mai più interrotta (se non in caso di un altro segnale).
1567
1568 Questo problema può essere risolto (ed è la modalità con cui veniva fatto in
1569 SVr2) usando la funzione \func{longjmp} (vedi sez.~\ref{sec:proc_longjmp}) per
1570 uscire dal gestore; in questo modo, con una condizione sullo stato di
1571 uscita di quest'ultima, si può evitare la chiamata a \func{pause}, usando un
1572 codice del tipo di quello riportato in fig.~\ref{fig:sig_sleep_incomplete}.
1573
1574 \begin{figure}[!htbp]
1575   \footnotesize \centering
1576   \begin{minipage}[c]{\codesamplewidth}
1577     \includecodesample{listati/sleep_defect.c}
1578   \end{minipage}
1579   \normalsize 
1580   \caption{Una implementazione ancora malfunzionante di \func{sleep}.} 
1581   \label{fig:sig_sleep_incomplete}
1582 \end{figure}
1583
1584 In questo caso il gestore (\texttt{\small 18-27}) non ritorna come in
1585 fig.~\ref{fig:sig_sleep_wrong}, ma usa \func{longjmp} (\texttt{\small 25}) per
1586 rientrare nel corpo principale del programma; dato che in questo caso il
1587 valore di uscita di \func{setjmp} è 1, grazie alla condizione in
1588 (\texttt{\small 9-12}) si evita comunque che \func{pause} sia chiamata a
1589 vuoto.
1590
1591 Ma anche questa implementazione comporta dei problemi; in questo caso infatti
1592 non viene gestita correttamente l'interazione con gli altri segnali; se
1593 infatti il segnale di allarme interrompe un altro gestore, l'esecuzione non
1594 riprenderà nel gestore in questione, ma nel ciclo principale, interrompendone
1595 inopportunamente l'esecuzione.  Lo stesso tipo di problemi si presenterebbero
1596 se si volesse usare \func{alarm} per stabilire un timeout su una qualunque
1597 system call bloccante.
1598
1599 Un secondo esempio è quello in cui si usa il segnale per notificare una
1600 qualche forma di evento; in genere quello che si fa in questo caso è impostare
1601 nel gestore un opportuno flag da controllare nel corpo principale del
1602 programma (con un codice del tipo di quello riportato in
1603 fig.~\ref{fig:sig_event_wrong}). La logica è quella di far impostare al
1604 gestore (\texttt{\small 14-19}) una \index{variabili!globali} variabile
1605 globale preventivamente inizializzata nel programma principale, il quale potrà
1606 determinare, osservandone il contenuto, l'occorrenza o meno del segnale, e
1607 prendere le relative azioni conseguenti (\texttt{\small 6-11}).
1608
1609 \begin{figure}[!htbp]
1610   \footnotesize\centering
1611   \begin{minipage}[c]{\codesamplewidth}
1612     \includecodesample{listati/sig_alarm.c}
1613   \end{minipage}
1614   \normalsize 
1615   \caption{Un esempio non funzionante del codice per il controllo di un
1616     evento generato da un segnale.}
1617   \label{fig:sig_event_wrong}
1618 \end{figure}
1619
1620 Questo è il tipico esempio di caso, già citato in
1621 sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition}
1622 \textit{race condition}; infatti, in una situazione in cui un segnale è già
1623 arrivato (e \var{flag} è già ad 1) se un altro segnale arriva immediatamente
1624 dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima della
1625 cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà perduta.
1626
1627 Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono
1628 delle funzioni più sofisticate di quelle finora illustrate, queste hanno la
1629 loro origine nella semplice interfaccia dei primi sistemi Unix, ma con esse
1630 non è possibile gestire in maniera adeguata di tutti i possibili aspetti con
1631 cui un processo deve reagire alla ricezione di un segnale.
1632
1633
1634
1635 \subsection{Gli \textsl{insiemi di segnali} o \textit{signal set}}
1636 \label{sec:sig_sigset}
1637
1638 \itindbeg{signal~set} 
1639
1640 Come evidenziato nel paragrafo precedente, le funzioni di gestione dei segnali
1641 originarie, nate con la semantica inaffidabile, hanno dei limiti non
1642 superabili; in particolare non è prevista nessuna funzione che permetta di
1643 gestire il blocco dei segnali o di verificare lo stato dei segnali pendenti.
1644 Per questo motivo lo standard POSIX.1, insieme alla nuova semantica dei
1645 segnali ha introdotto una interfaccia di gestione completamente nuova, che
1646 permette di ottenere un controllo molto più dettagliato. In particolare lo
1647 standard ha introdotto un nuovo tipo di dato \type{sigset\_t}, che permette di
1648 rappresentare un \textsl{insieme di segnali} (un \textit{signal set}, come
1649 viene usualmente chiamato), tale tipo di dato viene usato per gestire il
1650 blocco dei segnali.
1651
1652 In genere un \textsl{insieme di segnali} è rappresentato da un intero di
1653 dimensione opportuna, di solito pari al numero di bit dell'architettura della
1654 macchina,\footnote{nel caso dei PC questo comporta un massimo di 32 segnali
1655   distinti: dato che in Linux questi sono sufficienti non c'è necessità di
1656   nessuna struttura più complicata.} ciascun bit del quale è associato ad uno
1657 specifico segnale; in questo modo è di solito possibile implementare le
1658 operazioni direttamente con istruzioni elementari del processore. Lo standard
1659 POSIX.1 definisce cinque funzioni per la manipolazione degli insiemi di
1660 segnali: \funcd{sigemptyset}, \funcd{sigfillset}, \funcd{sigaddset},
1661 \funcd{sigdelset} e \funcd{sigismember}, i cui prototipi sono:
1662 \begin{functions}
1663   \headdecl{signal.h} 
1664   
1665   \funcdecl{int sigemptyset(sigset\_t *set)} Inizializza un insieme di segnali
1666   vuoto (in cui non c'è nessun segnale).
1667  
1668   \funcdecl{int sigfillset(sigset\_t *set)} Inizializza un insieme di segnali
1669   pieno (in cui ci sono tutti i segnali).
1670   
1671   \funcdecl{int sigaddset(sigset\_t *set, int signum)} Aggiunge il segnale
1672   \param{signum} all'insieme di segnali \param{set}.
1673
1674   \funcdecl{int sigdelset(sigset\_t *set, int signum)} Toglie il segnale
1675   \param{signum} dall'insieme di segnali \param{set}.
1676   
1677   \funcdecl{int sigismember(const sigset\_t *set, int signum)} Controlla se il
1678   segnale \param{signum} è nell'insieme di segnali \param{set}.
1679   
1680   \bodydesc{Le prime quattro funzioni ritornano 0 in caso di successo, mentre
1681     \func{sigismember} ritorna 1 se \param{signum} è in \param{set} e 0
1682     altrimenti. In caso di errore tutte ritornano $-1$, con \var{errno}
1683     impostata a \errval{EINVAL} (il solo errore possibile è che \param{signum}
1684     non sia un segnale valido).}
1685 \end{functions}
1686
1687 Dato che in generale non si può fare conto sulle caratteristiche di una
1688 implementazione (non è detto che si disponga di un numero di bit sufficienti
1689 per mettere tutti i segnali in un intero, o in \type{sigset\_t} possono essere
1690 immagazzinate ulteriori informazioni) tutte le operazioni devono essere
1691 comunque eseguite attraverso queste funzioni.
1692
1693 In genere si usa un insieme di segnali per specificare quali segnali si vuole
1694 bloccare, o per riottenere dalle varie funzioni di gestione la maschera dei
1695 segnali attivi (vedi sez.~\ref{sec:sig_sigmask}). Essi possono essere definiti
1696 in due diverse maniere, aggiungendo i segnali voluti ad un insieme vuoto
1697 ottenuto con \func{sigemptyset} o togliendo quelli che non servono da un
1698 insieme completo ottenuto con \func{sigfillset}. Infine \func{sigismember}
1699 permette di verificare la presenza di uno specifico segnale in un
1700 insieme.
1701
1702 \itindend{signal~set} 
1703
1704
1705 \subsection{La funzione \func{sigaction}}
1706 \label{sec:sig_sigaction}
1707
1708 Abbiamo già accennato in sez.~\ref{sec:sig_signal} i problemi di compatibilità
1709 relativi all'uso di \func{signal}. Per ovviare a tutto questo lo standard
1710 POSIX.1 ha ridefinito completamente l'interfaccia per la gestione dei segnali,
1711 rendendola molto più flessibile e robusta, anche se leggermente più complessa.
1712
1713 La funzione principale dell'interfaccia POSIX.1 per i segnali è
1714 \funcd{sigaction}. Essa ha sostanzialmente lo stesso uso di \func{signal},
1715 permette cioè di specificare le modalità con cui un segnale può essere gestito
1716 da un processo. Il suo prototipo è:
1717 \begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
1718     *act, struct sigaction *oldact)} 
1719   
1720   Installa una nuova azione per il segnale \param{signum}.
1721   
1722   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
1723     errore, nel qual caso \var{errno} assumerà i valori:
1724   \begin{errlist}
1725   \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è
1726     cercato di installare il gestore per \signal{SIGKILL} o
1727     \signal{SIGSTOP}.
1728   \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
1729   \end{errlist}}
1730 \end{prototype}
1731
1732 La funzione serve ad installare una nuova \textsl{azione} per il segnale
1733 \param{signum}; si parla di \textsl{azione} e non di \textsl{gestore}
1734 come nel caso di \func{signal}, in quanto la funzione consente di specificare
1735 le varie caratteristiche della risposta al segnale, non solo la funzione che
1736 verrà eseguita alla sua occorrenza.  Per questo lo standard raccomanda di
1737 usare sempre questa funzione al posto di \func{signal} (che in genere viene
1738 definita tramite essa), in quanto permette un controllo completo su tutti gli
1739 aspetti della gestione di un segnale, sia pure al prezzo di una maggiore
1740 complessità d'uso.
1741
1742 Se il puntatore \param{act} non è nullo, la funzione installa la nuova azione
1743 da esso specificata, se \param{oldact} non è nullo il valore dell'azione
1744 corrente viene restituito indietro.  Questo permette (specificando \param{act}
1745 nullo e \param{oldact} non nullo) di superare uno dei limiti di \func{signal},
1746 che non consente di ottenere l'azione corrente senza installarne una nuova.
1747
1748 Entrambi i puntatori fanno riferimento alla struttura \struct{sigaction},
1749 tramite la quale si specificano tutte le caratteristiche dell'azione associata
1750 ad un segnale.  Anch'essa è descritta dallo standard POSIX.1 ed in Linux è
1751 definita secondo quanto riportato in fig.~\ref{fig:sig_sigaction}. Il campo
1752 \var{sa\_restorer}, non previsto dallo standard, è obsoleto e non deve essere
1753 più usato.
1754
1755 \begin{figure}[!htb]
1756   \footnotesize \centering
1757   \begin{minipage}[c]{\textwidth}
1758     \includestruct{listati/sigaction.h}
1759   \end{minipage} 
1760   \normalsize 
1761   \caption{La struttura \structd{sigaction}.} 
1762   \label{fig:sig_sigaction}
1763 \end{figure}
1764
1765 Il campo \var{sa\_mask} serve ad indicare l'insieme dei segnali che devono
1766 essere bloccati durante l'esecuzione del gestore, ad essi viene comunque
1767 sempre aggiunto il segnale che ne ha causato la chiamata, a meno che non si
1768 sia specificato con \var{sa\_flag} un comportamento diverso. Quando il
1769 gestore ritorna comunque la maschera dei segnali bloccati (vedi
1770 sez.~\ref{sec:sig_sigmask}) viene ripristinata al valore precedente
1771 l'invocazione.
1772
1773 L'uso di questo campo permette ad esempio di risolvere il problema residuo
1774 dell'implementazione di \code{sleep} mostrata in
1775 fig.~\ref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
1776 allarme avesse interrotto un altro gestore questo non sarebbe stato eseguito
1777 correttamente; la cosa poteva essere prevenuta installando gli altri gestori
1778 usando \var{sa\_mask} per bloccare \signal{SIGALRM} durante la loro esecuzione.
1779 Il valore di \var{sa\_flag} permette di specificare vari aspetti del
1780 comportamento di \func{sigaction}, e della reazione del processo ai vari
1781 segnali; i valori possibili ed il relativo significato sono riportati in
1782 tab.~\ref{tab:sig_sa_flag}.
1783
1784 \begin{table}[htb]
1785   \footnotesize
1786   \centering
1787   \begin{tabular}[c]{|l|p{8cm}|}
1788     \hline
1789     \textbf{Valore} & \textbf{Significato} \\
1790     \hline
1791     \hline
1792     \const{SA\_NOCLDSTOP}& Se il segnale è \signal{SIGCHLD} allora non deve
1793                            essere notificato quando il processo figlio viene
1794                            fermato da uno dei segnali \signal{SIGSTOP},
1795                            \signal{SIGTSTP}, \signal{SIGTTIN} o 
1796                            \signal{SIGTTOU}.\\
1797     \const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore 
1798                            predefinito una volta che il gestore è stato
1799                            lanciato, riproduce cioè il comportamento della
1800                            semantica inaffidabile.\\  
1801     \const{SA\_ONESHOT}  & Nome obsoleto, sinonimo non standard di
1802                            \const{SA\_RESETHAND}; da evitare.\\ 
1803     \const{SA\_ONSTACK}  & Stabilisce l'uso di uno \itindex{stack} 
1804                            \textit{stack} alternativo per l'esecuzione del
1805                            gestore (vedi
1806                            sez.~\ref{sec:sig_specific_features}).\\  
1807     \const{SA\_RESTART}  & Riavvia automaticamente le \textit{slow system
1808                            call} quando vengono interrotte dal suddetto
1809                            segnale; riproduce cioè il comportamento standard
1810                            di BSD.\index{system~call~lente}\\ 
1811     \const{SA\_NODEFER}  & Evita che il segnale corrente sia bloccato durante
1812                            l'esecuzione del gestore.\\
1813     \const{SA\_NOMASK}   & Nome obsoleto, sinonimo non standard di
1814                            \const{SA\_NODEFER}.\\ 
1815     \const{SA\_SIGINFO}  & Deve essere specificato quando si vuole usare un
1816                            gestore in forma estesa usando
1817                            \var{sa\_sigaction} al posto di
1818                            \var{sa\_handler}.\\
1819     \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} allora i processi
1820                            figli non diventano \itindex{zombie}
1821                            \textit{zombie} quando terminano.\footnotemark \\ 
1822     \hline
1823   \end{tabular}
1824   \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.}
1825   \label{tab:sig_sa_flag}
1826 \end{table}
1827
1828 \footnotetext{questa funzionalità è stata introdotta nel kernel 2.6 e va a
1829   modificare il comportamento di \func{waitpid}.}
1830
1831 Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette
1832 di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista
1833   dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x
1834   con l'introduzione dei segnali \textit{real-time} (vedi
1835   sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune
1836   informazioni addizionali usando \var{sa\_handler} con un secondo parametro
1837   addizionale di tipo \var{sigcontext}, che adesso è deprecato.}  da
1838 specificare, a seconda dell'uso o meno del flag \const{SA\_SIGINFO},
1839 rispettivamente attraverso i campi \var{sa\_sigaction} o
1840 \var{sa\_handler},\footnote{i due campi devono essere usati in maniera
1841   alternativa, in certe implementazioni questi campi vengono addirittura
1842   definiti come \direct{union}.}  Quest'ultima è quella classica usata anche con
1843 \func{signal}, mentre la prima permette di usare un gestore più complesso, in
1844 grado di ricevere informazioni più dettagliate dal sistema, attraverso la
1845 struttura \struct{siginfo\_t}, riportata in fig.~\ref{fig:sig_siginfo_t}.
1846
1847 Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile
1848 accedere alle informazioni restituite attraverso il puntatore a questa
1849 struttura. Tutti i segnali impostano i campi \var{si\_signo}, che riporta il
1850 numero del segnale ricevuto, \var{si\_errno}, che riporta, quando diverso da
1851 zero, il codice dell'errore associato al segnale, e \var{si\_code}, che viene
1852 usato dal kernel per specificare maggiori dettagli riguardo l'evento che ha
1853 causato l'emissione del segnale.
1854
1855 \begin{figure}[!htb]
1856   \footnotesize \centering
1857   \begin{minipage}[c]{\textwidth}
1858     \includestruct{listati/siginfo_t.h}
1859   \end{minipage} 
1860   \normalsize 
1861   \caption{La struttura \structd{siginfo\_t}.} 
1862   \label{fig:sig_siginfo_t}
1863 \end{figure}
1864  
1865 In generale \var{si\_code} contiene, per i segnali generici, per quelli
1866 \textit{real-time} e per tutti quelli inviati tramite da un processo con
1867 \func{kill} o affini, le informazioni circa l'origine del segnale stesso, ad
1868 esempio se generato dal kernel, da un timer, da \func{kill}, ecc. Il valore
1869 viene sempre espresso come una costante,\footnote{le definizioni di tutti i
1870   valori possibili si trovano in \file{bits/siginfo.h}.} ed i valori possibili
1871 in questo caso sono riportati in tab.~\ref{tab:sig_si_code_generic}.
1872
1873 Nel caso di alcuni segnali però il valore di \var{si\_code} viene usato per
1874 fornire una informazione specifica relativa alle motivazioni della ricezione
1875 dello stesso; ad esempio i vari segnali di errore (\signal{SIGILL},
1876 \signal{SIGFPE}, \signal{SIGSEGV} e \signal{SIGBUS}) lo usano per fornire
1877 maggiori dettagli riguardo l'errore, come il tipo di errore aritmetico, di
1878 istruzione illecita o di violazione di memoria; mentre alcuni segnali di
1879 controllo (\signal{SIGCHLD}, \signal{SIGTRAP} e \signal{SIGPOLL}) forniscono
1880 altre informazioni specifiche.
1881
1882 \begin{table}[!htb]
1883   \footnotesize
1884   \centering
1885   \begin{tabular}[c]{|l|p{8cm}|}
1886     \hline
1887     \textbf{Valore} & \textbf{Significato} \\
1888     \hline
1889     \hline
1890     \const{SI\_USER}   & generato da \func{kill} o \func{raise}.\\
1891     \const{SI\_KERNEL} & inviato dal kernel.\\
1892     \const{SI\_QUEUE}  & inviato con \func{sigqueue} (vedi
1893                          sez.~\ref{sec:sig_real_time}).\\ 
1894     \const{SI\_TIMER}  & scadenza di un POSIX timer 
1895                          (vedi sez.~\ref{sec:sig_timer_adv}).\\
1896     \const{SI\_MESGQ}  & inviato al cambiamento di stato di una coda di
1897                          messaggi POSIX (vedi
1898                          sez.~\ref{sec:ipc_posix_mq}).\footnotemark\\ 
1899     \const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi
1900                          sez.~\ref{sec:file_asyncronous_access}) è stata
1901                          completata.\\
1902     \const{SI\_SIGIO}  & segnale di \signal{SIGIO} da una coda (vedi
1903                          sez.~\ref{sec:file_asyncronous_operation}).\\ 
1904     \const{SI\_TKILL}  & inviato da \func{tkill} o \func{tgkill} (vedi
1905                          sez.~\ref{cha:threads_xxx}).\footnotemark\\ 
1906     \hline
1907   \end{tabular}
1908   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
1909     per i segnali generici.}
1910   \label{tab:sig_si_code_generic}
1911 \end{table}
1912
1913 \footnotetext[24]{introdotto con il kernel 2.6.6.}
1914 \footnotetext{introdotto con il kernel 2.4.19.}
1915
1916 In questo caso il valore del campo \var{si\_code} deve essere verificato nei
1917 confronti delle diverse costanti previste per ciascuno di detti
1918 segnali;\footnote{dato che si tratta di una costante, e non di una maschera
1919   binaria, i valori numerici vengono riutilizzati e ciascuno di essi avrà un
1920   significato diverso a seconda del segnale a cui è associato.} l'elenco
1921 dettagliato dei nomi di queste costanti è riportato nelle diverse sezioni di
1922 tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella sequenza in
1923 cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome
1924   indica comunque in maniera diretta il segnale a cui le costanti fanno
1925   riferimento.}
1926
1927 \begin{table}[!htb]
1928   \footnotesize
1929   \centering
1930   \begin{tabular}[c]{|l|p{8cm}|}
1931     \hline
1932     \textbf{Valore} & \textbf{Significato} \\
1933     \hline
1934     \hline
1935     \const{ILL\_ILLOPC}  & codice di operazione illegale.\\
1936     \const{ILL\_ILLOPN}  & operando illegale.\\
1937     \const{ILL\_ILLADR}  & modo di indirizzamento illegale.\\
1938     \const{ILL\_ILLTRP}  & trappola di processore illegale.\\
1939     \const{ILL\_PRVOPC}  & codice di operazione privilegiato.\\
1940     \const{ILL\_PRVREG}  & registro privilegiato.\\
1941     \const{ILL\_COPROC}  & errore del coprocessore.\\
1942     \const{ILL\_BADSTK}  & errore nello stack interno.\\
1943     \hline
1944     \const{FPE\_INTDIV}  & divisione per zero intera.\\
1945     \const{FPE\_INTOVF}  & overflow intero.\\
1946     \const{FPE\_FLTDIV}  & divisione per zero in virgola mobile.\\
1947     \const{FPE\_FLTOVF}  & overflow in virgola mobile.\\
1948     \const{FPE\_FLTUND}  & underflow in virgola mobile.\\
1949     \const{FPE\_FLTRES}  & risultato in virgola mobile non esatto.\\
1950     \const{FPE\_FLTINV}  & operazione in virgola mobile non valida.\\
1951     \const{FPE\_FLTSUB}  & mantissa? fuori intervallo.\\
1952     \hline
1953     \const{SEGV\_MAPERR} & indirizzo non mappato.\\
1954     \const{SEGV\_ACCERR} & permessi non validi per l'indirizzo.\\
1955     \hline
1956     \const{BUS\_ADRALN}  & allineamento dell'indirizzo non valido.\\
1957     \const{BUS\_ADRERR}  & indirizzo fisico inesistente.\\
1958     \const{BUS\_OBJERR}  & errore hardware sull'indirizzo.\\
1959     \hline
1960     \const{TRAP\_BRKPT}  & breakpoint sul processo.\\
1961     \const{TRAP\_TRACE}  & trappola di tracciamento del processo.\\
1962     \hline
1963     \const{CLD\_EXITED}  & il figlio è uscito.\\
1964     \const{CLD\_KILLED}  & il figlio è stato terminato.\\
1965     \const{CLD\_DUMPED}  & il figlio è terminato in modo anormale.\\
1966     \const{CLD\_TRAPPED} & un figlio tracciato ha raggiunto una trappola.\\
1967     \const{CLD\_STOPPED} & il figlio è stato fermato.\\
1968     \const{CLD\_CONTINUED}& il figlio è ripartito.\\
1969     \hline
1970     \const{POLL\_IN}   & disponibili dati in ingresso.\\
1971     \const{POLL\_OUT}  & spazio disponibile sul buffer di uscita.\\
1972     \const{POLL\_MSG}  & disponibili messaggi in ingresso.\\
1973     \const{POLL\_ERR}  & errore di I/O.\\
1974     \const{POLL\_PRI}  & disponibili dati di alta priorità in ingresso.\\
1975     \const{POLL\_HUP}  & il dispositivo è stato disconnesso.\\
1976     \hline
1977   \end{tabular}
1978   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
1979     impostati rispettivamente dai segnali \signal{SIGILL}, \signal{SIGFPE},
1980     \signal{SIGSEGV}, \signal{SIGBUS}, \signal{SIGCHLD}, \signal{SIGTRAP} e
1981     \signal{SIGPOLL}/\signal{SIGIO}.}
1982   \label{tab:sig_si_code_special}
1983 \end{table}
1984
1985 Il resto della struttura \struct{siginfo\_t} è definito come \direct{union} ed i
1986 valori eventualmente presenti dipendono dal segnale, così \signal{SIGCHLD} ed i
1987 segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) inviati tramite
1988 \func{kill} avvalorano \var{si\_pid} e \var{si\_uid} coi valori corrispondenti
1989 al processo che ha emesso il segnale, \signal{SIGCHLD} avvalora anche i campi
1990 \var{si\_status}, \var{si\_utime} e \var{si\_stime} che indicano
1991 rispettivamente lo stato di uscita, l'\textit{user time} e il \textit{system
1992   time} (vedi sez.~\ref{sec:sys_cpu_times}) usati dal processo;
1993 \signal{SIGILL}, \signal{SIGFPE}, \signal{SIGSEGV} e \signal{SIGBUS} avvalorano
1994 \var{si\_addr} con l'indirizzo in cui è avvenuto l'errore, \signal{SIGIO} (vedi
1995 sez.~\ref{sec:file_asyncronous_io}) avvalora \var{si\_fd} con il numero del
1996 file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti
1997 (vedi sez.~\ref{sec:TCP_urgent_data}) su un socket, il segnale inviato alla
1998 scadenza di un timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}) avvalora i
1999 campi \var{si\_timerid} e \var{si\_overrun}.
2000
2001 Benché sia possibile usare nello stesso programma sia \func{sigaction} che
2002 \func{signal} occorre molta attenzione, in quanto le due funzioni possono
2003 interagire in maniera anomala. Infatti l'azione specificata con
2004 \struct{sigaction} contiene un maggior numero di informazioni rispetto al
2005 semplice indirizzo del gestore restituito da \func{signal}.  Per questo motivo
2006 se si usa quest'ultima per installare un gestore sostituendone uno
2007 precedentemente installato con \func{sigaction}, non sarà possibile effettuare
2008 un ripristino corretto dello stesso.
2009
2010 Per questo è sempre opportuno usare \func{sigaction}, che è in grado di
2011 ripristinare correttamente un gestore precedente, anche se questo è stato
2012 installato con \func{signal}. In generale poi non è il caso di usare il valore
2013 di ritorno di \func{signal} come campo \var{sa\_handler}, o viceversa, dato
2014 che in certi sistemi questi possono essere diversi. In definitiva dunque, a
2015 meno che non si sia vincolati all'aderenza stretta allo standard ISO C, è
2016 sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}.
2017
2018 \begin{figure}[!htbp]
2019   \footnotesize  \centering
2020   \begin{minipage}[c]{\codesamplewidth}
2021     \includecodesample{listati/Signal.c}
2022   \end{minipage} 
2023   \normalsize 
2024   \caption{La funzione \func{Signal}, equivalente a \func{signal}, definita
2025     attraverso \func{sigaction}.}
2026   \label{fig:sig_Signal_code}
2027 \end{figure}
2028
2029 Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata
2030 che abbia le stesse caratteristiche di \func{signal}, a definire attraverso
2031 \func{sigaction} una funzione equivalente \func{Signal}, il cui codice è
2032 riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si trova nel
2033 file \file{SigHand.c} nei sorgenti allegati).  Si noti come, essendo la
2034 funzione estremamente semplice, essa è definita come
2035 \direct{inline};\footnote{la direttiva \direct{inline} viene usata per dire al
2036   compilatore di trattare la funzione cui essa fa riferimento in maniera
2037   speciale inserendo il codice direttamente nel testo del programma.  Anche se
2038   i compilatori più moderni sono in grado di effettuare da soli queste
2039   manipolazioni (impostando le opportune ottimizzazioni) questa è una tecnica
2040   usata per migliorare le prestazioni per le funzioni piccole ed usate di
2041   frequente (in particolare nel kernel, dove in certi casi le ottimizzazioni
2042   dal compilatore, tarate per l'uso in user space, non sono sempre adatte). In
2043   tal caso infatti le istruzioni per creare un nuovo frame nello
2044   \itindex{stack} \textit{stack} per chiamare la funzione costituirebbero una
2045   parte rilevante del codice, appesantendo inutilmente il programma.
2046   Originariamente questo comportamento veniva ottenuto con delle macro, ma
2047   queste hanno tutta una serie di problemi di sintassi nel passaggio degli
2048   argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono
2049   essere evitati.} per semplificare ulteriormente la definizione si è poi
2050 definito un apposito tipo \texttt{SigFunc}.
2051
2052
2053
2054 \subsection{La gestione della \textsl{maschera dei segnali} o 
2055   \textit{signal mask}}
2056 \label{sec:sig_sigmask}
2057
2058 \itindbeg{signal~mask}
2059 Come spiegato in sez.~\ref{sec:sig_semantics} tutti i moderni sistemi unix-like
2060 permettono di bloccare temporaneamente (o di eliminare completamente,
2061 impostando \const{SIG\_IGN} come azione) la consegna dei segnali ad un
2062 processo. Questo è fatto specificando la cosiddetta \textsl{maschera dei
2063   segnali} (o \textit{signal mask}) del processo\footnote{nel caso di Linux
2064   essa è mantenuta dal campo \var{blocked} della \struct{task\_struct} del
2065   processo.} cioè l'insieme dei segnali la cui consegna è bloccata. Abbiamo
2066 accennato in sez.~\ref{sec:proc_fork} che la \textit{signal mask} viene
2067 ereditata dal padre alla creazione di un processo figlio, e abbiamo visto al
2068 paragrafo precedente che essa può essere modificata, durante l'esecuzione di
2069 un gestore, attraverso l'uso dal campo \var{sa\_mask} di \struct{sigaction}.
2070
2071 Uno dei problemi evidenziatisi con l'esempio di fig.~\ref{fig:sig_event_wrong}
2072 è che in molti casi è necessario proteggere delle sezioni di codice (nel caso
2073 in questione la sezione fra il controllo e la eventuale cancellazione del flag
2074 che testimoniava l'avvenuta occorrenza del segnale) in modo da essere sicuri
2075 che essi siano eseguite senza interruzioni.
2076
2077 Le operazioni più semplici, come l'assegnazione o il controllo di una
2078 variabile (per essere sicuri si può usare il tipo \type{sig\_atomic\_t}) di
2079 norma sono atomiche; quando si devono eseguire operazioni più complesse si può
2080 invece usare la funzione \funcd{sigprocmask} che permette di bloccare uno o
2081 più segnali; il suo prototipo è:
2082 \begin{prototype}{signal.h}
2083 {int sigprocmask(int how, const sigset\_t *set, sigset\_t *oldset)} 
2084   
2085   Cambia la \textsl{maschera dei segnali} del processo corrente.
2086   
2087   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
2088     errore, nel qual caso \var{errno} assumerà i valori:
2089   \begin{errlist}
2090   \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
2091   \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
2092   \end{errlist}}
2093 \end{prototype}
2094
2095 La funzione usa l'insieme di segnali dato all'indirizzo \param{set} per
2096 modificare la maschera dei segnali del processo corrente. La modifica viene
2097 effettuata a seconda del valore dell'argomento \param{how}, secondo le modalità
2098 specificate in tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un valore
2099 non nullo per \param{oldset} la maschera dei segnali corrente viene salvata a
2100 quell'indirizzo.
2101
2102 \begin{table}[htb]
2103   \footnotesize
2104   \centering
2105   \begin{tabular}[c]{|l|p{8cm}|}
2106     \hline
2107     \textbf{Valore} & \textbf{Significato} \\
2108     \hline
2109     \hline
2110     \const{SIG\_BLOCK}   & L'insieme dei segnali bloccati è l'unione fra
2111                            quello specificato e quello corrente.\\
2112     \const{SIG\_UNBLOCK} & I segnali specificati in \param{set} sono rimossi
2113                            dalla maschera dei segnali, specificare la
2114                            cancellazione di un segnale non bloccato è legale.\\
2115     \const{SIG\_SETMASK} & La maschera dei segnali è impostata al valore
2116                            specificato da \param{set}.\\
2117     \hline
2118   \end{tabular}
2119   \caption{Valori e significato dell'argomento \param{how} della funzione
2120     \func{sigprocmask}.}
2121   \label{tab:sig_procmask_how}
2122 \end{table}
2123
2124 In questo modo diventa possibile proteggere delle sezioni di codice bloccando
2125 l'insieme di segnali voluto per poi riabilitarli alla fine della
2126 \index{sezione~critica} sezione critica. La funzione permette di risolvere
2127 problemi come quelli mostrati in fig.~\ref{fig:sig_event_wrong}, proteggendo
2128 la sezione fra il controllo del flag e la sua cancellazione.
2129
2130 La funzione può essere usata anche all'interno di un gestore, ad esempio
2131 per riabilitare la consegna del segnale che l'ha invocato, in questo caso però
2132 occorre ricordare che qualunque modifica alla maschera dei segnali viene
2133 perduta alla conclusione del terminatore. 
2134
2135 Benché con l'uso di \func{sigprocmask} si possano risolvere la maggior parte
2136 dei casi di \itindex{race~condition} \textit{race condition} restano aperte
2137 alcune possibilità legate all'uso di \func{pause}; il caso è simile a quello
2138 del problema illustrato nell'esempio di fig.~\ref{fig:sig_sleep_incomplete}, e
2139 cioè la possibilità che il processo riceva il segnale che si intende usare per
2140 uscire dallo stato di attesa invocato con \func{pause} immediatamente prima
2141 dell'esecuzione di quest'ultima. Per poter effettuare atomicamente la modifica
2142 della maschera dei segnali (di solito attivandone uno specifico) insieme alla
2143 sospensione del processo lo standard POSIX ha previsto la funzione
2144 \funcd{sigsuspend}, il cui prototipo è:
2145 \begin{prototype}{signal.h}
2146 {int sigsuspend(const sigset\_t *mask)} 
2147   
2148   Imposta la \textit{signal mask} specificata, mettendo in attesa il processo.
2149   
2150   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
2151     errore, nel qual caso \var{errno} assumerà i valori:
2152   \begin{errlist}
2153   \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
2154   \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
2155   \end{errlist}}
2156 \end{prototype}
2157
2158 Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta
2159 l'esempio di implementazione di \code{sleep}. Abbiamo accennato in
2160 sez.~\ref{sec:sig_sigaction} come con \func{sigaction} sia possibile bloccare
2161 \signal{SIGALRM} nell'installazione dei gestori degli altri segnali, per poter
2162 usare l'implementazione vista in fig.~\ref{fig:sig_sleep_incomplete} senza
2163 interferenze.  Questo però comporta una precauzione ulteriore al semplice uso
2164 della funzione, vediamo allora come usando la nuova interfaccia è possibile
2165 ottenere un'implementazione, riportata in fig.~\ref{fig:sig_sleep_ok} che non
2166 presenta neanche questa necessità.
2167
2168 \begin{figure}[!htbp]
2169   \footnotesize \centering
2170   \begin{minipage}[c]{\codesamplewidth}
2171     \includecodesample{listati/sleep.c}
2172   \end{minipage} 
2173   \normalsize 
2174   \caption{Una implementazione completa di \func{sleep}.} 
2175   \label{fig:sig_sleep_ok}
2176 \end{figure}
2177  
2178 Per evitare i problemi di interferenza con gli altri segnali in questo caso
2179 non si è usato l'approccio di fig.~\ref{fig:sig_sleep_incomplete} evitando
2180 l'uso di \func{longjmp}. Come in precedenza il gestore (\texttt{\small 27-30})
2181 non esegue nessuna operazione, limitandosi a ritornare per interrompere il
2182 programma messo in attesa.
2183
2184 La prima parte della funzione (\texttt{\small 6-10}) provvede ad installare
2185 l'opportuno gestore per \signal{SIGALRM}, salvando quello originario, che
2186 sarà ripristinato alla conclusione della stessa (\texttt{\small 23}); il passo
2187 successivo è quello di bloccare \signal{SIGALRM} (\texttt{\small 11-14}) per
2188 evitare che esso possa essere ricevuto dal processo fra l'esecuzione di
2189 \func{alarm} (\texttt{\small 16}) e la sospensione dello stesso. Nel fare
2190 questo si salva la maschera corrente dei segnali, che sarà ripristinata alla
2191 fine (\texttt{\small 22}), e al contempo si prepara la maschera dei segnali
2192 \var{sleep\_mask} per riattivare \signal{SIGALRM} all'esecuzione di
2193 \func{sigsuspend}.  
2194
2195 In questo modo non sono più possibili \itindex{race~condition} \textit{race
2196   condition} dato che \signal{SIGALRM} viene disabilitato con
2197 \func{sigprocmask} fino alla chiamata di \func{sigsuspend}.  Questo metodo è
2198 assolutamente generale e può essere applicato a qualunque altra situazione in
2199 cui si deve attendere per un segnale, i passi sono sempre i seguenti:
2200 \begin{enumerate*}
2201 \item leggere la maschera dei segnali corrente e bloccare il segnale voluto
2202   con \func{sigprocmask};
2203 \item mandare il processo in attesa con \func{sigsuspend} abilitando la
2204   ricezione del segnale voluto;
2205 \item ripristinare la maschera dei segnali originaria.
2206 \end{enumerate*}
2207 Per quanto possa sembrare strano bloccare la ricezione di un segnale per poi
2208 riabilitarla immediatamente dopo, in questo modo si evita il
2209 \itindex{deadlock} deadlock dovuto all'arrivo del segnale prima
2210 dell'esecuzione di \func{sigsuspend}.
2211
2212 \itindend{signal~mask}
2213
2214
2215 \subsection{Criteri di programmazione per i gestori dei segnali}
2216 \label{sec:sig_signal_handler}
2217
2218 Abbiamo finora parlato dei gestori dei segnali come funzioni chiamate in
2219 corrispondenza della consegna di un segnale. In realtà un gestore non può
2220 essere una funzione qualunque, in quanto esso può essere eseguito in
2221 corrispondenza all'interruzione in un punto qualunque del programma
2222 principale, cosa che ad esempio può rendere problematico chiamare all'interno
2223 di un gestore di segnali la stessa funzione che dal segnale è stata
2224 interrotta.
2225
2226 \index{funzioni!sicure|(}
2227
2228 Il concetto è comunque più generale e porta ad una distinzione fra quelle che
2229 POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e
2230 \textsl{funzioni sicure} (o più precisamente \textit{signal safe function});
2231 quando un segnale interrompe una funzione insicura ed il gestore chiama al suo
2232 interno una funzione insicura il sistema può dare luogo ad un comportamento
2233 indefinito, la cosa non avviene invece per le funzioni sicure.
2234
2235 Tutto questo significa che la funzione che si usa come gestore di segnale deve
2236 essere programmata con molta cura per evirare questa evenienza e che non è
2237 possibile utilizzare al suo interno una qualunque funzione di sistema, se si
2238 vogliono evitare questi problemi si può ricorrere soltanto all'uso delle
2239 funzioni considerate sicure.
2240
2241 L'elenco delle funzioni considerate sicure varia a seconda della
2242 implementazione utilizzata e dello standard a cui si fa
2243 riferimento;\footnote{non è riportata una lista specifica delle funzioni
2244   sicure per Linux, si suppone pertanto che siano quelle richieste dallo
2245   standard.}  secondo quanto riportato dallo standard POSIX 1003.1 nella
2246 revisione del 2003, le ``\textit{signal safe function}'' che possono essere
2247 chiamate anche all'interno di un gestore di segnali sono tutte quelle della
2248 lista riportata in fig.~\ref{fig:sig_safe_functions}.
2249
2250 \begin{figure}[!htb]
2251   \footnotesize \centering
2252   \begin{minipage}[c]{14cm}
2253     \func{\_exit}, \func{abort}, \func{accept}, \func{access},
2254     \func{aio\_error} \func{aio\_return}, \func{aio\_suspend}, \func{alarm},
2255     \func{bind}, \func{cfgetispeed}, \func{cfgetospeed}, \func{cfsetispeed},
2256     \func{cfsetospeed}, \func{chdir}, \func{chmod}, \func{chown},
2257     \func{clock\_gettime}, \func{close}, \func{connect}, \func{creat},
2258     \func{dup}, \func{dup2}, \func{execle}, \func{execve}, \func{fchmod},
2259     \func{fchown}, \func{fcntl}, \func{fdatasync}, \func{fork},
2260     \func{fpathconf}, \func{fstat}, \func{fsync}, \func{ftruncate},
2261     \func{getegid}, \func{geteuid}, \func{getgid}, \func{getgroups},
2262     \func{getpeername}, \func{getpgrp}, \func{getpid}, \func{getppid},
2263     \func{getsockname}, \func{getsockopt}, \func{getuid}, \func{kill},
2264     \func{link}, \func{listen}, \func{lseek}, \func{lstat}, \func{mkdir},
2265     \func{mkfifo}, \func{open}, \func{pathconf}, \func{pause}, \func{pipe},
2266     \func{poll}, \funcm{posix\_trace\_event}, \func{pselect}, \func{raise},
2267     \func{read}, \func{readlink}, \func{recv}, \func{recvfrom},
2268     \func{recvmsg}, \func{rename}, \func{rmdir}, \func{select},
2269     \func{sem\_post}, \func{send}, \func{sendmsg}, \func{sendto},
2270     \func{setgid}, \func{setpgid}, \func{setsid}, \func{setsockopt},
2271     \func{setuid}, \func{shutdown}, \func{sigaction}, \func{sigaddset},
2272     \func{sigdelset}, \func{sigemptyset}, \func{sigfillset},
2273     \func{sigismember}, \func{signal}, \func{sigpause}, \func{sigpending},
2274     \func{sigprocmask}, \func{sigqueue}, \funcm{sigset}, \func{sigsuspend},
2275     \func{sleep}, \func{socket}, \func{socketpair}, \func{stat},
2276     \func{symlink}, \func{sysconf}, \func{tcdrain}, \func{tcflow},
2277     \func{tcflush}, \func{tcgetattr}, \func{tcgetgrp}, \func{tcsendbreak},
2278     \func{tcsetattr}, \func{tcsetpgrp}, \func{time}, \func{timer\_getoverrun},
2279     \func{timer\_gettime}, \func{timer\_settime}, \func{times}, \func{umask},
2280     \func{uname}, \func{unlink}, \func{utime}, \func{wait}, \func{waitpid},
2281     \func{write}.
2282   \end{minipage} 
2283   \normalsize 
2284   \caption{Elenco delle funzioni sicure secondo lo standard POSIX
2285     1003.1-2003.}
2286   \label{fig:sig_safe_functions}
2287 \end{figure}
2288
2289 \index{funzioni!sicure|)}
2290
2291 Lo standard POSIX.1-2004 modifica la lista di
2292 fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e
2293 \func{sockatmark}, mentre lo standard POSIX.1-2008 rimuove della lista le tre
2294 funzioni \func{fpathconf}, \func{pathconf}, \func{sysconf} e vi aggiunge le
2295 ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}.
2296
2297 \begin{figure}[!htb]
2298   \footnotesize \centering
2299   \begin{minipage}[c]{14cm}
2300      \func{execl}, \func{execv}, \func{faccessat}, \func{fchmodat},
2301      \func{fchownat}, \func{fexecve}, \func{fstatat}, \func{futimens},
2302      \func{linkat}, \func{mkdirat}, \func{mkfifoat}, \func{mknod},
2303      \func{mknodat}, \func{openat}, \func{readlinkat}, \func{renameat},
2304      \func{symlinkat}, \func{unlinkat}, \func{utimensat}, \func{utimes}.
2305   \end{minipage} 
2306   \normalsize 
2307   \caption{Ulteriori funzioni sicure secondo lo standard POSIX.1-2008.}
2308   \label{fig:sig_safe_functions_posix_2008}
2309 \end{figure}
2310
2311
2312 Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni
2313 effettuate all'interno di un gestore di segnali, qualora si debbano compiere
2314 operazioni complesse è sempre preferibile utilizzare la tecnica in cui si usa
2315 il gestore per impostare il valore di una qualche \index{variabili!globali}
2316 variabile globale, e poi si eseguono le operazioni complesse nel programma
2317 verificando (con tutti gli accorgimenti visti in precedenza) il valore di
2318 questa variabile tutte le volte che si è rilevata una interruzione dovuta ad
2319 un segnale.
2320
2321
2322 \section{Funzionalità avanzate}
2323 \label{sec:sig_advanced_signal}
2324
2325
2326 Tratteremo in questa ultima sezione alcune funzionalità avanzate relativa ai
2327 segnali ed in generale ai meccanismi di notifica, a partire dalla funzioni
2328 introdotte per la gestione dei cosiddetti ``\textsl{segnali real-time}'', alla
2329 gestione avanzata delle temporizzazioni e le nuove interfacce per la gestione
2330 di segnali ed eventi attraverso l'uso di file descriptor.
2331
2332 \subsection{I segnali \textit{real-time}}
2333 \label{sec:sig_real_time}
2334
2335 Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi
2336 \textit{real-time}, ha introdotto una estensione del modello classico dei
2337 segnali che presenta dei significativi miglioramenti,\footnote{questa
2338   estensione è stata introdotta in Linux a partire dal kernel 2.1.43, e dalle
2339   \acr{glibc} 2.1.} in particolare sono stati superati tre limiti fondamentali
2340 dei segnali classici:
2341 \begin{basedescript}{\desclabelwidth{1cm}\desclabelstyle{\nextlinelabel}}
2342 \item[I segnali non sono accumulati] 
2343   se più segnali vengono generati prima dell'esecuzione di un gestore
2344   questo sarà eseguito una sola volta, ed il processo non sarà in grado di
2345   accorgersi di quante volte l'evento che ha generato il segnale è accaduto;
2346 \item[I segnali non trasportano informazione]   
2347   i segnali classici non prevedono altra informazione sull'evento
2348   che li ha generati se non il fatto che sono stati emessi (tutta
2349   l'informazione che il kernel associa ad un segnale è il suo numero);
2350 \item[I segnali non hanno un ordine di consegna] 
2351   l'ordine in cui diversi segnali vengono consegnati è casuale e non
2352   prevedibile. Non è possibile stabilire una priorità per cui la reazione a
2353   certi segnali ha la precedenza rispetto ad altri.
2354 \end{basedescript}
2355
2356 Per poter superare queste limitazioni lo standard POSIX.1b ha introdotto delle
2357 nuove caratteristiche, che sono state associate ad una nuova classe di
2358 segnali, che vengono chiamati \textsl{segnali real-time}, in particolare le
2359 funzionalità aggiunte sono:
2360
2361 \begin{enumerate}
2362 \item i segnali sono inseriti in una coda che permette di consegnare istanze
2363   multiple dello stesso segnale qualora esso venga inviato più volte prima
2364   dell'esecuzione del gestore; si assicura così che il processo riceva un
2365   segnale per ogni occorrenza dell'evento che lo genera.
2366 \item è stata introdotta una priorità nella consegna dei segnali: i segnali
2367   vengono consegnati in ordine a seconda del loro valore, partendo da quelli
2368   con un numero minore, che pertanto hanno una priorità maggiore.
2369 \item è stata introdotta la possibilità di restituire dei dati al gestore,
2370   attraverso l'uso di un apposito campo \var{si\_value} nella struttura
2371   \struct{siginfo\_t}, accessibile tramite gestori di tipo
2372   \var{sa\_sigaction}.
2373 \end{enumerate}
2374
2375 Tutte queste nuove funzionalità eccetto l'ultima, che, come illustrato in
2376 sez.~\ref{sec:sig_sigaction}, è disponibile anche con i segnali ordinari, si
2377 applicano solo ai nuovi segnali \textit{real-time}; questi ultimi sono
2378 accessibili in un intervallo di valori specificati dalle due costanti
2379 \const{SIGRTMIN} e \const{SIGRTMAX}, che specificano il numero minimo e
2380 massimo associato ad un segnale \textit{real-time}.
2381
2382 Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1},
2383 che di norma (vale a dire sulla piattaforma i386) è 64. Questo dà un totale di
2384 32 segnali disponibili, contro gli almeno 8 richiesti da POSIX.1b. Si tenga
2385 presente però che i primi segnali \textit{real-time} disponibili vendono usati
2386 dalle \acr{glibc} per l'implementazione dei \textit{thread} POSIX (vedi
2387 sez.~\ref{sec:thread_posix_intro}), ed il valore di \const{SIGRTMIN} viene
2388 modificato di conseguenza.\footnote{vengono usati i primi tre per la vecchia
2389   implementazione dei \textit{LinuxThread} ed i primi due per la nuova NTPL
2390   (\textit{New Thread Posix Library}), il che comporta che \const{SIGRTMIN} a
2391   seconda dei casi può essere 34 o 35.}
2392
2393 Per questo motivo nei programmi che usano i segnali \textit{real-time} non si
2394 deve mai usare un valore assoluto dato che si correrebbe il rischio di
2395 utilizzare un segnale in uso alle librerie, ed il numero del segnale deve
2396 invece essere sempre specificato in forma relativa a \const{SIGRTMIN} (come
2397 \code{SIGRTMIN + n}) avendo inoltre cura di controllare di non aver mai
2398 superato \const{SIGRTMAX}.
2399
2400 I segnali con un numero più basso hanno una priorità maggiore e vengono
2401 consegnati per primi, inoltre i segnali \textit{real-time} non possono
2402 interrompere l'esecuzione di un gestore di un segnale a priorità più alta; la
2403 loro azione predefinita è quella di terminare il programma.  I segnali
2404 ordinari hanno tutti la stessa priorità, che è più alta di quella di qualunque
2405 segnale \textit{real-time}.\footnote{lo standard non definisce niente al
2406   riguardo ma Linux, come molte altre implementazioni, adotta questa
2407   politica.}
2408
2409 Si tenga presente che questi nuovi segnali non sono associati a nessun evento
2410 specifico, a meno di non richiedere specificamente il loro utilizzo in
2411 meccanismi di notifica come quelli per l'I/O asincrono (vedi
2412 sez.~\ref{sec:file_asyncronous_io}) o per le code di messaggi POSIX (vedi
2413 sez.~\ref{sec:ipc_posix_mq}); pertanto devono essere inviati esplicitamente.
2414
2415 Inoltre, per poter usufruire della capacità di restituire dei dati, i relativi
2416 gestori devono essere installati con \func{sigaction}, specificando per
2417 \var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare la
2418 forma estesa \var{sa\_sigaction} (vedi sez.~\ref{sec:sig_sigaction}).  In
2419 questo modo tutti i segnali \textit{real-time} possono restituire al gestore
2420 una serie di informazioni aggiuntive attraverso l'argomento
2421 \struct{siginfo\_t}, la cui definizione è stata già vista in
2422 fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa.
2423
2424 In particolare i campi utilizzati dai segnali \textit{real-time} sono
2425 \var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il
2426 \ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale, mentre
2427 per la restituzione dei dati viene usato il campo \var{si\_value}.
2428
2429 \begin{figure}[!htb]
2430   \footnotesize \centering
2431   \begin{minipage}[c]{\textwidth}
2432     \includestruct{listati/sigval_t.h}
2433   \end{minipage} 
2434   \normalsize 
2435   \caption{La definizione dell'unione \structd{sigval}, definita anche come
2436     tipo \type{sigval\_t}.}
2437   \label{fig:sig_sigval}
2438 \end{figure}
2439
2440 Questo è una \direct{union} di tipo \struct{sigval} (la sua definizione è in
2441 fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico,
2442 se usata nella forma \var{sival\_int}, o un indirizzo, se usata nella forma
2443 \var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
2444 vari meccanismi di notifica\footnote{un campo di tipo \type{sigval\_t} è
2445   presente anche nella struttura \struct{sigevent} (definita in
2446   fig.~\ref{fig:struct_sigevent}) che viene usata dai meccanismi di notifica
2447   come quelli per i timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}), l'I/O
2448   asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi
2449   POSIX (vedi sez.~\ref{sec:ipc_posix_mq}).} per restituire dati al gestore
2450 del segnale; in alcune definizioni essa viene identificata anche con
2451 l'abbreviazione \type{sigval\_t}.
2452
2453 A causa delle loro caratteristiche, la funzione \func{kill} non è adatta ad
2454 inviare segnali \textit{real-time}, poiché non è in grado di fornire alcun
2455 valore per \struct{sigval}; per questo motivo lo standard ha previsto una
2456 nuova funzione, \funcd{sigqueue}, il cui prototipo è:
2457 \begin{prototype}{signal.h}
2458   {int sigqueue(pid\_t pid, int signo, const union sigval value)}
2459   
2460   Invia il segnale \param{signo} al processo \param{pid}, restituendo al
2461   gestore il valore \param{value}.
2462   
2463   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
2464     errore, nel qual caso \var{errno} assumerà uno dei valori:
2465   \begin{errlist}
2466   \item[\errcode{EAGAIN}] la coda è esaurita, ci sono già
2467     \const{SIGQUEUE\_MAX} segnali in attesa si consegna.
2468   \item[\errcode{EPERM}] non si hanno privilegi appropriati per inviare il
2469     segnale al processo specificato.
2470   \item[\errcode{ESRCH}] il processo \param{pid} non esiste.
2471   \item[\errcode{EINVAL}] si è specificato un valore non valido per
2472     \param{signo}.
2473   \end{errlist}
2474   ed inoltre \errval{ENOMEM}.}
2475 \end{prototype}
2476
2477 Il comportamento della funzione è analogo a quello di \func{kill}, ed i
2478 privilegi occorrenti ad inviare il segnale ad un determinato processo sono gli
2479 stessi; un valore nullo di \param{signo} permette di verificare le condizioni
2480 di errore senza inviare nessun segnale.
2481
2482 Se il segnale è bloccato la funzione ritorna immediatamente, se si è
2483 installato un gestore con \const{SA\_SIGINFO} e ci sono risorse disponibili,
2484 (vale a dire che c'è posto nella coda dei segnali \textit{real-time}) esso
2485 viene inserito e diventa pendente; una volta consegnato riporterà nel campo
2486 \var{si\_code} di \struct{siginfo\_t} il valore \const{SI\_QUEUE} e il campo
2487 \var{si\_value} riceverà quanto inviato con \param{value}. Se invece si è
2488 installato un gestore nella forma classica il segnale sarà generato, ma tutte
2489 le caratteristiche tipiche dei segnali \textit{real-time} (priorità e coda)
2490 saranno perse.
2491
2492 Secondo lo standard POSIX la profondità della coda è indicata dalla costante
2493 \const{SIGQUEUE\_MAX},\footnote{una della tante costanti di sistema definite
2494   dallo standard POSIX che non abbiamo riportato esplicitamente in
2495   sez.~\ref{sec:sys_limits}.} il suo valore minimo secondo lo standard,
2496 \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una
2497 dimensione variabile; fino alla versione 2.6.7 c'era un limite massimo globale
2498 che poteva essere impostato come parametro del kernel in
2499 \sysctlfile{kernel/rtsig-max};\footnote{ed il valore predefinito era
2500   pari a 1024.} a partire dal kernel 2.6.8 il valore globale è stato rimosso e
2501 sostituito dalla risorsa \const{RLIMIT\_SIGPENDING} associata al singolo
2502 utente, che può essere modificata con \func{setrlimit} come illustrato in
2503 sez.~\ref{sec:sys_resource_limit}.
2504
2505 Lo standard POSIX.1b definisce inoltre delle nuove funzioni che permettono di
2506 gestire l'attesa di segnali specifici su una coda, esse servono in particolar
2507 modo nel caso dei \itindex{thread} \textit{thread}, in cui si possono usare i
2508 segnali \textit{real-time} come meccanismi di comunicazione elementare; la
2509 prima di queste funzioni è \funcd{sigwait}, il cui prototipo è:
2510 \begin{prototype}{signal.h}
2511   {int sigwait(const sigset\_t *set, int *sig)}
2512   
2513   Attende che uno dei segnali specificati in \param{set} sia pendente.
2514   
2515   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
2516     errore, nel qual caso \var{errno} assumerà uno dei valori:
2517   \begin{errlist}
2518   \item[\errcode{EINTR}] la funzione è stata interrotta.
2519   \item[\errcode{EINVAL}] si è specificato un valore non valido per
2520     \param{set}.
2521   \end{errlist}
2522   ed inoltre \errval{EFAULT}.}
2523 \end{prototype}
2524
2525 La funzione estrae dall'insieme dei segnali pendenti uno qualunque dei segnali
2526 specificati da \param{set}, il cui valore viene restituito in \param{sig}.  Se
2527 sono pendenti più segnali, viene estratto quello a priorità più alta (cioè con
2528 il numero più basso). Se, nel caso di segnali \textit{real-time}, c'è più di
2529 un segnale pendente, ne verrà estratto solo uno. Una volta estratto il segnale
2530 non verrà più consegnato, e se era in una coda il suo posto sarà liberato. Se
2531 non c'è nessun segnale pendente il processo viene bloccato fintanto che non ne
2532 arriva uno.
2533
2534 Per un funzionamento corretto la funzione richiede che alla sua chiamata i
2535 segnali di \param{set} siano bloccati. In caso contrario si avrebbe un
2536 conflitto con gli eventuali gestori: pertanto non si deve utilizzare per
2537 lo stesso segnale questa funzione e \func{sigaction}. Se questo non avviene il
2538 comportamento del sistema è indeterminato: il segnale può sia essere
2539 consegnato che essere ricevuto da \func{sigwait}, il tutto in maniera non
2540 prevedibile.
2541
2542 Lo standard POSIX.1b definisce altre due funzioni, anch'esse usate
2543 prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e
2544 \funcd{sigtimedwait}, i relativi prototipi sono:
2545 \begin{functions}
2546   \headdecl{signal.h}   
2547
2548   \funcdecl{int sigwaitinfo(const sigset\_t *set, siginfo\_t *info)}  
2549   
2550   Analoga a \func{sigwait}, ma riceve anche le informazioni associate al
2551   segnale in \param{info}.
2552   
2553   \funcdecl{int sigtimedwait(const sigset\_t *set, siginfo\_t *info, const
2554     struct timespec *timeout)}
2555   
2556   Analoga a \func{sigwaitinfo}, con un la possibilità di specificare un
2557   timeout in \param{timeout}.
2558
2559   
2560   \bodydesc{Le funzioni restituiscono 0 in caso di successo e $-1$ in caso di
2561     errore, nel qual caso \var{errno} assumerà uno dei valori già visti per
2562     \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}:
2563   \begin{errlist}
2564   \item[\errcode{EAGAIN}] si è superato il timeout senza che un segnale atteso
2565     fosse emesso.
2566   \end{errlist}
2567 }
2568 \end{functions}
2569
2570 Entrambe le funzioni sono estensioni di \func{sigwait}. La prima permette di
2571 ricevere, oltre al numero del segnale, anche le informazioni ad esso associate
2572 tramite \param{info}; in particolare viene restituito il numero del segnale
2573 nel campo \var{si\_signo}, la sua causa in \var{si\_code}, e se il segnale è
2574 stato immesso sulla coda con \func{sigqueue}, il valore di ritorno ad esso
2575 associato viene riportato in \var{si\_value}, che altrimenti è indefinito. 
2576
2577 La seconda è identica alla prima ma in più permette di specificare un timeout,
2578 scaduto il quale ritornerà con un errore. Se si specifica un puntatore nullo
2579 il comportamento sarà identico a \func{sigwaitinfo}, se si specifica un tempo
2580 di timeout nullo, e non ci sono segnali pendenti la funzione ritornerà
2581 immediatamente; in questo modo si può eliminare un segnale dalla coda senza
2582 dover essere bloccati qualora esso non sia presente.
2583
2584 \itindbeg{thread} 
2585
2586 L'uso di queste funzioni è principalmente associato alla gestione dei segnali
2587 con i \textit{thread}. In genere esse vengono chiamate dal \textit{thread}
2588 incaricato della gestione, che al ritorno della funzione esegue il codice che
2589 usualmente sarebbe messo nel gestore, per poi ripetere la chiamata per
2590 mettersi in attesa del segnale successivo. Questo ovviamente comporta che non
2591 devono essere installati gestori, che solo il \textit{thread} di gestione deve
2592 usare \func{sigwait} e che i segnali gestiti in questa maniera, per evitare
2593 che venga eseguita l'azione predefinita, devono essere mascherati per tutti i
2594 \textit{thread}, compreso quello dedicato alla gestione, che potrebbe
2595 riceverlo fra due chiamate successive.
2596
2597 \itindend{thread} 
2598
2599
2600 \subsection{La gestione avanzata delle temporizzazioni}
2601 \label{sec:sig_timer_adv}
2602
2603 Sia le funzioni per la gestione dei tempi viste in
2604 sez.~\ref{sec:sys_cpu_times} che quelle per la gestione dei timer di
2605 sez.~\ref{sec:sig_alarm_abort} sono state a lungo limitate dalla risoluzione
2606 massima dei tempi dell'orologio interno del kernel, che era quella ottenibile
2607 dal timer di sistema che governa lo \textit{scheduler},\footnote{e quindi
2608   limitate dalla frequenza dello stesso che si ricordi, come già illustrato in
2609   sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante
2610   \texttt{HZ}.} i contatori usati per il calcolo dei tempo infatti erano
2611 basati sul numero di \itindex{jiffies} \textit{jiffies} che vengono
2612 incrementati ad ogni \textit{clock tick} del timer di sistema.\footnote{il che
2613   comportava anche, come accennato in sez.~\ref{sec:sig_alarm_abort} per
2614   \func{setitimer}, problemi per il massimo periodo di tempo copribile da
2615   alcuni di questi orologi, come quelli associati al \textit{process time}
2616   almeno fino a quando, con il kernel 2.6.16, non è stato rimosso il limite di
2617   un valore a 32 bit per i \textit{jiffies}.}
2618
2619 Nelle architetture moderne però tutti i computer sono dotati di temporizzatori
2620 hardware che possono supportare risoluzioni molto elevate, ed in maniera del
2621 tutto indipendente dalla frequenza scelta per il timer di sistema che governa
2622 lo \textit{scheduler};\footnote{normalmente si possono ottenere precisioni
2623   fino al microsecondo, andando molto oltre in caso di hardware dedicato.} per
2624 questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni
2625 relative a quelli che vengono chiamati ``\textsl{orologi}
2626 \textit{real-time}'', in grado di supportare risoluzioni fino al
2627 nanosecondo. Inoltre le CPU più moderne sono dotate a loro volta di contatori
2628 ad alta definizione che consentono una grande accuratezza nella misura del
2629 tempo da esse dedicato all'esecuzione di un processo.
2630
2631 Per usare queste funzionalità ed ottenere risoluzioni temporali più accurate,
2632 occorre però un opportuno supporto da parte del kernel, ed i cosiddetti
2633 \textit{high resolution timer} che consentono di fare ciò sono stati
2634 introdotti nel kernel ufficiale solo a partire dalla versione
2635 2.6.21.\footnote{deve essere stata abilitata l'opzione di compilazione
2636   \texttt{CONFIG\_HIGH\_RES\_TIMERS}, erano però disponibili anche in
2637   precedenza come patch facenti parte dello sviluppo delle estensioni
2638   \textit{real-time} del kernel, per cui alcune distribuzioni possono avere
2639   questo supporto anche con versioni precedenti del kernel.} Le funzioni
2640 definite dallo standard POSIX per gestire orologi ad alta definizione però
2641 erano già presenti, essendo stata introdotte insieme ad altre funzioni per il
2642 supporto delle estensioni \textit{real-time} con il rilascio del kernel 2.6,
2643 ma la risoluzione effettiva era nominale.
2644
2645 A tutte le implementazioni che si rifanno a queste estensioni è richiesto di
2646 disporre di una versione \textit{real-time} almeno per l'orologio generale di
2647 sistema, quello che mantiene il \textit{calendar time} (vedi
2648 sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di
2649 secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The
2650   Epoch}).\footnote{si ricordi che l'orologio ordinario usato dal
2651   \textit{calendar time} riporta solo un numero di secondi, e che la
2652   risoluzione effettiva normalmente non raggiunge il nanosecondo (a meno di
2653   hardware specializzato).}  Oltre all'orologio generale di sistema possono
2654 essere presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali
2655 viene identificato da un opportuno valore di una variabile di tipo
2656 \type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in
2657 tab.~\ref{tab:sig_timer_clockid_types}.
2658
2659 \begin{table}[htb]
2660   \footnotesize
2661   \centering
2662   \begin{tabular}[c]{|l|p{8cm}|}
2663     \hline
2664     \textbf{Valore} & \textbf{Significato} \\
2665     \hline
2666     \hline
2667     \const{CLOCK\_REALTIME}     & Orologio \textit{real-time} di sistema, può
2668                                   essere impostato solo con privilegi
2669                                   amministrativi.\\ 
2670     \const{CLOCK\_MONOTONIC}    & Orologio che indica un tempo monotono
2671                                   crescente (a partire da un tempo iniziale non
2672                                   specificato) che non può essere modificato e
2673                                   non cambia neanche in caso di reimpostazione
2674                                   dell'orologio di sistema.\\
2675     \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli
2676                                   aggiustamenti dovuti all'uso di NTP (viene
2677                                   usato per fare riferimento ad una fonte
2678                                   hardware).\footnotemark\\
2679     \const{CLOCK\_PROCESS\_CPUTIME\_ID}& contatore del tempo di CPU usato 
2680                                   da un processo (il \textit{process time} di
2681                                   sez.~\ref{sec:sys_cpu_times}, nel totale di
2682                                   \textit{system time} e \textit{user time})
2683                                   comprensivo di tutto il tempo di CPU usato
2684                                   da eventuali \itindex{thread}
2685                                   \textit{thread}.\\
2686     \const{CLOCK\_THREAD\_CPUTIME\_ID}& contatore del tempo di CPU
2687                                   (\textit{user time} e \textit{system time})
2688                                   usato da un singolo \itindex{thread}
2689                                   \textit{thread}.\\
2690 %    \const{}   & .\\
2691     \hline
2692   \end{tabular}
2693   \caption{Valori possibili per una variabile di tipo \type{clockid\_t} 
2694     usata per indicare a quale tipo di orologio si vuole fare riferimento.}
2695   \label{tab:sig_timer_clockid_types}
2696 \end{table}
2697
2698 \footnotetext{specifico di Linux, introdotto a partire dal kernel 2.6.28, non
2699   previsto da POSIX e non presente in altri sistemi unix-like.}
2700
2701 % TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il
2702 % funzionamento, vedi http://lwn.net/Articles/429595/
2703 % TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME, vedi
2704 % http://lwn.net/Articles/429925/
2705 % TODP: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
2706 % CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/
2707
2708 Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la
2709 macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale
2710 di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i
2711 programmi che le usano devono essere collegati con la libreria delle
2712 estensioni \textit{real-time} usando esplicitamente l'opzione
2713 \texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste
2714 funzionalità avanzate può essere controllato dalla definizione della macro
2715 \macro{\_POSIX\_TIMERS} ad un valore maggiore di 0, e che le ulteriori macro
2716 \macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e
2717 \macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi
2718 di tipo \const{CLOCK\_MONOTONIC}, \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
2719 \const{CLOCK\_PROCESS\_CPUTIME\_ID}.\footnote{tutte queste macro sono definite
2720   in \headfile{unistd.h}, che pertanto deve essere incluso per poterle
2721   controllarle.} Infine se il kernel ha il supporto per gli \textit{high
2722   resolution timer} un elenco degli orologi e dei timer può essere ottenuto
2723 tramite il file \procfile{/proc/timer\_list}.
2724
2725 Le due funzioni che ci consentono rispettivamente di modificare o leggere il
2726 valore per uno degli orologi \textit{real-time} sono \funcd{clock\_settime} e
2727 \funcd{clock\_gettime}; i rispettivi prototipi sono:
2728 \begin{functions}
2729   \headdecl{time.h}
2730
2731   \funcdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
2732   \funcdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
2733   
2734   Imposta o legge un orologio \textit{real-time}.
2735   
2736   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
2737     errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
2738   \begin{errlist}
2739   \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è
2740     valido o il relativo orologio \textit{real-time} non è supportato dal
2741     sistema.
2742   \item[\errcode{EPERM}] non si ha il permesso di impostare l'orologio
2743     indicato (solo per \func{clock\_settime}).
2744   \item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido.
2745   \end{errlist}
2746 }
2747 \end{functions}
2748
2749 Entrambe le funzioni richiedono che si specifichi come primo argomento il tipo
2750 di orologio su cui si vuole operare con uno dei valori di
2751 tab.~\ref{tab:sig_timer_clockid_types} o con il risultato di una chiamata a
2752 \func{clock\_getcpuclockid} (che tratteremo a breve), il secondo argomento
2753 invece è sempre il puntatore \param{tp} ad una struttura \struct{timespec}
2754 (vedi fig.~\ref{fig:sys_timespec_struct}) che deve essere stata
2755 precedentemente allocata; nel primo caso questa dovrà anche essere stata
2756 inizializzata con il valore che si vuole impostare sull'orologio, mentre nel
2757 secondo verrà restituito al suo interno il valore corrente dello stesso.
2758
2759 Si tenga presente inoltre che per eseguire un cambiamento sull'orologio
2760 generale di sistema \const{CLOCK\_REALTIME} occorrono i privilegi
2761 amministrativi;\footnote{ed in particolare la \textit{capability}
2762   \const{CAP\_SYS\_TIME}.} inoltre ogni cambiamento ad esso apportato non avrà
2763 nessun effetto sulle temporizzazioni effettuate in forma relativa, come quelle
2764 impostate sulle quantità di \textit{process time} o per un intervallo di tempo
2765 da trascorrere, ma solo su quelle che hanno richiesto una temporizzazione ad
2766 un istante preciso (in termini di \textit{calendar time}). Si tenga inoltre
2767 presente che nel caso di Linux \const{CLOCK\_REALTIME} è l'unico orologio per
2768 cui si può effettuare una modifica, infatti nonostante lo standard preveda la
2769 possibilità di modifiche anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
2770 \const{CLOCK\_THREAD\_CPUTIME\_ID}, il kernel non le consente.
2771
2772 Oltre alle due funzioni precedenti, lo standard POSIX prevede una terza
2773 funzione che consenta di ottenere la risoluzione effettiva fornita da un certo
2774 orologio, la funzione è \funcd{clock\_getres} ed il suo prototipo è:
2775 \begin{functions}
2776   \headdecl{time.h}
2777
2778   \funcdecl{int clock\_getres(clockid\_t clockid, struct timespec *res)}
2779   
2780   Legge la risoluzione di un orologio \textit{real-time}.
2781   
2782   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
2783     errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
2784   \begin{errlist}
2785   \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è
2786     valido.
2787   \item[\errcode{EFAULT}] l'indirizzo di \param{res} non è valido.
2788   \end{errlist}
2789 }
2790 \end{functions}
2791
2792 La funzione richiede come primo argomento l'indicazione dell'orologio di cui
2793 si vuole conoscere la risoluzione (effettuata allo stesso modo delle due
2794 precedenti) e questa verrà restituita in una struttura \struct{timespec}
2795 all'indirizzo puntato dall'argomento \param{res}. 
2796
2797 Come accennato il valore di questa risoluzione dipende sia dall'hardware
2798 disponibile che dalla implementazione delle funzioni, e costituisce il limite
2799 minimo di un intervallo di tempo che si può indicare. Qualunque valore si
2800 voglia utilizzare nelle funzioni di impostazione che non corrisponda ad un
2801 multiplo intero di questa risoluzione, sarà troncato in maniera automatica. 
2802
2803 Si tenga presente inoltre che con l'introduzione degli \textit{high resolution
2804   timer} i due orologi \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
2805 \const{CLOCK\_THREAD\_CPUTIME\_ID} fanno riferimento ai contatori presenti in
2806 opportuni registri interni del processore; questo sui sistemi multiprocessore
2807 può avere delle ripercussioni sulla precisione delle misure di tempo che vanno
2808 al di là della risoluzione teorica ottenibile con \func{clock\_getres}, che
2809 può essere ottenuta soltanto quando si è sicuri che un processo (o un
2810 \textit{thread}) sia sempre stato eseguito sullo stesso processore.
2811
2812 Con i sistemi multiprocessore infatti ogni singola CPU ha i suoi registri
2813 interni, e se ciascuna di esse utilizza una base di tempo diversa (se cioè il
2814 segnale di temporizzazione inviato ai processori non ha una sola provenienza)
2815 in genere ciascuna di queste potrà avere delle frequenze leggermente diverse,
2816 e si otterranno pertanto dei valori dei contatori scorrelati fra loro, senza
2817 nessuna possibilità di sincronizzazione.
2818
2819 Il problema si presenta, in forma più lieve, anche se la base di tempo è la
2820 stessa, dato che un sistema multiprocessore non avvia mai tutte le CPU allo
2821 stesso istante, si potrà così avere di nuovo una differenza fra i contatori,
2822 soggetta però soltanto ad uno sfasamento costante. Per questo caso il kernel
2823 per alcune architetture ha del codice che consente di ridurre al minimo la
2824 differenza, ma non può essere comunque garantito che questa si annulli (anche
2825 se in genere risulta molto piccola e trascurabile nella gran parte dei casi).
2826
2827 Per poter gestire questo tipo di problematiche lo standard ha previsto una
2828 apposita funzione che sia in grado di ottenere l'identificativo dell'orologio
2829 associato al \textit{process time} di un processo, la funzione è
2830 \funcd{clock\_getcpuclockid} ed il suo prototipo è:
2831 \begin{functions}
2832   \headdecl{time.h}
2833
2834   \funcdecl{int clock\_getcpuclockid(pid\_t pid, clockid\_t *clockid)}
2835   
2836   Ottiene l'identificatore dell'orologio di CPU usato da un processo.
2837   
2838   \bodydesc{La funzione restituisce 0 in caso di successo o un numero positivo
2839     in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti
2840     valori:
2841   \begin{errlist}
2842   \item[\errcode{ENOSYS}] non c'è il supporto per ottenere l'orologio relativo
2843     al \textit{process time} di un altro processo, e \param{pid} non
2844     corrisponde al processo corrente.
2845   \item[\errcode{EPERM}] il chiamante non ha il permesso di accedere alle
2846     informazioni relative al processo \param{pid}.
2847   \item[\errcode{ESRCH}] non esiste il processo \param{pid}.
2848   \end{errlist}
2849 }
2850 \end{functions}
2851
2852
2853 La funzione ritorna l'identificativo di un orologio di sistema associato ad un
2854 processo indicato tramite l'argomento \param{pid}. Un utente normale, posto
2855 che il kernel sia sufficientemente recente da supportare questa funzionalità,
2856 può accedere soltanto ai dati relativi ai propri processi.
2857
2858 Del tutto analoga a \func{clock\_getcpuclockid}, ma da utilizzare per ottenere
2859 l'orologio associato ad un \textit{thread} invece che a un processo, è
2860 \funcd{pthread\_getcpuclockid},\footnote{per poter usare la funzione, come per
2861   qualunque funzione che faccia riferimento ai \textit{thread}, occorre
2862   effettuare il collegamento alla relativa libreria di gestione compilando il
2863   programma con \texttt{-lpthread}.} il cui prototipo è:
2864 \begin{functions}
2865   \headdecl{pthread.h}
2866   \headdecl{time.h}
2867
2868   \funcdecl{int pthread\_getcpuclockid(pthread\_t thread, clockid\_t *clockid)}
2869   
2870   Ottiene l'identificatore dell'orologio di CPU associato ad un
2871   \textit{thread}.
2872   
2873   \bodydesc{La funzione restituisce 0 in caso di successo o un numero positivo
2874     in caso di errore, nel qual caso \var{errno} assumerà uno dei seguenti
2875     valori:
2876   \begin{errlist}
2877   \item[\errcode{ENOENT}] la funzione non è supportata dal sistema.
2878   \item[\errcode{ESRCH}] non esiste il \textit{thread} identificato
2879     da \param{thread}.
2880   \end{errlist}
2881 }
2882 \end{functions}
2883
2884 % TODO, dal 2.6.39 aggiunta clock_adjtime 
2885 % TODO manca clock_nanosleep
2886
2887 Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile
2888 ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in
2889 sez.~\ref{sec:sig_alarm_abort} come l'interfaccia di \func{setitimer} derivata
2890 da BSD presenti delle serie limitazioni,\footnote{in particolare la
2891   possibilità di perdere un segnale sotto carico.} tanto che nello standard
2892 POSIX.1-2008 questa viene marcata come obsoleta, e ne viene fortemente
2893 consigliata la sostituzione con nuova interfaccia definita dallo standard
2894 POSIX.1-2001 che va sotto il nome di \textit{Posix Timer API}. Questa
2895 interfaccia è stata introdotta a partire dal kernel 2.6, anche se il supporto
2896 di varie funzionalità è stato aggiunto solo in un secondo tempo.
2897
2898 Una delle principali differenze della nuova interfaccia è che un processo può
2899 utilizzare un numero arbitrario di timer; questi vengono creati (ma non
2900 avviati) tramite la funzione \funcd{timer\_create}, il cui prototipo è:
2901 \begin{functions}
2902   \headdecl{signal.h}
2903   \headdecl{time.h}
2904
2905   \funcdecl{int timer\_create(clockid\_t clockid, struct sigevent *evp,
2906     timer\_t *timerid)}
2907   
2908   Crea un nuovo timer Posix.
2909   
2910   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
2911     errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
2912   \begin{errlist}
2913   \item[\errcode{EAGAIN}] fallimento nel tentativo di allocare le strutture
2914     dei timer.
2915   \item[\errcode{EINVAL}] uno dei valori specificati per \param{clockid} o per
2916     i campi \var{sigev\_notify}, \var{sigev\_signo} o
2917     \var{sigev\_notify\_thread\_id} di \param{evp} non è valido.
2918   \item[\errcode{ENOMEM}] errore di allocazione della memoria.
2919   \end{errlist}
2920 }
2921 \end{functions}
2922
2923 La funzione richiede tre argomenti: il primo argomento serve ad indicare quale
2924 tipo di orologio si vuole utilizzare e prende uno dei valori di
2925 tab.~\ref{tab:sig_timer_clockid_types},\footnote{di detti valori però non è
2926   previsto l'uso di \const{CLOCK\_MONOTONIC\_RAW} mentre
2927   \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_THREAD\_CPUTIME\_ID}
2928   sono disponibili solo a partire dal kernel 2.6.12.} si può così fare
2929 riferimento sia ad un tempo assoluto che al tempo utilizzato dal processo (o
2930 \textit{thread}) stesso. 
2931
2932 Il secondo argomento richiede una trattazione più dettagliata, in quanto
2933 introduce una struttura di uso generale, \struct{sigevent}, che viene
2934 utilizzata anche da altre funzioni, come quelle per l'I/O asincrono (vedi
2935 sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi
2936 sez.~\ref{sec:ipc_posix_mq})) e che serve ad indicare in maniera generica un
2937 meccanismo di notifica. 
2938
2939 \begin{figure}[!htb]
2940   \footnotesize \centering
2941   \begin{minipage}[c]{\textwidth}
2942     \includestruct{listati/sigevent.h}
2943   \end{minipage} 
2944   \normalsize 
2945   \caption{La struttura \structd{sigevent}, usata per specificare in maniera
2946     generica diverse modalità di notifica degli eventi.}
2947   \label{fig:struct_sigevent}
2948 \end{figure}
2949
2950 La struttura \struct{sigevent} (accessibile includendo \headfile{time.h}) è
2951 riportata in fig.~\ref{fig:struct_sigevent};\footnote{la definizione effettiva
2952   dipende dall'implementazione, quella mostrata è la versione descritta nella
2953   pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è
2954 il più importante essendo quello che indica le modalità della notifica, gli
2955 altri dipendono dal valore che si è specificato per \var{sigev\_notify}, si
2956 sono riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del
2957 meccanismo di notifica viene fatta impostando uno dei valori di
2958 tab.~\ref{tab:sigevent_sigev_notify} per \var{sigev\_notify}, e fornendo gli
2959 eventuali ulteriori argomenti necessari a secondo della scelta
2960 effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione
2961 (nel caso di uso dei \textit{thread}) di una funzione di modifica in un
2962 \textit{thread} dedicato.
2963
2964 \begin{table}[htb]
2965   \footnotesize
2966   \centering
2967   \begin{tabular}[c]{|l|p{10cm}|}
2968     \hline
2969     \textbf{Valore} & \textbf{Significato} \\
2970     \hline
2971     \hline
2972     \const{SIGEV\_NONE}    & Non viene inviata nessuna notifica.\\
2973     \const{SIGEV\_SIGNAL}  & La notifica viene effettuata inviando al processo
2974                              chiamante il segnale specificato dal campo
2975                              \var{sigev\_signo}; se il gestore di questo
2976                              segnale è stato installato con
2977                              \const{SA\_SIGINFO} gli verrà restituito il
2978                              valore specificato con \var{sigev\_value} (una
2979                              \direct{union} \texttt{sigval}, la cui definizione
2980                              è in fig.~\ref{fig:sig_sigval}) come valore del
2981                              campo \var{si\_value} di \struct{siginfo\_t}.\\
2982     \const{SIGEV\_THREAD}  & La notifica viene effettuata creando un nuovo
2983                              \itindex{thread} \textit{thread} che esegue la
2984                              funzione di notifica specificata da
2985                              \var{sigev\_notify\_function} con argomento
2986                              \var{sigev\_value}. Se questo è diverso da
2987                              \val{NULL}, il \textit{thread} viene creato con
2988                              gli attributi specificati da
2989                              \var{sigev\_notify\_attribute}.\footnotemark\\
2990     \const{SIGEV\_THREAD\_ID}& Invia la notifica come segnale (con le stesse
2991                              modalità di \const{SIGEV\_SIGNAL}) che però viene
2992                              recapitato al \textit{thread} indicato dal campo
2993                              \var{sigev\_notify\_thread\_id}. Questa modalità
2994                              è una estensione specifica di Linux, creata come
2995                              supporto per le librerie di gestione dei
2996                              \textit{thread}, pertanto non deve essere usata
2997                              da codice normale.\\
2998     \hline
2999   \end{tabular}
3000   \caption{Valori possibili per il campo \var{sigev\_notify} in una struttura
3001     \struct{sigevent}.} 
3002   \label{tab:sigevent_sigev_notify}
3003 \end{table}
3004
3005 \footnotetext{nel caso dei \textit{timer} questa funzionalità è considerata un
3006   esempio di pessima implementazione di una interfaccia, richiesta dallo
3007   standard POSIX, ma da evitare totalmente, a causa della possibilità di
3008   creare disservizi generando una gran quantità di processi, tanto che ne è
3009   stata richiesta addirittura la rimozione.}
3010
3011 Nel caso di \func{timer\_create} occorrerà passare alla funzione come secondo
3012 argomento l'indirizzo di una di queste strutture per indicare le modalità con
3013 cui si vuole essere notificati della scadenza del timer, se non si specifica
3014 nulla (passando un valore \val{NULL}) verrà inviato il segnale
3015 \signal{SIGALRM} al processo corrente, o per essere più precisi verrà
3016 utilizzato un valore equivalente all'aver specificato \const{SIGEV\_SIGNAL}
3017 per \var{sigev\_notify}, \signal{SIGALRM} per \var{sigev\_signo} e
3018 l'identificatore del timer come valore per \var{sigev\_value.sival\_int}.
3019
3020 Il terzo argomento deve essere l'indirizzo di una variabile di tipo
3021 \type{timer\_t} dove sarà scritto l'identificativo associato al timer appena
3022 creato, da usare in tutte le successive funzioni di gestione. Una volta creato
3023 questo identificativo resterà univoco all'interno del processo stesso fintanto
3024 che il timer non viene cancellato.
3025
3026 Si tenga presente che eventuali POSIX timer creati da un processo non vengono
3027 ereditati dai processi figli creati con \func{fork} e che vengono cancellati
3028 nella esecuzione di un programma diverso attraverso una delle funzioni
3029 \func{exec}. Si tenga presente inoltre che il kernel prealloca l'uso di un
3030 segnale \textit{real-time} per ciascun timer che viene creato con
3031 \func{timer\_create}; dato che ciascuno di essi richiede un posto nella coda
3032 dei segnali \textit{real-time}, il numero massimo di timer utilizzabili da un
3033 processo è limitato dalle dimensioni di detta coda, ed anche, qualora questo
3034 sia stato impostato, dal limite \const{RLIMIT\_SIGPENDING}.
3035
3036 Una volta creato il timer \func{timer\_create} ed ottenuto il relativo
3037 identificatore, si può attivare o disattivare un allarme (in gergo
3038 \textsl{armare} o \textsl{disarmare} il timer) con la funzione
3039 \funcd{timer\_settime}, il cui prototipo è:
3040 \begin{functions}
3041   \headdecl{signal.h}
3042   \headdecl{time.h}
3043
3044   \funcdecl{int timer\_settime(timer\_t timerid, int flags, const struct
3045     itimerspec *new\_value, struct itimerspec *old\_value)}
3046   
3047   Arma o disarma il timer POSIX.
3048   
3049   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
3050     errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
3051   \begin{errlist}
3052   \item[\errcode{EINVAL}] all'interno di \param{new\_value.value} si è
3053     specificato un tempo negativo o un numero di nanosecondi maggiore di
3054     999999999.
3055   \item[\errcode{EFAULT}] si è specificato un indirizzo non valido
3056     per \param{new\_value} o \param{old\_value}.
3057   \end{errlist}
3058 }
3059 \end{functions}
3060
3061 La funzione richiede che si indichi la scadenza del timer con
3062 l'argomento \param{new\_value}, che deve essere specificato come puntatore ad
3063 una struttura di tipo \struct{itimerspec}, la cui definizione è riportata in
3064 fig.~\ref{fig:struct_itimerspec}; se il puntatore \param{old\_value} è diverso
3065 da \val{NULL} il valore corrente della scadenza verrà restituito in una
3066 analoga struttura, ovviamente in entrambi i casi le strutture devono essere
3067 state allocate.
3068
3069 \begin{figure}[!htb]
3070   \footnotesize \centering
3071   \begin{minipage}[c]{\textwidth}
3072     \includestruct{listati/itimerspec.h}
3073   \end{minipage} 
3074   \normalsize 
3075   \caption{La struttura \structd{itimerspec}, usata per specificare la
3076     scadenza di un allarme.}
3077   \label{fig:struct_itimerspec}
3078 \end{figure}
3079
3080 Ciascuno dei due campi di \struct{itimerspec} indica un tempo, da specificare
3081 con una precisione fino al nanosecondo tramite una struttura \struct{timespec}
3082 (la cui definizione è riportata fig.~\ref{fig:sys_timespec_struct}). Il campo
3083 \var{it\_value} indica la prima scadenza dell'allarme. Di default, quando il
3084 valore di \param{flags} è nullo, questo valore viene considerato come un
3085 intervallo relativo al tempo corrente, il primo allarme scatterà cioè dopo il
3086 numero di secondi e nanosecondi indicati da questo campo. Se invece si usa
3087 per \param{flags} il valore \const{TIMER\_ABSTIME}, che al momento è l'unico
3088 valore valido per \param{flags}, allora \var{it\_value} viene considerato come
3089 un valore assoluto rispetto al valore usato dall'orologio a cui è associato il
3090 timer.\footnote{quindi a seconda dei casi lo si potrà indicare o come un tempo
3091   assoluto, quando si opera rispetto all'orologio di sistema (nel qual caso il
3092   valore deve essere in secondi e nanosecondi dalla \textit{epoch}) o come
3093   numero di secondi o nanosecondi rispetto alla partenza di un orologio di
3094   CPU, quando si opera su uno di questi.}  Infine un valore nullo di
3095 \var{it\_value}, dover per nullo si intende con valori nulli per entrambi i
3096 campi \var{tv\_sec} e \var{tv\_nsec}, può essere utilizzato, indipendentemente
3097 dal tipo di orologio utilizzato, per disarmare l'allarme.
3098
3099 Il campo \var{it\_interval} di \struct{itimerspec} viene invece utilizzato per
3100 impostare un allarme periodico.  Se il suo valore è nullo, se cioè sono nulli
3101 tutti e due i due campi \var{tv\_sec} e \var{tv\_nsec} di detta struttura
3102 \struct{timespec}, l'allarme scatterà una sola volta secondo quando indicato
3103 con \var{it\_value}, altrimenti il valore specificato nella struttura verrà
3104 preso come l'estensione del periodo di ripetizione della generazione
3105 dell'allarme, che proseguirà indefinitamente fintanto che non si disarmi il
3106 timer.
3107
3108 Se il timer era già stato armato la funzione sovrascrive la precedente
3109 impostazione, se invece si indica come prima scadenza un tempo già passato,
3110 l'allarme verrà notificato immediatamente e al contempo verrà incrementato il
3111 contatore dei superamenti. Questo contatore serve a fornire una indicazione al
3112 programma che riceve l'allarme su un eventuale numero di scadenze che sono
3113 passate prima della ricezione della notifica dell'allarme. 
3114
3115 É infatti possibile, qualunque sia il meccanismo di notifica scelto, che
3116 quest'ultima venga ricevuta dopo che il timer è scaduto più di una
3117 volta.\footnote{specialmente se si imposta un timer con una ripetizione a
3118   frequenza elevata.} Nel caso dell'uso di un segnale infatti il sistema mette
3119 in coda un solo segnale per timer,\footnote{questo indipendentemente che si
3120   tratti di un segnale ordinario o \textit{real-time}; per questi ultimi
3121   sarebbe anche possibile inviare un segnale per ogni scadenza, questo però
3122   non viene fatto per evitare il rischio, tutt'altro che remoto, di riempire
3123   la coda.}  e se il sistema è sotto carico o se il segnale è bloccato, prima
3124 della sua ricezione può passare un intervallo di tempo sufficientemente lungo
3125 ad avere scadenze multiple, e lo stesso può accadere anche se si usa un
3126 \textit{thread} di notifica. 
3127
3128 Per questo motivo il gestore del segnale o il \textit{thread} di notifica può
3129 ottenere una indicazione di quante volte il timer è scaduto dall'invio della
3130 notifica utilizzando la funzione \funcd{timer\_getoverrun}, il cui prototipo è:
3131 \begin{functions}
3132   \headdecl{time.h}
3133
3134   \funcdecl{int timer\_getoverrun(timer\_t timerid)}
3135   
3136   Ottiene il numero di scadenze di un timer POSIX.
3137   
3138   \bodydesc{La funzione restituisce il numero di scadenze di un timer in caso
3139     di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà
3140     il valore:
3141   \begin{errlist}
3142   \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
3143   \end{errlist}
3144 }
3145 \end{functions}
3146
3147 La funzione ritorna il numero delle scadenze avvenute, che può anche essere
3148 nullo se non ve ne sono state. Come estensione specifica di Linux,\footnote{in
3149   realtà lo standard POSIX.1-2001 prevede gli \textit{overrun} solo per i
3150   segnali e non ne parla affatto in riferimento ai \textit{thread}.}  quando
3151 si usa un segnale come meccanismo di notifica, si può ottenere direttamente
3152 questo valore nel campo \var{si\_overrun} della struttura \struct{siginfo\_t}
3153 (illustrata in fig.~\ref{fig:sig_siginfo_t}) restituita al gestore del segnale
3154 installato con \func{sigaction}; in questo modo non è più necessario eseguire
3155 successivamente una chiamata a questa funzione per ottenere il numero delle
3156 scadenze. Al gestore del segnale viene anche restituito, come ulteriore
3157 informazione, l'identificativo del timer, in questo caso nel campo
3158 \var{si\_timerid}.
3159
3160 Qualora si voglia rileggere lo stato corrente di un timer, ed ottenere il
3161 tempo mancante ad una sua eventuale scadenza, si deve utilizzare la funzione
3162 \funcd{timer\_gettime}, il cui prototipo è:
3163 \begin{functions}
3164   \headdecl{time.h}
3165
3166   \funcdecl{int timer\_gettime(timer\_t timerid, int flags, struct
3167     itimerspec *curr\_value)}
3168   
3169   Legge lo stato di un timer POSIX.
3170   
3171   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
3172     errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
3173   \begin{errlist}
3174   \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
3175   \item[\errcode{EFAULT}] si è specificato un indirizzo non valido
3176     per \param{curr\_value}.
3177   \end{errlist}
3178 }
3179 \end{functions}
3180
3181 La funzione restituisce nella struttura \struct{itimerspec} puntata
3182 da \param{curr\_value} il tempo restante alla prossima scadenza nel campo
3183 \var{it\_value}. Questo tempo viene sempre indicato in forma relativa, anche
3184 nei casi in cui il timer era stato precedentemente impostato con
3185 \const{TIMER\_ABSTIME} indicando un tempo assoluto.  Il ritorno di un valore
3186 nullo nel campo \var{it\_value} significa che il timer è disarmato o è
3187 definitivamente scaduto. 
3188
3189 Nel campo \var{it\_interval} di \param{curr\_value} viene invece restituito,
3190 se questo era stato impostato, il periodo di ripetizione del timer.  Anche in
3191 questo caso il ritorno di un valore nullo significa che il timer non era stato
3192 impostato per una ripetizione e doveva operare, come suol dirsi, a colpo
3193 singolo (in gergo \textit{one shot}).
3194
3195 Infine, quando un timer non viene più utilizzato, lo si può cancellare,
3196 rimuovendolo dal sistema e recuperando le relative risorse, effettuando in
3197 sostanza l'operazione inversa rispetto a \funcd{timer\_create}. Per questo
3198 compito lo standard prevede una apposita funzione \funcd{timer\_delete}, il
3199 cui prototipo è:
3200 \begin{functions}
3201   \headdecl{time.h}
3202
3203   \funcdecl{int timer\_delete(timer\_t timerid)}
3204   
3205   Cancella un timer POSIX.
3206   
3207   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
3208     errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
3209     \begin{errlist}
3210     \item[\errcode{EINVAL}] \param{timerid} non indica un timer valido.
3211     \end{errlist}
3212 }
3213 \end{functions}
3214
3215 La funzione elimina il timer identificato da \param{timerid}, disarmandolo se
3216 questo era stato attivato. Nel caso, poco probabile ma comunque possibile, che
3217 un timer venga cancellato prima della ricezione del segnale pendente per la
3218 notifica di una scadenza, il comportamento del sistema è indefinito.
3219
3220 \subsection{Ulteriori funzioni di gestione}
3221 \label{sec:sig_specific_features}
3222
3223 In questo ultimo paragrafo esamineremo le rimanenti funzioni di gestione dei
3224 segnali non descritte finora, relative agli aspetti meno utilizzati e più
3225 ``\textsl{esoterici}'' della interfaccia.
3226
3227 La prima di queste funzioni è \funcd{sigpending}, anch'essa introdotta dallo
3228 standard POSIX.1; il suo prototipo è:
3229 \begin{prototype}{signal.h}
3230 {int sigpending(sigset\_t *set)} 
3231   
3232 Scrive in \param{set} l'insieme dei segnali pendenti.
3233   
3234   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
3235     errore.}
3236 \end{prototype}
3237
3238 La funzione permette di ricavare quali sono i segnali pendenti per il processo
3239 in corso, cioè i segnali che sono stati inviati dal kernel ma non sono stati
3240 ancora ricevuti dal processo in quanto bloccati. Non esiste una funzione
3241 equivalente nella vecchia interfaccia, ma essa è tutto sommato poco utile,
3242 dato che essa può solo assicurare che un segnale è stato inviato, dato che
3243 escluderne l'avvenuto invio al momento della chiamata non significa nulla
3244 rispetto a quanto potrebbe essere in un qualunque momento successivo.
3245
3246 Una delle caratteristiche di BSD, disponibile anche in Linux, è la possibilità
3247 di usare uno \itindex{stack} \textit{stack} alternativo per i segnali; è cioè
3248 possibile fare usare al sistema un altro \itindex{stack} \textit{stack}
3249 (invece di quello relativo al processo, vedi sez.~\ref{sec:proc_mem_layout})
3250 solo durante l'esecuzione di un gestore.  L'uso di uno \textit{stack}
3251 alternativo è del tutto trasparente ai gestori, occorre però seguire una certa
3252 procedura:
3253 \begin{enumerate*}
3254 \item allocare un'area di memoria di dimensione sufficiente da usare come
3255   \textit{stack} alternativo;
3256 \item usare la funzione \func{sigaltstack} per rendere noto al sistema
3257   l'esistenza e la locazione dello \textit{stack} alternativo;
3258 \item quando si installa un gestore occorre usare \func{sigaction}
3259   specificando il flag \const{SA\_ONSTACK} (vedi tab.~\ref{tab:sig_sa_flag})
3260   per dire al sistema di usare lo \textit{stack} alternativo durante
3261   l'esecuzione del gestore.
3262 \end{enumerate*}
3263
3264 In genere il primo passo viene effettuato allocando un'opportuna area di
3265 memoria con \code{malloc}; in \headfile{signal.h} sono definite due costanti,
3266 \const{SIGSTKSZ} e \const{MINSIGSTKSZ}, che possono essere utilizzate per
3267 allocare una quantità di spazio opportuna, in modo da evitare overflow. La
3268 prima delle due è la dimensione canonica per uno \itindex{stack}
3269 \textit{stack} di segnali e di norma è sufficiente per tutti gli usi normali.
3270
3271 La seconda è lo spazio che occorre al sistema per essere in grado di lanciare
3272 il gestore e la dimensione di uno \textit{stack} alternativo deve essere
3273 sempre maggiore di questo valore. Quando si conosce esattamente quanto è lo
3274 spazio necessario al gestore gli si può aggiungere questo valore per allocare
3275 uno \itindex{stack} \textit{stack} di dimensione sufficiente.
3276
3277 Come accennato, per poter essere usato, lo \itindex{stack} \textit{stack} per
3278 i segnali deve essere indicato al sistema attraverso la funzione
3279 \funcd{sigaltstack}; il suo prototipo è:
3280 \begin{prototype}{signal.h}
3281 {int sigaltstack(const stack\_t *ss, stack\_t *oss)}
3282   
3283 Installa un nuovo \textit{stack} per i segnali.
3284   
3285   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
3286     errore, nel qual caso \var{errno} assumerà i valori:
3287
3288   \begin{errlist}
3289   \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo
3290     \textit{stack} è minore di \const{MINSIGSTKSZ}.
3291   \item[\errcode{EPERM}] uno degli indirizzi non è valido.
3292   \item[\errcode{EFAULT}] si è cercato di cambiare lo \textit{stack}
3293     alternativo mentre questo è attivo (cioè il processo è in esecuzione su di
3294     esso).
3295   \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un
3296   valore diverso da zero che non è \const{SS\_DISABLE}.
3297   \end{errlist}}
3298 \end{prototype}
3299
3300 La funzione prende come argomenti puntatori ad una struttura di tipo
3301 \var{stack\_t}, definita in fig.~\ref{fig:sig_stack_t}. I due valori
3302 \param{ss} e \param{oss}, se non nulli, indicano rispettivamente il nuovo
3303 \itindex{stack} \textit{stack} da installare e quello corrente (che viene
3304 restituito dalla funzione per un successivo ripristino).
3305
3306 \begin{figure}[!htb]
3307   \footnotesize \centering
3308   \begin{minipage}[c]{\textwidth}
3309     \includestruct{listati/stack_t.h}
3310   \end{minipage} 
3311   \normalsize 
3312   \caption{La struttura \structd{stack\_t}.} 
3313   \label{fig:sig_stack_t}
3314 \end{figure}
3315
3316 Il campo \var{ss\_sp} di \struct{stack\_t} indica l'indirizzo base dello
3317 \itindex{stack} \textit{stack}, mentre \var{ss\_size} ne indica la dimensione;
3318 il campo \var{ss\_flags} invece indica lo stato dello \textit{stack}.
3319 Nell'indicare un nuovo \textit{stack} occorre inizializzare \var{ss\_sp} e
3320 \var{ss\_size} rispettivamente al puntatore e alla dimensione della memoria
3321 allocata, mentre \var{ss\_flags} deve essere nullo.  Se invece si vuole
3322 disabilitare uno \textit{stack} occorre indicare \const{SS\_DISABLE} come
3323 valore di \var{ss\_flags} e gli altri valori saranno ignorati.
3324
3325 Se \param{oss} non è nullo verrà restituito dalla funzione indirizzo e
3326 dimensione dello \itindex{stack} \textit{stack} corrente nei relativi campi,
3327 mentre \var{ss\_flags} potrà assumere il valore \const{SS\_ONSTACK} se il
3328 processo è in esecuzione sullo \textit{stack} alternativo (nel qual caso non è
3329 possibile cambiarlo) e \const{SS\_DISABLE} se questo non è abilitato.
3330
3331 In genere si installa uno \itindex{stack} \textit{stack} alternativo per i
3332 segnali quando si teme di avere problemi di esaurimento dello \textit{stack}
3333 standard o di superamento di un limite (vedi
3334 sez.~\ref{sec:sys_resource_limit}) imposto con chiamate del tipo
3335 \code{setrlimit(RLIMIT\_STACK, \&rlim)}.  In tal caso infatti si avrebbe un
3336 segnale di \signal{SIGSEGV}, che potrebbe essere gestito soltanto avendo
3337 abilitato uno \itindex{stack} \textit{stack} alternativo.
3338
3339 Si tenga presente che le funzioni chiamate durante l'esecuzione sullo
3340 \textit{stack} alternativo continueranno ad usare quest'ultimo, che, al
3341 contrario di quanto avviene per lo \itindex{stack} \textit{stack} ordinario
3342 dei processi, non si accresce automaticamente (ed infatti eccederne le
3343 dimensioni può portare a conseguenze imprevedibili).  Si ricordi infine che
3344 una chiamata ad una funzione della famiglia \func{exec} cancella ogni
3345 \textit{stack} alternativo.
3346
3347 Abbiamo visto in fig.~\ref{fig:sig_sleep_incomplete} come si possa usare
3348 \func{longjmp} per uscire da un gestore rientrando direttamente nel corpo
3349 del programma; sappiamo però che nell'esecuzione di un gestore il segnale
3350 che l'ha invocato viene bloccato, e abbiamo detto che possiamo ulteriormente
3351 modificarlo con \func{sigprocmask}. 
3352
3353 Resta quindi il problema di cosa succede alla maschera dei segnali quando si
3354 esce da un gestore usando questa funzione. Il comportamento dipende
3355 dall'implementazione; in particolare la semantica usata da BSD prevede che sia
3356 ripristinata la maschera dei segnali precedente l'invocazione, come per un
3357 normale ritorno, mentre quella usata da System V no.
3358
3359 Lo standard POSIX.1 non specifica questo comportamento per \func{setjmp} e
3360 \func{longjmp}, ed il comportamento delle \acr{glibc} dipende da quale delle
3361 caratteristiche si sono abilitate con le macro viste in
3362 sez.~\ref{sec:intro_gcc_glibc_std}.
3363
3364 Lo standard POSIX però prevede anche la presenza di altre due funzioni
3365 \funcd{sigsetjmp} e \funcd{siglongjmp}, che permettono di decidere quale dei
3366 due comportamenti il programma deve assumere; i loro prototipi sono:
3367 \begin{functions}
3368   \headdecl{setjmp.h} 
3369   
3370   \funcdecl{int sigsetjmp(sigjmp\_buf env, int savesigs)} Salva il contesto
3371   dello \textit{stack} per un \index{salto~non-locale} salto non-locale.
3372  
3373   \funcdecl{void siglongjmp(sigjmp\_buf env, int val)} Esegue un salto
3374   non-locale su un precedente contesto.
3375
3376   \bodydesc{Le due funzioni sono identiche alle analoghe \func{setjmp} e
3377     \func{longjmp} di sez.~\ref{sec:proc_longjmp}, ma consentono di specificare
3378     il comportamento sul ripristino o meno della maschera dei segnali.}
3379 \end{functions}
3380
3381 Le due funzioni prendono come primo argomento la variabile su cui viene
3382 salvato il contesto dello \itindex{stack} \textit{stack} per permettere il
3383 \index{salto~non-locale} salto non-locale; nel caso specifico essa è di tipo
3384 \type{sigjmp\_buf}, e non \type{jmp\_buf} come per le analoghe di
3385 sez.~\ref{sec:proc_longjmp} in quanto in questo caso viene salvata anche la
3386 maschera dei segnali.
3387
3388 Nel caso di \func{sigsetjmp}, se si specifica un valore di \param{savesigs}
3389 diverso da zero la maschera dei valori sarà salvata in \param{env} e
3390 ripristinata in un successivo \func{siglongjmp}; quest'ultima funzione, a
3391 parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a
3392 \func{longjmp}.
3393
3394
3395 % TODO: se e quando si troverà un argomento adeguato inserire altre funzioni
3396 % sparse attinenti ai segnali, al momento sono note solo:
3397 % * sigreturn (funzione interna, scarsamente interessante)
3398 % argomento a priorità IDLE (fare quando non resta niente altro da trattare)
3399
3400
3401 % LocalWords:  kernel POSIX timer shell control ctrl kill raise signal handler
3402 % LocalWords:  reliable unreliable fig race condition sez struct process table
3403 % LocalWords:  delivered pending scheduler sigpending l'I suspend SIGKILL wait
3404 % LocalWords:  SIGSTOP sigaction waitpid dump stack debugger nell'header NSIG
3405 % LocalWords:  tab BSD SUSv SIGHUP PL Hangup SIGINT Interrupt SIGQUIT Quit AEF
3406 % LocalWords:  SIGILL SIGABRT abort SIGFPE SIGSEGV SIGPIPE SIGALRM alarm SIGUSR
3407 % LocalWords:  SIGTERM SIGCHLD SIGCONT SIGTSTP SIGTTIN SIGTTOU SIGBUS bad SL of
3408 % LocalWords:  memory access SIGPOLL Pollable event Sys SIGIO SIGPROF profiling
3409 % LocalWords:  SIGSYS SVID SIGTRAP breakpoint SIGURG urgent socket Virtual IOT
3410 % LocalWords:  clock SIGXCPU SIGXFSZ SIGIOT trap SIGEMT SIGSTKFLT SIGCLD SIGPWR
3411 % LocalWords:  SIGINFO SIGLOST lock NFS SIGWINCH Sun SIGUNUSED fault point heap
3412 % LocalWords:  exception l'overflow illegal instruction overflow segment error
3413 % LocalWords:  violation system call interrupt INTR hang SIGVTALRM virtual SUSP
3414 % LocalWords:  profilazione fcntl descriptor sleep interactive Broken FIFO lost
3415 % LocalWords:  EPIPE Resource advisory client limit exceeded size window change
3416 % LocalWords:  strsignal psignal SOURCE strerror string char int signum perror
3417 % LocalWords:  void sig const sys siglist L'array decr fork exec DFL IGN ioctl
3418 % LocalWords:  EINTR glibc TEMP FAILURE RETRY expr multitasking SVr sighandler
3419 % LocalWords:  ERR libc bsd sysv XOPEN EINVAL pid errno ESRCH EPERM getpid init
3420 % LocalWords:  killpg pidgrp group unistd unsigned seconds all' setitimer which
3421 % LocalWords:  itimerval value ovalue EFAULT ITIMER it interval timeval ms VIRT
3422 % LocalWords:  getitimer stdlib stream atexit exit usleep long usec nanosleep
3423 % LocalWords:  timespec req rem HZ scheduling SCHED RR SigHand forktest WNOHANG
3424 % LocalWords:  deadlock longjmp setjmp sigset sigemptyset sigfillset sigaddset
3425 % LocalWords:  sigdelset sigismember act oldact restorer mask NOCLDSTOP ONESHOT
3426 % LocalWords:  RESETHAND RESTART NOMASK NODEFER ONSTACK sigcontext union signo
3427 % LocalWords:  siginfo bits uid addr fd inline like blocked atomic sigprocmask
3428 % LocalWords:  how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc
3429 % LocalWords:  SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB
3430 % LocalWords:  RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr
3431 % LocalWords:  SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl safe tp
3432 % LocalWords:  QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB bind
3433 % LocalWords:  function accept return cfgetispeed cfgetospeed cfsetispeed chdir
3434 % LocalWords:  cfsetospeed chmod chown gettime close connect creat dup execle
3435 % LocalWords:  execve fchmod fchown fdatasync fpathconf fstat fsync ftruncate
3436 % LocalWords:  getegid geteuid getgid getgroups getpeername getpgrp getppid sem
3437 % LocalWords:  getsockname getsockopt getuid listen lseek lstat mkdir mkfifo tv
3438 % LocalWords:  pathconf poll posix pselect read readlink recv recvfrom recvmsg
3439 % LocalWords:  rename rmdir select send sendmsg sendto setgid setpgid setsid
3440 % LocalWords:  setsockopt setuid shutdown sigpause socketpair stat symlink page
3441 % LocalWords:  sysconf tcdrain tcflow tcflush tcgetattr tcgetgrp tcsendbreak
3442 % LocalWords:  tcsetattr tcsetpgrp getoverrun times umask uname unlink utime
3443 % LocalWords:  write sival SIVGTALRM NOCLDWAIT MESGQ ASYNCIO TKILL tkill tgkill
3444 % LocalWords:  ILL ILLOPC ILLOPN ILLADR ILLTRP PRVOPC PRVREG COPROC BADSTK FPE
3445 % LocalWords:  INTDIV INTOVF FLTDIV FLTOVF FLTUND underflow FLTRES FLTINV SEGV
3446 % LocalWords:  FLTSUB MAPERR ACCERR ADRALN ADRERR OBJERR BRKPT CLD EXITED MSG
3447 % LocalWords:  KILLED DUMPED TRAPPED STOPPED CONTINUED PRI HUP SigFunc jiffies
3448 % LocalWords:  SEC unsafe sockatmark execl execv faccessat fchmodat fchownat
3449 % LocalWords:  fexecve fstatat futimens linkat mkdirat mkfifoat mknod mknodat
3450 % LocalWords:  openat readlinkat renameat symlinkat unlinkat utimensat utimes
3451 % LocalWords:  LinuxThread NTPL Library clockid evp timerid sigev notify high
3452 % LocalWords:  resolution CONFIG RES patch REALTIME MONOTONIC RAW NTP CPUTIME
3453 % LocalWords:  tick calendar The Epoch list getcpuclockid capability CAP getres
3454 % LocalWords:  ENOSYS pthread ENOENT NULL attribute itimerspec new old ABSTIME
3455 % LocalWords:  epoch multiplexing overrun res lpthread sec nsec curr one shot
3456 % LocalWords:  delete
3457
3458
3459 %%% Local Variables: 
3460 %%% mode: latex
3461 %%% TeX-master: "gapil"
3462 %%% End: