Ancora
[gapil.git] / session.tex
1  \chapter{Sessioni di lavoro e terminali}
2 \label{cha:session}
3
4 Esamineremo in questo capitolo i concetti base del sistema delle sessioni di
5 lavoro, vale a dire il metodo con cui il kernel gestisce l'accesso concorrente
6 al sistema da parte di più utenti, permettendo loro di eseguire più programmi
7 in contemporanea.  Nella seconda parte del capitolo tratteremo poi il
8 funzionamento dell'I/O su terminale, e delle varie peculiarità che esso viene
9 ad assumere a causa del suo stretto legame con le modalità di accesso al
10 sistema da parte degli utenti.
11
12
13 \section{Il \textit{job control}}
14 \label{sec:sess_job_control}
15
16 Viene comunemente chiamato \textit{job control} quell'insieme di funzionalità
17 il cui scopo è quello di permettere ad un utente di poter sfruttare le
18 capacità multitasking di un sistema Unix per eseguire in contemporanea più
19 processi, pur potendo accedere, di solito, ad un solo terminale,\footnote{con
20   X e con i terminali virtuali tutto questo non è più vero, dato che si può
21   accedere a molti terminali in contemporanea da una singola postazione di
22   lavoro, ma il sistema è nato prima dell'esistenza di tutto ciò.} avendo cioè
23 un solo punto in cui si può avere accesso all'input ed all'output degli
24 stessi.
25
26
27 \subsection{Una panoramica introduttiva}
28 \label{sec:sess_job_control_overview}
29
30 Il \textit{job control} è una caratteristica opzionale, introdotta in BSD
31 negli anni '80, e successivamente standardizzata da POSIX.1; la sua
32 disponibilità nel sistema è verificabile attraverso il controllo della macro
33 \macro{\_POSIX\_JOB\_CONTROL}. In generale il \textit{job control} richiede il
34 supporto sia da parte della shell (quasi tutte ormai lo fanno), che da parte
35 del kernel; in particolare il kernel deve assicurare sia la presenza di un
36 driver per i terminali abilitato al \textit{job control} che quella dei
37 relativi segnali illustrati in \secref{sec:sig_job_control}. 
38
39 In un sistema che supporta il \textit{job control}, una volta completato il
40 login, l'utente avrà a disposizione una shell dalla quale eseguire i comandi e
41 potrà iniziare quella che viene chiamata una \textsl{sessione}, che riunisce
42 (vedi \secref{sec:sess_proc_group}) tutti i processi eseguiti all'interno
43 dello stesso login (esamineremo tutto il processo in dettaglio in
44 \secref{sec:sess_login}).
45
46 Siccome la shell è collegata ad un solo terminale, che viene usualmente
47 chiamato \textsl{terminale di controllo}, (vedi \secref{sec:sess_ctrl_term})
48 un solo comando alla volta (quello che viene detto in \textit{foreground}),
49 potrà scrivere e leggere dal terminale. La shell però può eseguire anche più
50 comandi in contemporanea, mandandoli in \textit{background} (aggiungendo una
51 \cmd{\&} alla fine del comando), nel qual caso essi saranno eseguiti senza
52 essere collegati al terminale.
53
54 Si noti come si sia parlato di comandi e non di programmi o processi; fra le
55 funzionalità della shell infatti c'è anche quella di consentire di concatenare
56 più programmi in una sola riga di comando con le pipe, ed in tal caso verranno
57 eseguiti più programmi, inoltre, anche quando si invoca un singolo programma,
58 questo potrà sempre lanciare sottoprocessi per eseguire dei compiti specifici.
59
60 Per questo l'esecuzione di un comando può originare più di un processo; quindi
61 nella gestione del job control non si può far riferimento ai singoli processi.
62 Per questo il kernel prevede la possibilità di raggruppare più processi in un
63 \textit{process group} (detto anche \textsl{raggruppamento di processi}, vedi
64 \secref{sec:sess_proc_group}) e la shell farà sì che tutti i processi che
65 originano da una riga di comando appartengano allo stesso raggruppamento, in
66 modo che le varie funzioni di controllo, ed i segnali inviati dal terminale,
67 possano fare riferimento ad esso.
68
69 In generale allora all'interno di una sessione avremo un eventuale (può non
70 esserci) \textit{process group} in \textit{foreground}, che riunisce i
71 processi che possono accedere al terminale, e più \textit{process group} in
72 \textit{background}, che non possono accedervi. Il job control prevede che
73 quando un processo appartenente ad un raggruppamento in \textit{background}
74 cerca di accedere al terminale, venga inviato un segnale a tutti i processi
75 del raggruppamento, in modo da bloccarli (vedi \secref{sec:sess_ctrl_term}).
76
77 Un comportamento analogo si ha anche per i segnali generati dai comandi di
78 tastiera inviati dal terminale che vengono inviati a tutti i processi del
79 raggruppamento in \textit{foreground}. In particolare \cmd{C-z} interrompe
80 l'esecuzione del comando, che può poi essere mandato in \textit{background}
81 con il comando \cmd{bg}.\footnote{si tenga presente che \cmd{bg} e \cmd{fg}
82   sono parole chiave che indicano comandi interni alla shell, e nel caso non
83   comportano l'esecuzione di un programma esterno.} Il comando \cmd{fg}
84 consente invece di mettere in \textit{foreground} un comando precedentemente
85 lanciato in \textit{background}.
86
87 Di norma la shell si cura anche di notificare all'utente (di solito prima
88 della stampa a video del prompt) lo stato dei vari processi; essa infatti sarà
89 in grado, grazie all'uso di \func{waitpid}, di rilevare sia i processi che
90 sono terminati, sia i raggruppamenti che sono bloccati (in questo caso usando
91 l'opzione \macro{WUNTRACED}, secondo quanto illustrato in
92 \secref{sec:proc_wait}).
93
94
95 \subsection{I \textit{process group} e le \textsl{sessioni}}
96 \label{sec:sess_proc_group}
97
98 Come accennato in \secref{sec:sess_job_control_overview} nel job control i
99 processi vengono raggruppati in \textit{process group} e \textit{sessioni};
100 per far questo vengono utilizzati due ulteriori identificatori (oltre quelli
101 visti in \secref{sec:proc_pid}) che il kernel associa a ciascun
102 processo:\footnote{in Linux questi identificatori sono mantenuti nei campi
103   \var{pgrp} e \var{session} della struttura \var{task\_struct} definita in
104   \file{sched.h}.}  l'identificatore del \textit{process group} e
105 l'identificatore della \textsl{sessione}, che vengono indicati rispettivamente
106 con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo
107 \type{pid\_t}. I valori di questi identificatori possono essere visualizzati
108 dal comando \cmd{ps} usando l'opzione \cmd{-j}.
109
110 Un \textit{process group} è pertanto definito da tutti i processi che hanno lo
111 stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con
112 le funzioni \func{getpgid} e \func{getpgrp},\footnote{\func{getpgrp} è
113   definita nello standard POSIX.1, mentre \func{getpgid} è richiesta da SVr4.}
114 i cui prototipi sono:
115 \begin{functions}
116   \headdecl{unistd.h}
117
118   \funcdecl{pid\_t getpgid(pid\_t pid)} 
119   Legge il \acr{pgid} del processo \param{pid}.
120
121   \funcdecl{pid\_t getpgrp(void)}
122   Legge il \acr{pgid} del processo corrente.
123   
124   \bodydesc{Le funzioni restituiscono il \acr{pgid} del processo,
125     \func{getpgrp} ha sempre successo, mentre \func{getpgid} restituisce -1
126     ponendo \var{errno} a \macro{ESRCH} se il processo selezionato non esiste.}
127 \end{functions}
128
129 La funzione \func{getpgid} permette di specificare il \acr{pid} del processo
130 di cui si vuole sapere il \acr{pgid}; un valore nullo per \param{pid}
131 restituisce il \acr{pgid} del processo corrente; \func{getpgrp} è di norma
132 equivalente a \code{getpgid(0)}.
133
134 In maniera analoga l'identificatore della sessione può essere letto dalla
135 funzione \func{getsid}, che però nelle \acr{glibc}\footnote{la system call è
136   stata introdotta in Linux a partire dalla versione 1.3.44, il supporto nelle
137   librerie del C è iniziato dalla versione 5.2.19. La funzione non è prevista
138   da POSIX.1, che parla solo di processi leader di sessione, e non di
139   identificatori di sessione.} è accessibile solo definendo
140 \macro{\_XOPEN\_SOURCE} e \macro{\_XOPEN\_SOURCE\_EXTENDED}; il suo prototipo
141 è:
142 \begin{prototype}{unistd.h}{pid\_t getsid(pid\_t pid)}
143   Legge l'identificatore di sessione del processo \param{pid}.
144   
145   \bodydesc{La funzione restituisce l'identificatore (un numero positivo) in
146   caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà
147   i valori:
148     \begin{errlist}
149     \item[\macro{ESRCH}] Il processo selezionato non esiste.
150     \item[\macro{EPERM}] In alcune implementazioni viene restituito quando il
151       processo selezionato non fa parte della stessa sessione del processo
152       corrente.
153     \end{errlist}
154   }
155 \end{prototype}
156
157 Entrambi gli identificatori vengono inizializzati alla creazione di ciascun
158 processo con lo stesso valore che hanno nel processo padre, per cui un
159 processo appena creato appartiene sempre allo stesso raggruppamento e alla
160 stessa sessione del padre. Vedremo poi come sia possibile creare più
161 \textit{process group} all'interno della stessa sessione, e spostare i
162 processi dall'uno all'altro, ma sempre all'interno di una stessa sessione.
163
164 Ciascun raggruppamento di processi ha sempre un processo principale, il
165 cosiddetto \textit{process group leader}, che è identificato dall'avere un
166 \acr{pgid} uguale al suo \acr{pid}, in genere questo è il primo processo del
167 raggruppamento, che si incarica di lanciare tutti gli altri. Un nuovo
168 raggruppamento si crea con la funzione \func{setpgrp},\footnote{questa è la
169   definizione di POSIX.1, BSD definisce una funzione con lo stesso nome, che
170   però è identica a \func{setpgid}; nelle \acr{glibc} viene sempre usata
171   sempre questa definizione, a meno di non richiedere esplicitamente la
172   compatibilità all'indietro con BSD, definendo la macro
173   \macro{\_BSD\_SOURCE}.} il cui prototipo è:
174 \begin{prototype}{unistd.h}{int setpgrp(void)}
175   Modifica il \acr{pgid} al valore del \acr{pid} del processo corrente.
176   
177   \bodydesc{La funzione restituisce il valore del nuovo \textit{process
178       group}.}
179 \end{prototype}
180
181 La funzione, assegnando al \acr{pgid} il valore del \acr{pid} processo
182 corrente, rende questo \textit{group leader} di un nuovo raggruppamento, tutti
183 i successivi processi da esso creati apparterranno (a meno di non cambiare di
184 nuovo il \acr{pgid}) al nuovo raggruppamento. È possibile invece spostare un
185 processo da un raggruppamento ad un altro con la funzione \func{setpgid}, il
186 cui prototipo è:
187 \begin{prototype}{unistd.h}{int setpgid(pid\_t pid, pid\_t pgid)}
188   Assegna al \acr{pgid} del processo \param{pid} il valore \param{pgid}.
189   
190   \bodydesc{La funzione ritorna il valore del nuovo \textit{process group}, e
191   -1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
192     \begin{errlist}
193     \item[\macro{ESRCH}] Il processo selezionato non esiste.
194     \item[\macro{EPERM}] Il cambiamento non è consentito.
195     \item[\macro{EACCESS}] Il processo ha già eseguito una \func{exec}.
196     \item[\macro{EINVAL}] Il valore di \param{pgid} è negativo.
197     \end{errlist}
198  }
199 \end{prototype}
200
201 La funzione permette di cambiare il \acr{pgid} del processo \param{pid}, ma il
202 cambiamento può essere effettuato solo se \param{pgid} indica un
203 \textit{process group} che è nella stessa sessione del processo chiamante.
204 Inoltre la funzione può essere usata soltanto sul processo corrente o su uno
205 dei suoi figli, ed in quest'ultimo caso ha successo soltanto se questo non ha
206 ancora eseguito una \func{exec}.\footnote{questa caratteristica è implementata
207   dal kernel che mantiene allo scopo un altro campo, \var{did\_exec}, in
208   \var{task\_struct}.}  Specificando un valore nullo per \param{pid} si indica
209 il processo corrente, mentre specificando un valore nullo per \param{pgid} si
210 imposta il \textit{process group} al valore del \acr{pid} del processo
211 selezionato; pertanto \func{setpgrp} è equivalente a \code{setpgid(0, 0)}.
212
213 Di norma questa funzione viene usata dalla shell quando si usano delle
214 pipeline, per mettere nello stesso process group tutti i programmi lanciati su
215 ogni linea di comando; essa viene chiamata dopo una \func{fork} sia dal
216 processo padre, per impostare il valore nel figlio, che da quest'ultimo, per
217 sé stesso, in modo che il cambiamento di \textit{process group} sia immediato
218 per entrambi; una delle due chiamate sarà ridondante, ma non potendo
219 determinare quale dei due processi viene eseguito per primo, occorre eseguirle
220 comunque entrambe per evitare di esporsi ad una race condition. 
221
222 Si noti come nessuna delle funzioni esaminate finora permetta di spostare un
223 processo da una sessione ad un altra; infatti l'unico modo di far cambiare
224 sessione ad un processo è quello di crearne una nuova con l'uso di
225 \func{setsid}; il suo prototipo è:
226 \begin{prototype}{unistd.h}{pid\_t setsid(void)}
227   Crea una nuova sessione sul processo corrente impostandone \acr{sid} e
228   \acr{pgid}.
229   
230   \bodydesc{La funzione ritorna il valore del nuovo \acr{sid}, e -1 in caso di
231     errore, il solo errore possibile è \macro{EPERM}, che si ha quando il
232     \acr{pgid} e \acr{pid} del processo coincidono.}
233 \end{prototype}
234
235 La funzione imposta il \acr{pgid} ed il \acr{sid} del processo corrente al
236 valore del suo \acr{pid}, creando così una nuova sessione ed un nuovo
237 \textit{process group} di cui esso diventa leader (come per i \textit{process
238   group} un processo si dice leader di sessione\footnote{in Linux la proprietà
239   è mantenuta in maniera indipendente con un apposito campo \var{leader} in
240   \var{task\_struct}.} se il suo \acr{sid} è uguale al suo \acr{pid}) ed unico
241 componente.  Inoltre la funzione distacca il processo da ogni terminale di
242 controllo (torneremo sull'argomento in \secref{sec:sess_ctrl_term}) cui fosse
243 in precedenza associato.
244
245   funzione ha successo soltanto se il processo non è già leader di un
246 \textit{process group}, per cui per usarla di norma si esegue una \func{fork}
247 e si esce, per poi chiamare \func{setsid} nel processo figlio, in modo che,
248 avendo questo lo stesso \acr{pgid} del padre ma un \acr{pid} diverso, non ci
249 siano possibilità di errore.\footnote{potrebbe sorgere il dubbio che, per il
250   riutilizzo dei valori dei \acr{pid} fatto nella creazione dei nuovi processi
251   (vedi \secref{sec:proc_pid}), il figlio venga ad assumere un valore
252   corrispondente ad un process group esistente; questo viene evitato dal
253   kernel che considera come disponibili per un nuovo \acr{pid} solo valori che
254   non corrispondono ad altri \acr{pid}, \acr{pgid} o \acr{sid} in uso nel
255   sistema.} Questa funzione viene usata di solito nel processo di login (per i
256 dettagli vedi \secref{sec:sess_login}) per raggruppare in una sessione tutti i
257 comandi eseguiti da un utente dalla sua shell.
258
259
260
261 \subsection{Il terminale di controllo e il controllo di sessione}
262 \label{sec:sess_ctrl_term}
263
264 Come accennato in \secref{sec:sess_job_control_overview}, nel sistema del
265 \textit{job control} i processi all'interno di una sessione fanno riferimento
266 ad un terminale di controllo (ad esempio quello su cui si è effettuato il
267 login), sul quale effettuano le operazioni di lettura e
268 scrittura,\footnote{nel caso di login grafico la cosa può essere più
269   complessa, e di norma l'I/O è effettuato tramite il server X, ma ad esempio
270   per i programmi, anche grafici, lanciati da un qualunque emulatore di
271   terminale, sarà quest'ultimo a fare da terminale (virtuale) di controllo.} e
272 dal quale ricevono gli eventuali segnali da tastiera.
273
274 A tale scopo lo standard POSIX.1 prevede che ad ogni sessione possa essere
275 associato un terminale di controllo; in Linux questo viene realizzato
276 mantenendo fra gli attributi di ciascun processo anche qual'è il suo terminale
277 di controllo. \footnote{Lo standard POSIX.1 non specifica nulla riguardo
278   l'implementazione; in Linux anch'esso viene mantenuto nella solita struttura
279   \var{task\_struct}, nel campo \var{tty}.}  In generale ogni processo eredita
280 dal padre, insieme al \acr{pgid} e al \acr{sid} anche il terminale di
281 controllo (vedi \secref{sec:proc_fork}). In questo modo tutti processi
282 originati dallo stesso leader di sessione mantengono lo stesso terminale di
283 controllo.
284
285 Alla creazione di una nuova sessione con \func{setsid} ogni associazione con
286 il precedente terminale di controllo viene cancellata, ed il processo che è
287 divenuto un nuovo leader di sessione dovrà riottenere\footnote{solo quando ciò
288   è necessario, cosa che, come vedremo in \secref{sec:sess_daemon}, non è
289   sempre vera.}, un terminale di controllo. In generale questo viene fatto
290 automaticamente dal sistema\footnote{a meno di non avere richiesto
291   esplicitamente che questo non diventi un terminale di controllo con il flag
292   \macro{O\_NOCTTY} (vedi \secref{sec:file_open}). In questo Linux segue la
293   semantica di SVr4; BSD invece richiede che il terminale venga allocato
294   esplicitamente con una \func{ioctl} con il comando \macro{TIOCSCTTY}.}
295 quando viene aperto il primo terminale (cioè uno dei vari file di dispositivo
296 \file{/dev/tty*}) che diventa automaticamente il terminale di controllo,
297 mentre il processo diventa il \textsl{processo di controllo} di quella
298 sessione.
299
300 In genere (a meno di redirezioni) nelle sessioni di lavoro questo terminale è
301 associato ai file standard (di input, output ed error) dei processi nella
302 sessione, ma solo quelli che fanno parte del cosiddetto raggruppamento di
303 \textit{foreground}, possono leggere e scrivere in certo istante. Per
304 impostare il raggruppamento di \textit{foreground} di un terminale si usa la
305 funzione \func{tcsetpgrp}, il cui prototipo è:
306 \begin{functions}
307   \headdecl{unistd.h}
308   \headdecl{termios.h}
309   
310   \funcdecl{int tcsetpgrp(int fd, pid\_t pgrpid)} Imposta a \param{pgrpid} il
311   \textit{process group} di \textit{foreground} del terminale associato al
312   file descriptor \param{fd}.
313    
314   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
315     errore, nel qual caso \var{errno} assumerà i valori:
316     \begin{errlist}
317     \item[\macro{ENOTTY}] Il file \param{fd} non corrisponde al terminale di
318       controllo del processo chiamante.
319     \item[\macro{ENOSYS}] Il sistema non supporta il job control.
320     \item[\macro{EPERM}] Il \textit{process group} specificato non è nella
321     stessa sessione del processo chiamante.
322     \end{errlist}
323     ed inoltre \macro{EBADF} ed \macro{EINVAL}. 
324   }
325 \end{functions}
326 \noindent la funzione può essere eseguita con successo solo da
327 un processo nella stessa sessione e con lo stesso terminale di controllo. 
328
329 Come accennato in \secref{sec:sess_job_control_overview}, tutti i processi (e
330 relativi raggruppamenti) che non fanno parte del gruppo di \textit{foreground}
331 sono detti in \textit{background}; se uno si essi cerca di accedere al
332 terminale di controllo provocherà l'invio da parte del kernel di uno dei due
333 segnali \macro{SIGTTIN} o \macro{SIGTTOU} (a seconda che l'accesso sia stato
334 in lettura o scrittura) a tutto il suo \textit{process group}; dato che il
335 comportamento di default di questi segnali (si riveda quanto esposto in
336 \secref{sec:sig_job_control}) è di fermare il processo, di norma questo
337 comporta che tutti i membri del gruppo verranno fermati, ma non si avranno
338 condizioni di errore.\footnote{la shell in genere notifica comunque un
339   avvertimento, avvertendo la presenza di processi bloccati grazie all'uso di
340   \func{waitpid}.} Se però si bloccano o ignorano i due segnali citati, le
341 funzioni di lettura e scrittura falliranno con un errore di \macro{EIO}.
342
343 Un processo può controllare qual'è il gruppo di \textit{foreground} associato
344 ad un terminale con la funzione \func{tcgetpgrp}, il cui prototipo è:
345 \begin{functions}
346   \headdecl{unistd.h} \headdecl{termios.h}
347   
348   \funcdecl{pid\_t tcgetpgrp(int fd)} Legge il \textit{process group} di
349   \textit{foreground} del terminale associato al file descriptor \param{fd}.
350   \bodydesc{La funzione restituisce in caso di successo il \acr{pgid} del
351     gruppo di \textit{foreground}, e -1 in caso di errore, nel qual caso
352     \var{errno} assumerà i valori:
353     \begin{errlist}
354     \item[\macro{ENOTTY}] Non c'è un terminale di controllo o \param{fd} non
355       corrisponde al terminale di controllo del processo chiamante.
356     \end{errlist}
357     ed inoltre \macro{EBADF} ed \macro{ENOSYS}. 
358   }
359 \end{functions}
360
361 Si noti come entrambe le funzioni usino come argomento il valore di un file
362 descriptor, il risultato comunque non dipende dal file descriptor che si usa
363 ma solo dal terminale cui fa riferimento; il kernel inoltre permette a ciascun
364 processo di accedere direttamente al suo terminale di controllo attraverso il
365 file speciale \file{/dev/tty}, che per ogni processo è un sinonimo per il
366 proprio terminale di controllo.  Questo consente anche a processi che possono
367 aver rediretto l'output di accedere al terminale di controllo, pur non
368 disponendo più del file descriptor originario; un caso tipico è il programma
369 \cmd{crypt} che accetta la redirezione sullo standard input di un file da
370 decifrare, ma deve poi leggere la password dal terminale.
371
372 Un'altra caratteristica del terminale di controllo usata nel job control è che
373 utilizzando su di esso le combinazioni di tasti speciali (\cmd{C-z},
374 \cmd{C-c}, \cmd{C-y} e \verb|C-\|) si farà sì che il kernel invii i
375 corrispondenti segnali (rispettivamente \macro{SIGTSTP}, \macro{SIGINT},
376 \macro{SIGQUIT} e \macro{SIGTERM}, trattati in \secref{sec:sig_job_control}) a
377 tutti i processi del raggruppamento di \textit{foreground}; in questo modo la
378 shell può gestire il blocco e l'interruzione dei vari comandi.
379  
380 Per completare la trattazione delle caratteristiche del job control legate al
381 terminale di controllo, occorre prendere in considerazione i vari casi legati
382 alla terminazione anomala dei processi, che sono di norma gestite attraverso
383 il segnale \macro{SIGHUP}. Il nome del segnale deriva da \textit{hungup},
384 termine che viene usato per indicare la condizione in cui il terminale diventa
385 inutilizzabile, (letteralmente sarebbe \textsl{impiccagione}). 
386
387 Quando si verifica questa condizione, ad esempio se si interrompe la linea, o
388 va giù la rete o più semplicemente si chiude forzatamente la finestra di
389 terminale su cui si stava lavorando, il kernel provvederà ad inviare il
390 segnale di \macro{SIGHUP} al processo di controllo. L'azione preimpostata in
391 questo caso è la terminazione del processo, il problema che si pone è cosa
392 accade agli altri processi nella sessione, che non han più un processo di
393 controllo che possa gestire l'accesso al terminale, che potrebbe essere
394 riutilizzato per qualche altra sessione.
395
396 Lo standard POSIX.1 prevede che quando il processo di controllo termina, che
397 ciò avvenga o meno per un \textit{hungup} del terminale (ad esempio si
398 potrebbe terminare direttamente la shell con \cmd{kill}) venga inviato un
399 segnale di \macro{SIGHUP} ai processi del raggruppamento di foreground. In
400 questo modo essi potranno essere avvisati che non esiste più un processo in
401 grado di gestire il terminale (di norma tutto ciò comporta la terminazione
402 anche di questi ultimi).
403
404 Restano però gli eventuali processi in background, che non ricevono il
405 segnale; in effetti se il terminale non dovesse più servire essi potrebbero
406 proseguire fino al completamento della loro esecuzione; ma si pone il problema
407 di come gestire quelli che sono bloccati, o che si bloccano nell'accesso al
408 terminale, in assenza di un processo che sia in grado di effettuare il
409 controllo dello stesso.
410
411 Questa è la situazione in cui si ha quello che viene chiamato un
412 \textit{orphaned process group}. Lo standard POSIX.1 lo definisce come un
413 \textit{process group} i cui processi hanno come padri esclusivamente o altri
414 processi nel raggruppamento, o processi fuori della sessione.  Lo standard
415 prevede inoltre che se la terminazione di un processo fa sì che un
416 raggruppamento di processi diventi orfano e se i suoi membri sono bloccati, ad
417 essi vengano inviati in sequenza i segnali di \macro{SIGHUP} e
418 \macro{SIGCONT}.
419
420 La definizione può sembrare complicata, e a prima vista non è chiaro cosa
421 tutto ciò abbia a che fare con il problema della terminazione del processo di
422 controllo.  Consideriamo allora cosa avviene di norma nel \textit{job
423   control}: una sessione viene creata con \func{setsid} che crea anche un
424 nuovo process group: per definizione quest'ultimo è sempre \textsl{orfano},
425 dato che il padre del leader di sessione è fuori dalla stessa e il nuovo
426 process group contiene solo il leader di sessione. Questo è un caso limite, e
427 non viene emesso nessun segnale perché quanto previsto dallo standard riguarda
428 solo i raggruppamenti che diventano orfani in seguito alla terminazione di un
429 processo.\footnote{l'emissione dei segnali infatti avviene solo nella fase di
430   uscita del processo, come una delle operazioni legate all'esecuzione di
431   \func{\_exit}, secondo quanto illustrato in \secref{sec:proc_termination}.}
432
433 Il leader di sessione provvederà a creare nuovi raggruppamenti che a questo
434 punto non sono orfani in quanto esso resta padre per almeno uno dei processi
435 del gruppo (gli altri possono derivare dal primo). Alla terminazione del
436 leader di sessione però avremo che, come visto in
437 \secref{sec:proc_termination}, tutti i suoi figli vengono adottati da
438 \cmd{init}, che è fuori dalla sessione. Questo renderà orfani tutti i process
439 group creati direttamente dal leader di sessione (a meno di non aver spostato
440 con \func{setpgid} un processo da un gruppo ad un altro, cosa che di norma non
441 viene fatta) i quali riceveranno, nel caso siano bloccati, i due segnali;
442 \macro{SIGCONT} ne farà proseguire l'esecuzione, ed essendo stato nel
443 frattempo inviato anche \macro{SIGHUP}, se non c'è un gestore per
444 quest'ultimo, i processi bloccati verranno automaticamente terminati.
445
446
447
448 \subsection{Dal login alla shell}
449 \label{sec:sess_login}
450
451 L'organizzazione del sistema del job control è strettamente connessa alle
452 modalità con cui un utente accede al sistema per dare comandi, collegandosi ad
453 esso con un terminale, che sia questo realmente tale, come un VT100 collegato
454 ad una seriale o virtuale, come quelli associati a schermo e tastiera o ad una
455 connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
456 fine le differenze sono\footnote{in generale nel caso di login via rete o di
457   terminali lanciati dall'interfaccia grafica cambia anche il processo da cui
458   ha origine l'esecuzione della shell.} nel dispositivo cui il kernel associa i
459 file standard (vedi \secref{sec:file_std_descr}) per l'I/O, tratteremo solo il
460 caso classico del terminale.
461
462 Abbiamo già brevemente illustrato in \secref{sec:intro_kern_and_sys} le
463 modalità con cui il sistema si avvia, e di come, a partire da \cmd{init},
464 vengano lanciati tutti gli altri processi. Adesso vedremo in maniera più
465 dettagliata le modalità con cui il sistema arriva a fornire ad un utente la
466 shell che gli permette di lanciare i suoi comandi su un terminale.
467
468 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
469   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
470   altre distribuzioni dedicate a compiti limitati e specifici.}  viene usata
471 la procedura di avvio di System V; questa prevede che \cmd{init} legga dal
472 file di configurazione \file{/etc/inittab} quali programmi devono essere
473 lanciati, ed in quali modalità, a seconda del cosiddetto \textit{run level},
474 anch'esso definito nello stesso file.
475
476 Tralasciando la descrizione del sistema dei run level, (per il quale si
477 rimanda alla lettura delle pagine di manuale di \cmd{init} e di
478 \file{inittab}) quello che comunque viene sempre fatto è di eseguire almeno
479 una istanza di un programma che permetta l'accesso ad un terminale. Uno schema
480 di massima della procedura è riportato in \figref{fig:sess_term_login}.
481
482 \begin{figure}[htb]
483   \centering
484   \includegraphics[width=15cm]{img/tty_login}
485   \caption{Schema della procedura di login su un terminale.}
486   \label{fig:sess_term_login}
487 \end{figure}
488
489 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
490 ad un altro tipo di porta di comunicazione, o una delle console virtuali
491 associate allo schermo, viene sempre visto attraverso attraverso un device
492 driver che ne presenta un'interfaccia comune su un apposito file di
493 dispositivo. Storicamente i primi terminali erano appunto terminali di
494 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
495 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
496 della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali
497   virtuali associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
498
499 Per controllare un terminale si usa di solito il programma \cmd{getty} (od una
500 delle sue varianti), che permette di mettersi in ascolto su uno di questi
501 dispositivi. Alla radice della catena che porta ad una shell per i comandi
502 perciò c'è sempre \cmd{init} che esegue prima una \func{fork} e poi una
503 \func{exec} per lanciare una istanza di questo programma su un terminale, il
504 tutto ripetuto per ciascuno dei terminali che si hanno a disposizione (o per
505 un certo numero di essi, nel caso delle console virtuali), secondo quanto
506 indicato dall'amministratore nel file di configurazione del programma,
507 \file{/etc/inittab}.
508
509 Quando viene lanciato da \cmd{init} il programma parte con i privilegi di
510 amministratore e con un ambiente vuoto; \cmd{getty} si cura di chiamare
511 \func{setsid} per creare una nuova sessione ed un nuovo process group, e di
512 aprire il terminale (che così diventa il terminale di controllo della
513 sessione) in lettura sullo standard input ed in scrittura sullo standard
514 output e sullo standard error; inoltre effettuerà, qualora servano, ulteriori
515 settaggi.\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
516   di login in maiuscolo, può effettuare la conversione automatica dell'input
517   in minuscolo, ponendosi in una modalità speciale che non distingue fra i due
518   tipi di caratteri (a beneficio di alcuni vecchi terminali che non
519   supportavano le minuscole).} Alla fine il programma stamperà un messaggio di
520 benvenuto per poi porsi in attesa dell'immissione del nome di un utente.
521
522 Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente
523 il programma \cmd{login} con una \func{exevle}, passando come argomento la
524 stringa con il nome, ed un ambiente opportunamente costruito che contenga
525 quanto necessario (ad esempio di solito viene opportunamente inizializzata la
526 variabile di ambiente \texttt{TERM}) ad identificare il terminale su cui si
527 sta operando, a beneficio dei programmi che verranno lanciati in seguito.
528
529 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
530 nome dell'utente per effettuare una ricerca nel database degli
531 utenti,\footnote{in genere viene chiamata \func{getpwnam}, che abbiamo visto
532   in \secref{sec:sys_user_group}, per leggere la password e gli altri dati dal
533   database degli utenti.} e richiede una password. Se l'utente non esiste o se
534 la password non corrisponde\footnote{il confronto non viene effettuato con un
535   valore in chiaro; quanto immesso da terminale viene invece a sua volta
536   criptato, ed è il risultato che viene confrontato con il valore che viene
537   mantenuto nel database degli utenti.} la richiesta viene ripetuta un certo
538 numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a
539 rilanciare un'altra istanza di \func{getty}.
540
541 Se invece la password corrisponde \cmd{login} esegue \func{chdir} per settare
542 la \textit{home directory} dell'utente, cambia i diritti di accesso al
543 terminale (con \func{chown} e \func{chmod}) per assegnarne la titolarità
544 all'utente ed al suo gruppo principale, assegnandogli al contempo i diritti di
545 lettura e scrittura. Inoltre il programma provvede a costruire gli opportuni
546 valori per le variabili di ambiente, come \texttt{HOME}, \texttt{SHELL}, ecc.
547 Infine attraverso l'uso di \func{setuid}, \func{setpid} e \func{initgroups}
548 verrà cambiata l'identità del proprietario del processo, infatti, come
549 spiegato in \secref{sec:proc_setuid}, avendo invocato tali funzioni con i
550 privilegi di amministratore, tutti gli userid ed i groupid (reali, effettivi e
551 salvati) saranno settati a quelli dell'utente.
552
553 A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
554 iniziali, come la stampa di messaggi di benvenuto o il controllo della posta)
555 ad eseguire con un'altra \func{exec} la shell, che si troverà con un ambiente
556 già pronto con i file standard di \secref{sec:file_std_descr} impostati sul
557 terminale, e pronta, nel ruolo di leader di sessione e di processo di
558 controllo per il terminale, a gestire l'esecuzione dei comandi come illustrato
559 in \secref{sec:sess_job_control_overview}. 
560
561 Dato che il processo padre resta sempre \cmd{init} quest'ultimo potrà
562 provvedere, ricevendo un \macro{SIGCHLD} all'uscita della shell quando la
563 sessione di lavoro è terminata, a rilanciare \cmd{getty} sul terminale per
564 ripetere da capo tutto il procedimento. 
565
566
567
568 \subsection{Prescrizioni per un programma \textit{daemon}}
569 \label{sec:sess_daemon}
570
571 Come sottolineato fin da \secref{sec:intro_base_concept}, in un sistema
572 unix-like tutte le operazioni sono eseguite tramite processi, comprese quelle
573 operazioni di sistema (come l'esecuzione dei comandi periodici, o la consegna
574 della posta, ed in generale tutti i programmi di servizio) che non hanno
575 niente a che fare con la gestione diretta dei comandi dell'utente.
576
577 Questi programmi, che devono essere eseguiti in modalità non interattiva e
578 senza nessun intervento dell'utente, sono normalmente chiamati
579 \textsl{demoni}, (o \textit{daemons}), nome ispirato dagli omonimi spiritelli
580 che svolgevano compiti vari, di cui parlava Socrate (che sosteneva di averne
581 uno al suo servizio).\footnote{NdT. ricontrollare, i miei ricordi di filosofia
582   sono piuttosto datati.}
583
584 Se però si lancia un programma demone dalla riga di comando in un sistema che
585 supporta, come Linux, il \textit{job control} esso verrà comunque associato ad
586 un terminale di controllo e mantenuto all'interno di una sessione, e anche se
587 può essere mandato in background e non eseguire più nessun I/O su terminale,
588 si avranno comunque tutte le conseguenze che abbiamo appena visto in
589 \secref{sec:sess_ctrl_term} (in particolare l'invio dei segnali in
590 corrispondenza dell'uscita del leader di sessione).
591
592 Per questo motivo un programma che deve funzionare come demone deve sempre
593 prendere autonomamente i provvedimenti opportuni (come distaccarsi dal
594 terminale e dalla sessione) ad impedire eventuali interferenze da parte del
595 sistema del \textit{job contol}; questi sono riassunti in una lista di
596 prescrizioni\footnote{ad esempio sia Stevens in \cite{APUE}, che la
597   \textit{Unix Programming FAQ} \cite{UnixFAQ} ne riportano di sostanzialmente
598   identiche.} da seguire quando si scrive un demone.
599
600 Pertanto, quando si lancia un programma che deve essere eseguito come demone
601 occorrerà predisporlo in modo che esso compia le seguenti azioni:
602 \begin{enumerate}
603 \item Eseguire una \func{fork} e terminare immediatamente il processo padre
604   proseguendo l'esecuzione nel figlio.  In questo modo si ha la certezza che
605   il figlio non è un \textit{process group leader}, (avrà il \acr{pgid} del
606   padre, ma un \acr{pid} diverso) e si può chiamare \func{setsid} con
607   successo. Inoltre la shell considererà terminato il comando all'uscita del
608   padre.
609 \item Eseguire \func{setsid} per creare una nuova sessione ed un nuovo
610   raggruppamento di cui il processo diventa automaticamente il leader, che
611   però non ha associato nessun terminale di controllo.
612 \item Assicurarsi che al processo non venga associato in seguito nessun nuovo
613   terminale di controllo; questo può essere fatto sia avendo cura di usare
614   sempre l'opzione \macro{O\_NOCTTY} nell'aprire i file di terminale, che
615   eseguendo una ulteriore \func{fork} uscendo nel padre e proseguendo nel
616   figlio. In questo caso, non essendo più quest'ultimo un leader di sessione
617   non potrà ottenere automaticamente un terminale di controllo.
618 \item Eseguire una \func{chdir} per impostare la directory di lavoro del
619   processo (su \file{/} o su una directory che contenga dei file necessari per
620   il programma), per evitare che la directory da cui si è lanciato il processo
621   resti in uso e non sia possibile rimuoverla o smontare il filesystem che la
622   contiene.
623 \item Impostare la maschera dei permessi (di solito con \code{umask(0)}) in
624   modo da non essere dipendenti dal valore ereditato da chi ha lanciato
625   originariamente il processo. 
626 \item Chiudere tutti i file aperti che non servono più (in generale tutti); in
627   particolare vanno chiusi i file standard che di norma sono ancora associati
628   al terminale (un'altra opzione è quella di redirigerli verso
629   \file{/dev/null}).
630 \end{enumerate}
631
632
633 In Linux buona parte di queste azioni possono venire eseguite invocando la
634 funzione \func{daemon}, introdotta per la prima volta in BSD4.4; il suo
635 prototipo è:
636 \begin{prototype}{unistd.h}{int daemon(int nochdir, int noclose)}
637   Esegue le operazioni che distaccano il processo dal terminale di controllo e
638   lo fanno girare come demone.
639   
640   \bodydesc{La funzione restituisce (nel nuovo processo) 0 in caso di
641     successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà i
642     valori impostati dalle sottostanti \func{fork} e \func{setsid}.}
643 \end{prototype}
644
645 La funzione esegue una \func{fork}, per uscire subito, con \func{\_exit}, nel
646 padre, mentre l'esecuzione prosegue nel figlio che esegue subito una
647 \func{setsid}. In questo modo si compiono automaticamente i passi 1 e 2 della
648 precedente lista. Se \param{nochdir} è nullo la funzione imposta anche la
649 directory di lavoro su \file{/}, se \param{noclose} è nullo i file standard
650 vengono rediretti su \file{/dev/null} (corrispondenti ai passi 4 e 6); in caso
651 di valori non nulli non viene eseguita nessuna altra azione.
652
653 Dato che un programma demone non può più accedere al terminale, si pone il
654 problema di come fare per la notifica di eventuali errori, non potendosi più
655 utilizzare lo standard error; per il normale I/O infatti ciascun demone avrà
656 le sue modalità di interazione col sistema e gli utenti a seconda dei compiti
657 e delle funzionalità che sono sono previste; ma gli errori devono normalmente
658 essere notificati all'amministratore del sistema.
659
660 Una soluzione può essere quella di scrivere gli eventuali messaggi su uno
661 specifico file (cosa che a volte viene fatta comunque) ma questo comporta il
662 grande svantaggio che l'amministratore dovrà tenere sotto controllo un file
663 diverso per ciascun demone, e che possono anche generarsi conflitti di nomi.
664 Per questo in BSD4.2 venne introdotto un servizio di sistema, il
665 \textit{syslog}, che oggi si trova su tutti i sistemi Unix, e che permettesse
666 ai demoni di inviare messaggi all'amministratore in una maniera
667 standardizzata.
668
669 Il servizio prevede vari meccanismi di notifica, e, come ogni altro servizio
670 in un sistema unix-like, viene gestito attraverso un apposito programma,
671 \cmd{syslogd}, che è anch'esso un \textsl{demone}. In generale i messaggi di
672 errore vengono raccolti dal file speciale \file{/dev/log}, un \textit{socket}
673 locale (vedi \secref{sec:sock_sa_local}) dedicato a questo scopo, o via rete,
674 con un \textit{socket} UDP, o da un apposito demone, \cmd{klogd}, che estrae i
675 messaggi del kernel.\footnote{i messaggi del kernel sono tenuti in un buffer
676   circolare e scritti tramite la funzione \func{printk}, analoga alla
677   \func{printf} usata in user space; una trattazione eccellente dell'argomento
678   si trova in \cite{LinDevDri}, nel quarto capitolo.}
679
680 Il servizio permette poi di trattare i vari messaggi classificandoli
681 attraverso due indici; il primo, chiamato \textit{facility}, indica quale
682 categoria di demone ha emesso il messaggio, ed è organizzato in sottosistemi
683 (kernel, posta elettronica, demoni di stampa, ecc.), il secondo, chiamato
684 \textit{priority}, identifica l'importanza del messaggio. Il sistema di
685 \textit{syslog} provvede poi a riportare i messaggi all'amministratore
686 attraverso differenti meccanismi come:
687 \begin{itemize*}
688 \item scrivere sulla console.
689 \item inviare via mail ad uno specifico utente.
690 \item scrivere su un file (comunemente detto \textit{log file}).
691 \item inviare ad un altro demone (anche via rete).
692 \item scartare.
693 \end{itemize*}
694 secondo le modalità che questo preferisce e che possono essere impostate
695 attraverso il file di configurazione \file{/etc/syslog.conf} (maggiori
696 dettagli si possono trovare sulle pagine di manuale per questo file e per
697 \cmd{syslogd}).
698
699 Le \acr{glibc} definiscono una serie di funzioni standard con cui un processo
700 può accedere in maniera generica al servizio di syslog, che però funzionano
701 solo localmente; se si vogliono inviare i messaggi ad un'altro sistema occorre
702 farlo esplicitamente con un socket UDP, o utilizzare le capacità di reinvio
703 del servizio.
704
705 La prima funzione definita dall'interfaccia è \func{openlog}, che apre una
706 connessione al servizio di \textit{syslog}; essa in generale non è necessaria
707 per l'uso del servizio, ma permette di impostare alcuni valori che controllano
708 gli effetti delle chiamate successive; il suo prototipo è:
709 \begin{prototype}{syslog.h}{void openlog(const char *ident, int option, 
710 int facility)}
711
712 Apre una connessione al sistema di \textit{syslog}.
713   
714 \bodydesc{La funzione non restituisce nulla.}
715 \end{prototype}
716
717 La funzione permette di specificare, tramite \param{ident}, l'identità di chi
718 ha inviato il messaggio (di norma si passa il nome del programma, come
719 specificato da \code{argv[0]}); la stringa verrà preposta all'inizio di ogni
720 messaggio. Si tenga presente che il valore di \param{ident} che si passa alla
721 funzione è un puntatore, se la stringa cui punta viene cambiata lo sarà pure
722 nei successivi messaggi, e se viene cancellata i risultati potranno essere
723 impredicibili, per questo è sempre opportuno usare una stringa costante.
724
725  L'argomento \param{facility} permette invece di preimpostare per le successive
726  chiamate l'omonimo indice che classifica la categoria del messaggio.
727  L'argomento è interpretato come una maschera binaria, e pertanto è possibile
728  inviare i messaggi su più categorie alla volta; i valori delle costanti che
729  identificano ciascuna categoria sono riportati in
730  \tabref{tab:sess_syslog_facility}, il valore di \param{facility} deve essere
731  specificato con un OR aritmetico.
732
733 \begin{table}[htb]
734 \centering
735 \begin{tabular}[c]{|l|p{8cm}|}
736 \hline
737 \textbf{Valore}& \textbf{Significato}\\
738 \hline
739 \hline
740 \macro{LOG\_AUTH}     & Messaggi relativi ad autenticazione e sicurezza,
741                         obsoleto, è sostituito da \macro{LOG\_AUTHPRIV}. \\
742 \macro{LOG\_AUTHPRIV} & Sostituisce \macro{LOG\_AUTH}.\\
743 \macro{LOG\_CRON}     & Messaggi dei demoni di gestione dei comandi
744                         programmati (\cmd{cron} e \cmd{at}).\\
745 \macro{LOG\_DAEMON}   & Demoni di sistema.\\
746 \macro{LOG\_FTP}      & Server FTP.\\
747 \macro{LOG\_KERN}     & Messaggi del kernel\\
748 \macro{LOG\_LOCAL0}   & Riservato all'amministratore per uso locale\\
749 --- & \\
750 \macro{LOG\_LOCAL7}   & Riservato all'amministratore per uso locale\\
751 \macro{LOG\_LPR}      & Messaggi del sistema di gestione delle stampanti \\
752 \macro{LOG\_MAIL}     & Messaggi del sistema di posta elettronica\\
753 \macro{LOG\_NEWS}     & Messaggi del sistema di gestione delle news (USENET) \\
754 \macro{LOG\_SYSLOG}   & Messaggi generati dallo stesso \cmd{syslogd}\\
755 \macro{LOG\_USER}     & Messaggi generici a livello utente\\
756 \macro{LOG\_UUCP}     & Messaggi del sistema UUCP\\
757 \hline
758 \end{tabular}
759 \caption{Valori possibili per l'argomento \param{facility} di \func{openlog}.}
760 \label{tab:sess_syslog_facility}
761 \end{table}
762
763 L'argomento \param{option} serve invece per controllare il comportamento della
764 funzione \func{openlog} e delle modalità con cui le successive chiamate
765 scriveranno i messaggi, anch'esso viene specificato come maschera binaria
766 composta con un OR aritmetico di una qualunque delle costanti riportate in
767 \tabref{tab:sess_openlog_option}.
768
769 \begin{table}[htb]
770 \centering
771 \begin{tabular}[c]{|l|p{8cm}|}
772 \hline
773 \textbf{Valore}& \textbf{Significato}\\
774 \hline
775 \hline
776 \macro{LOG\_CONS}   & Scrive sulla console quando. \\
777 \macro{LOG\_NDELAY} & Sostituisce \macro{LOG\_AUTH}.\\
778 \macro{LOG\_NOWAIT} & Messaggi dei demoni di gestione dei comandi
779                       programmati (\cmd{cron} e \cmd{at}).\\
780 \macro{LOG\_ODELAY} & .\\
781 \macro{LOG\_PERROR} & Stampa anche su \file{stderr}.\\
782 \macro{LOG\_PID}    & Inserisce nei messaggi il \acr{pid} del processo
783                       chiamante. \\
784 \hline
785 \end{tabular}
786 \caption{Valori possibili per l'argomento \param{option} di \func{openlog}.}
787 \label{tab:sess_openlog_option}
788 \end{table}
789
790 La funzione che si usa per generare un messaggio è \func{syslog}, dato che
791 l'uso di \func{openlog} è ozionale, sarà quest'ultima a provvede a chiamare la
792 prima qualora ciò non sia stato fatto (nel qual caso il valore di
793 \param{ident} è nullo). Il suo prototipo è:
794 \begin{prototype}{syslog.h}
795 {void syslog(int priority, const char *format, ...)}
796
797 Genera un messaggio di priorità \param{priority}.
798
799 \bodydesc{La funzione non restituisce nulla.}
800 \end{prototype}
801
802 Il comportamento della funzione è analogo quello di \func{printf}, e il valore
803 dell'argomento \param{format} è identico a quello descritto nella pagina di
804 manuale di quest'ultima (per i valori principali si può vedere la trattazione
805 sommaria che se ne è fatto in \secref{sec:file_formatted_io}); l'unica
806 differenza è che la sequenza \cmd{\%m} viene rimpiazzata dalla stringa
807 restituita da \code{strerror(errno)}. Gli argomenti seguenti i primi due
808 devono essere forniti secondo quanto richiesto da \func{format}.
809
810  L'argomento \param{priority} permette di impostare sia la \textit{facility} 
811  che la \textit{priority} del messaggio. In realtà viene prevalentemente usato 
812  per specificare solo quest'ultima in quanto la prima viene di norma 
813  preimpostata con \func{openlog}. La priorità è indicata con un valore
814  numerico\footnote{le \acr{glibc}, seguendo POSIX.1-2001, prevedono otto
815    diverse priorità ordinate da 0 a 7, in ordine di importanza decrescente;
816    questo comporta che i tre bit meno significativi dell'argomento
817    \param{priority} sono occupati da questo valore, mentre i restanti bit più
818    significativi vengono usati per specificare la \textit{facility}.}
819  specificabile attraverso le costanti riportate in
820  \secref{tab:sess_syslog_priority}.  Nel caso si voglia specificare anche la
821  \textit{facility} basta eseguire un OR aritmetico del valore della priorità
822  con la maschera binaria delle costanti di \tabref{tab:sess_syslog_facility}.
823
824 \begin{table}[htb]
825 \centering
826 \begin{tabular}[c]{|l|p{8cm}|}
827 \hline
828 \textbf{Valore}& \textbf{Significato}\\
829 \hline
830 \hline
831 \macro{LOG\_EMERG}   & Il sistema è inutilizzabile. \\
832 \macro{LOG\_ALERT}   & C'è una emergenza che richiede intervento immediato.\\
833 \macro{LOG\_CRIT}    & Si è in una condizione critica.\\
834 \macro{LOG\_ERR}     & Si è in una condizione di errore.\\
835 \macro{LOG\_WARNING} & Messaggio di avvertimento.\\
836 \macro{LOG\_NOTICE}  & Notizia significativa relativa al comportamento.\\
837 \macro{LOG\_INFO}    & Messaggio informativo. \\
838 \macro{LOG\_DEBUG}   & Messaggio di debug.\\
839 \hline
840 \end{tabular}
841  \caption{Valori possibili per l'indice di importanza del messaggio da
842   specificare nell'argomento \param{priority} di \func{syslog}.}
843 \label{tab:sess_syslog_priority}
844 \end{table}
845
846   Una ulteriore funzione, \func{setlogmask}, permette di filtrare
847   preliminarmente i messaggi in base alla loro priorità; il suo prototipo è:
848 \begin{prototype}{syslog.h}
849   {int setlogmask(int mask)}
850
851 Imposta la maschera dei log al valore specificato.
852
853 \bodydesc{La funzione restituisce il precedente valore.}
854 \end{prototype}
855
856 Le routine di gestione mantengono per ogni processo una maschera che
857 determina quale delle chiamate effettuate a \func{syslog} verrà
858 effettivamente registrata. La registrazione viene disabilitata per tutte
859 quelle priorità che non rientrano nella maschera; questa viene settata
860 usando la macro \code{LOG\_MASK(p)} dove \code{p} è una delle costanti di
861 \secref{tab:sess_syslog_priority}. É inoltre disponibile anche la macro
862 \code{LOG\_UPTO(p)} che permette di specificare automaticamente tutte le
863 priorità fino ad un certo valore.
864
865
866
867 \section{L'I/O su terminale}
868 \label{sec:sess_terminal_io}
869
870 Esamineremo in questa sezione le peculiarità dell'I/O eseguito sui terminali,
871 tenendo conto delle differenze che quest'ultimi presentano rispetto ai normali
872 file su disco.
873
874
875
876
877 %%% Local Variables: 
878 %%% mode: latex
879 %%% TeX-master: "gapil"
880 %%% End: