Ancora orphaned process group
[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 \textit{process
66   group}, in modo che le varie funzioni di controllo, ed i segnali inviati dal
67 terminale, possano fare riferimento ad esso.
68
69 In generale allora all'interno di una sessione avremo un eventuale (possono
70 non 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}. Il comando \cmd{fg} consente invece di mettere in
82 \textit{foreground} un comando precedentemente lanciato in
83 \textit{background}.
84
85 Di norma la shell si cura anche di notificare all'utente (di solito prima
86 della stampa a video del prompt) lo stato dei vari processi, essa infatti usa
87 le caratteristiche della funzione \func{waitpid} (si riveda quanto detto in
88 \secref{sec:proc_wait}) per verificare quali gruppi di processi sono bloccati
89 e quali sono terminati. 
90
91
92 \subsection{I \textit{process group} e le \textsl{sessioni}}
93 \label{sec:sess_proc_group}
94
95 Come accennato in \secref{sec:sess_job_control_overview} nel job control i
96 processi vengono raggruppati in \textit{process group} e \textit{sessioni};
97 per far questo vengono utilizzati due ulteriori identificatori (oltre quelli
98 visti in \secref{sec:proc_pid}) che il kernel associa a ciascun
99 processo:\footnote{in Linux questi identificatori sono mantenuti nei campi
100   \var{pgrp} e \var{session} della struttura \var{task\_struct} definita in
101   \file{sched.h}.}  l'identificatore del \textit{process group} e
102 l'identificatore della \textsl{sessione}, che vengono indicati rispettivamente
103 con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo
104 \type{pid\_t}. I valori di questi identificatori possono essere visualizzati
105 dal comando \cmd{ps} usando l'opzione \cmd{-j}.
106
107 Un \textit{process group} è pertanto definito da tutti i processi che hanno lo
108 stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con
109 le funzioni \func{getpgid} e \func{getpgrp},\footnote{\func{getpgrp} è
110   definita nello standard POSIX.1, mentre \func{getpgid} è richiesta da SVr4.}
111 i cui prototipi sono:
112 \begin{functions}
113   \headdecl{unistd.h}
114
115   \funcdecl{pid\_t getpgid(pid\_t pid)} 
116   Legge il \acr{pgid} del processo \param{pid}.
117
118   \funcdecl{pid\_t getpgrp(void)}
119   Legge il \acr{pgid} del processo corrente.
120   
121   \bodydesc{Le funzioni restituiscono il \acr{pgid} del processo,
122     \func{getpgrp} ha sempre successo, mentre \func{getpgid} restituisce -1
123     ponendo \var{errno} a \macro{ESRCH} se il processo selezionato non esiste.}
124 \end{functions}
125
126 La funzione \func{getpgid} permette di specificare il \acr{pid} del processo
127 di cui si vuole sapere il \acr{pgid}; un valore nullo per \param{pid}
128 restituisce il \acr{pgid} del processo corrente; \func{getpgrp} è di norma
129 equivalente a \code{getpgid(0)}.
130
131 In maniera analoga l'identificatore della sessione può essere letto dalla
132 funzione \func{getsid}, che però nelle \acr{glibc}\footnote{la system call è
133   stata introdotta in Linux a partire dalla versione 1.3.44, il supporto nelle
134   librerie del C è iniziato dalla versione 5.2.19. La funzione non è prevista
135   da POSIX.1, che parla solo di processi leader di sessione, e non di
136   identificatori di sessione.} è accessibile solo definendo
137 \macro{\_XOPEN\_SOURCE} e \macro{\_XOPEN\_SOURCE\_EXTENDED}; il suo prototipo
138 è:
139 \begin{prototype}{unistd.h}{pid\_t getsid(pid\_t pid)}
140   Legge l'identificatore di sessione del processo \param{pid}.
141   
142   \bodydesc{La funzione restituisce l'identificatore (un numero positivo) in
143   caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà
144   i valori:
145     \begin{errlist}
146     \item[\macro{ESRCH}] Il processo selezionato non esiste.
147     \item[\macro{EPERM}] In alcune implementazioni viene restituito quando il
148       processo selezionato non fa parte della stessa sessione del processo
149       corrente.
150     \end{errlist}
151   }
152 \end{prototype}
153
154 Entrambi gli identificatori vengono inizializzati alla creazione di ciascun
155 processo con lo stesso valore che hanno nel processo padre, per cui un
156 processo appena creato appartiene sempre allo stesso raggruppamento e alla
157 stessa sessione del padre. Vedremo poi come sia possibile creare più
158 \textit{process group} all'interno della stessa sessione, e spostare i
159 processi dall'uno all'altro, ma sempre all'interno di una stessa sessione.
160
161 Ciascun gruppo di processi ha sempre un processo principale, il cosiddetto
162 \textit{process group leader}, che è identificato dall'avere un \acr{pgid}
163 uguale al suo \acr{pid}, in genere questo è il primo processo del gruppo, che
164 si incarica di lanciare tutti gli altri. Un nuovo gruppo si crea con la
165 funzione \func{setpgrp},\footnote{questa è la definizione di POSIX.1, BSD
166   definisce una funzione con lo stesso nome, che però è identica a
167   \func{setpgid}; nelle \acr{glibc} viene sempre usata sempre questa
168   definizione, a meno di non richiedere esplicitamente la compatibilità
169   all'indietro con BSD, definendo la macro \macro{\_BSD\_SOURCE}.} il cui
170 prototipo è:
171 \begin{prototype}{unistd.h}{int setpgrp(void)}
172   Modifica il \acr{pgid} al valore del \acr{pid} del processo corrente.
173   
174   \bodydesc{La funzione restituisce il valore del nuovo \textit{process
175       group}.}
176 \end{prototype}
177
178 La funzione, assegnando al \acr{pgid} il valore del \acr{pid} processo
179 corrente, rende questo \textit{process leader} di un nuovo gruppo, tutti i
180 successivi processi da esso creati apparterranno (a meno di non cambiare di
181 nuovo il \acr{pgid}) al nuovo gruppo. È possibile invece spostare un processo
182 da un gruppo ad un altro con la funzione \func{setpgid}, il cui prototipo è:
183 \begin{prototype}{unistd.h}{int setpgid(pid\_t pid, pid\_t pgid)}
184   Assegna al \acr{pgid} del processo \param{pid} il valore \param{pgid}.
185   
186   \bodydesc{La funzione ritorna il valore del nuovo \textit{process group}, e
187   -1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
188     \begin{errlist}
189     \item[\macro{ESRCH}] Il processo selezionato non esiste.
190     \item[\macro{EPERM}] Il cambiamento non è consentito.
191     \item[\macro{EACCESS}] Il processo ha già eseguito una \func{exec}.
192     \item[\macro{EINVAL}] Il valore di \param{pgid} è negativo.
193     \end{errlist}
194  }
195 \end{prototype}
196
197 La funzione permette di cambiare il \acr{pgid} del processo \param{pid}, ma il
198 cambiamento può essere effettuato solo se \param{pgid} indica un
199 \textit{process group} che è nella stessa sessione del processo chiamante.
200 Inoltre la funzione può essere usata soltanto sul processo corrente o su uno
201 dei suoi figli, ed in quest'ultimo caso ha successo soltanto se questo non ha
202 ancora eseguito una \func{exec}. Specificando un valore nullo per \param{pid}
203 si indica il processo corrente, mentre specificando un valore nullo per
204 \param{pgid} si imposta il \textit{process group} al valore del \acr{pid} del
205 processo selezionato; pertanto \func{setpgrp} è equivalente a \code{setpgid(0,
206   0)}.
207
208 Di norma questa funzione viene usata dalla shell quando si usano delle
209 pipeline, per mettere nello stesso process group tutti i programmi lanciati su
210 ogni linea di comando; essa viene chiamata dopo una \func{fork} sia dal
211 processo padre, per impostare il valore nel figlio, che da quest'ultimo, per
212 sé stesso, in modo che il cambiamento di \textit{process group} sia immediato
213 per entrambi; una delle due chiamate sarà ridondante, ma non potendo
214 determinare quale dei due processi viene eseguito per primo, occorre eseguirle
215 comunque entrambe per evitare di esporsi ad una race condition. 
216
217 Si noti come nessuna delle funzioni esaminate finora permetta di spostare un
218 processo da una sessione ad un altra; infatti l'unico modo di far cambiare
219 sessione ad un processo è quello di crearne una nuova con l'uso di
220 \func{setsid}; il suo prototipo è:
221 \begin{prototype}{unistd.h}{pid\_t setsid(void)}
222   Crea una nuova sessione sul processo corrente settandone \acr{sid} e
223   \acr{pgid}.
224   
225   \bodydesc{La funzione ritorna il valore del nuovo \acr{sid}, e -1 in caso di
226     errore, il solo errore possibile è \macro{EPERM}, che si ha quando il
227     \acr{pgid} e \acr{pid} del processo concidono.}
228 \end{prototype}
229
230 La funzione imposta il \acr{pgid} ed il \acr{sid} del processo corrente al
231 valore del suo \acr{pid}, creando così una nuova sessione ed un nuovo
232 \textit{process group} di cui esso diventa leader (come per i \textit{process
233   group} un processo si dice leader di sessione\footnote{in Linux la proprietà
234   è mantenuta in maniera indipendente con un apposito campo \var{leader} in
235   \var{task\_struct}.} se il suo \acr{sid} è uguale al suo \acr{pid}) ed unico
236 componente.  Inoltre la funzione distacca il processo da ogni terminale di
237 controllo (torneremo sull'argomento in \secref{sec:sess_ctrl_term}) cui fosse
238 in precedenza associato.
239
240   funzione ha successo soltanto se il processo non è già leader di un
241 \textit{process group}, per cui per usarla di norma si esegue una \func{fork}
242 e si esce, per poi chiamare \func{setsid} nel processo figlio, in modo che,
243 avendo questo lo stesso \acr{pgid} del padre ma un \acr{pid} diverso, non ci
244 siano possibilità di errore.\footnote{potrebbe sorgere il dubbio che, per il
245   riutilizzo dei valori dei \acr{pid} fatto nella creazione dei nuovi processi
246   (vedi \secref{sec:proc_pid}), il figlio venga ad assumere un valore
247   corrispondente ad un process group esistente; questo viene evitato dal
248   kernel che considera come disponibili per un nuovo \acr{pid} solo valori che
249   non corrispondono ad altri \acr{pid}, \acr{pgid} o \acr{sid} in uso nel
250   sistema.} Questa funzione viene usata di solito nel processo di login (per i
251 dettagli vedi \secref{sec:sess_login}) per raggruppare in una sessione tutti i
252 comandi eseguiti da un utente dalla sua shell.
253
254
255
256 \subsection{Il terminale di controllo e il controllo di sessione}
257 \label{sec:sess_ctrl_term}
258
259 Come accennato in \secref{sec:sess_job_control_overview}, nel sistema del
260 \textit{job control} i processi all'interno di una sessione fanno riferimento
261 ad un terminale di controllo (ad esempio quello su cui si è effettuato il
262 login), sul quale effettuano le operazioni di lettura e
263 scrittura,\footnote{nel caso di login grafico la cosa può essere più
264   complessa, e di norma l'I/O è effettuato tramite il server X, ma ad esempio
265   per i programmi, anche grafici, lanciati da un qualunque emulatore di
266   terminale, sarà quest'ultimo a fare da terminale (virtuale) di controllo.} e
267 dal quale ricevono gli eventuali segnali da tastiera.
268
269 A tale scopo lo standard POSIX.1 prevede che ad ogni sessione possa essere
270 associato un terminale di controllo; in Linux questo viene realizzato
271 mantenendo fra gli attributi di ciascun processo anche qual'è il suo terminale
272 di controllo. \footnote{Lo standard POSIX.1 non specifica nulla riguardo
273   l'implementazione; in Linux anch'esso viene mantenuto nella solita struttura
274   \var{task\_struct}, nel campo \var{tty}.}  In generale ogni processo eredita
275 dal padre, insieme al \acr{pgid} e al \acr{sid} anche il terminale di
276 controllo (vedi \secref{sec:proc_fork}). In questo modo tutti processi
277 originati dallo stesso leader di sessione mantengono lo stesso terminale di
278 controllo.
279
280 Alla creazione di una nuova sessione con \func{setsid} ogni associazione con
281 il precedente terminale di controllo viene cancellata, ed il processo che è
282 divenuto un nuovo leader di sessione dovrà riottenere\footnote{solo quando ciò
283   è necessario, cosa che, come vedremo in \secref{sec:sess_daemon}, non è
284   sempre vera}, un terminale di controllo. In generale questo viene fatto
285 automaticamente dal sistema\footnote{a meno di non avere richiesto
286   esplicitamente che questo non diventi un terminale di controllo con il flag
287   \macro{O\_NOCTTY} (vedi \secref{sec:file_open}). In questo Linux segue la
288   semantica di SVr4; BSD invece richiede che il terminale venga allocato
289   esplicitamente con una \func{ioctl} con il comando \macro{TIOCSCTTY}.}
290 quando viene aperto il primo terminale (cioè uno dei vari file di dispositivo
291 \file{/dev/tty*}) che diventa automaticamente il terminale di controllo,
292 mentre il processo diventa il \textsl{processo di controllo} di quella
293 sessione.
294
295 In genere (a meno di redirezioni) nelle sessioni di lavoro questo terminale è
296 associato ai file standard (di input, output ed error) dei processi nella
297 sessione, ma solo quelli che fanno parte del cosiddetto gruppo di
298 \textit{foreground}, possono leggere e scrivere in certo istante. Per
299 impostare il gruppo di \textit{foreground} di un terminale si usa la funzione
300 \func{tcsetpgrp}, il cui prototipo è:
301 \begin{functions}
302   \headdecl{unistd.h}
303   \headdecl{termios.h}
304   
305   \funcdecl{int tcsetpgrp(int fd, pid\_t pgrpid)} Imposta a \param{pgrpid} il
306   \textit{process group} di \textit{foreground} del terminale associato al
307   file descriptor \param{fd}.
308    
309   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
310     errore, nel qual caso \var{errno} assumerà i valori:
311     \begin{errlist}
312     \item[\macro{ENOTTY}] Il file \param{fd} non corrisponde al terminale di
313       controllo del processo chiamante.
314     \item[\macro{ENOSYS}] Il sistema non supporta il job control.
315     \item[\macro{EPERM}] Il \textit{process group} specificato non è nella
316     stessa sessione del processo chiamante.
317     \end{errlist}
318     ed inoltre \macro{EBADF} ed \macro{EINVAL}. 
319   }
320 \end{functions}
321 \noindent la funzione può essere eseguita con successo solo da
322 un processo nella stessa sessione e con lo stesso terminale di controllo. 
323
324 Come accennato in \secref{sec:sess_job_control_overview}, tutti i processi (e
325 relativi gruppi) che non fanno parte del gruppo di \textit{foreground} sono
326 detti in \textit{background}; se uno si essi cerca di accedere al terminale di
327 controllo provocherà l'invio da parte del kernel di uno dei due segnali
328 \macro{SIGTTIN} o \macro{SIGTTOU} (a seconda che l'accesso sia stato in
329 lettura o scrittura) a tutto il suo \textit{process group}; dato che il
330 comportamento di default di questi segnali (si riveda quanto esposto in
331 \secref{sec:sig_job_control}) è di bloccare il processo, di norma questo
332 comporta che tutti i membri del gruppo verranno fermati, ma non si avranno
333 condizioni di errore.\footnote{la shell in genere notifica comunque un
334   avvertimento, avvertendo la presenza di processi bloccati grazie all'uso di
335   \func{waitpid}.} Se però si bloccano o ignorano i due segnali citati, le
336 funzioni di lettura e scrittura falliranno con un errore di \macro{EIO}.
337
338 Un processo può contollare qual'è il gruppo di \textit{foreground} associato
339 ad un terminale con la funzione \func{tcgetpgrp}, il cui prototipo è:
340 \begin{functions}
341   \headdecl{unistd.h} \headdecl{termios.h}
342   
343   \funcdecl{pid\_t tcgetpgrp(int fd)} Legge il \textit{process group} di
344   \textit{foreground} del terminale associato al file descriptor \param{fd}.
345   \bodydesc{La funzione restituisce in caso di successo il \acr{pgid} del
346     gruppo di \textit{foreground}, e -1 in caso di errore, nel qual caso
347     \var{errno} assumerà i valori:
348     \begin{errlist}
349     \item[\macro{ENOTTY}] Non c'è un terminale di controllo o \param{fd} non
350       corrisponde al terminale di controllo del processo chiamante.
351     \end{errlist}
352     ed inoltre \macro{EBADF} ed \macro{ENOSYS}. 
353   }
354 \end{functions}
355
356 Si noti come entrambe le funzioni usino come argomento il valore di un file
357 descriptor, il risultato comunque non dipende dal file descriptor che si usa
358 ma solo dal terminale cui fa riferimento; il kernel inoltre permette a ciascun
359 processo di accedere direttamente al suo terminale di controllo attraverso il
360 file speciale \file{/dev/tty}, che per ogni processo è un sinonimo per il
361 proprio terminale di controllo.  Questo consente anche a processi che possono
362 aver rediretto l'output di accedere al terminale, pur non disponendo più del
363 file descriptor originario; un caso tipico è il programma \cmd{crypt} che
364 accetta la redirezione sullo standard input di un file da decrittare, ma deve
365 poi leggere la password dal terminale.
366
367 Un'altra caratteristica del terminale di controllo usata nel job control è che
368 utilizzando su di esso le combinazioni di tasti speciali (\cmd{C-z},
369 \cmd{C-c}, \cmd{C-y} e \verb|C-\|) si farà si che il kernel invii i
370 corrispondenti segnali (rispettivamente \macro{SIGTSTP}, \macro{SIGINT},
371 \macro{SIGQUIT} e \macro{SIGTERM}, trattati in \secref{sec:sig_job_control}) a
372 tutti i processi del gruppo di \textit{foreground}; in questo modo la shell
373 può gestire il blocco e l'interruzione dei vari comandi.
374  
375 Per completare la trattazione delle caratteristiche del job control legate al
376 terminale di controllo, occorre prendere in considerazione i vari casi legati
377 alla terminazione anomala dei processi, che sono di norma gestite attraverso
378 il segnale \macro{SIGHUP}. Il nome del segnale deriva da \textit{hungup},
379 termine che viene usato per indicare la condizione in cui il terminale diventa
380 inutilizzabile, (letteralmente sarebbe \textsl{impiccagione}). 
381
382 Quando si verifica questa condizione, ad esempio se si interrompe la linea, o
383 va giù la rete o più semplicemente si chiude forzatamente la finestra di
384 terminale su cui si stava lavorando, il kernel provvederà ad inviare il
385 segnale di \macro{SIGHUP} al processo di controllo. L'azione preimpostata in
386 questo caso è la terminazione del processo, il problema che si pone è cosa
387 accade agli altri processi nella sessione, che non han più un processo di
388 controllo che possa gestire l'accesso al terminale, che potrebbe essere
389 riutilizzato per qualche altra sessione.
390
391 Lo standard POSIX.1 prevede che quando il processo di controllo termina, che
392 ciò avvenga o meno per un \textit{hungup} del terminale (ad esempio si
393 potrebbe terminare direttamente la shell con \cmd{kill}) venga inviato un
394 segnale di \macro{SIGHUP} ai processi del gruppo di foreground. In questo modo
395 essi potranno essere avvisati che non esiste più un processo in grado di
396 gestire il terminale (di norma tutto ciò comporta la terminazione anche di
397 questi ultimi).
398
399 Restano però gli eventuali processi in background, che non ricevono il
400 segnale; in effetti se il terminale non dovesse più servire essi potrebbero
401 proseguire fino al completamento della loro esecuzione; ma si pone il problema
402 di come gestire quelli che sono bloccati, o che si bloccano nell'accesso al
403 terminale, in assenza di un processo che sia in grado di effettuare il
404 controllo dello stesso.
405
406 Questa è la situazione in cui si ha quello che viene chiamato un
407 \textit{orphaned process group}. Lo standard POSIX.1 lo definisce come un
408 \textit{process group} i cui processi hanno come padri esclusivamente o altri
409 processi nel gruppo, o processi fuori della sessione.  Lo standard prevede
410 inoltre che se la terminazione di un processo fa sì che un raggruppamento di
411 processi diventi orfano e se i suoi membri sono bloccati, ad essi vengano
412 inviati in sequenza i segnali di \macro{SIGHUP} e \macro{SIGCONT}.
413
414 La definizione può sembrare complicata, e a prima vista non è chiaro cosa
415 tutto ciò abbia a che fare con il problema della terminazione del processo di
416 controllo.  Consideriamo allora cosa avviene di norma nel \textit{job
417   control}: una sessione viene creata con \func{setsid} che crea anche un
418 nuovo process group: per definizione quest'ultimo è sempre \textsl{orfano},
419 dato che il padre del leader di sessione è fuori dalla stessa e il nuovo
420 process group contiene solo il leader di sessione. Questo è un caso limite, e
421 non viene emesso nessun segnale perché quanto previsto dallo standard riguarda
422 solo i raggruppamenti che diventano orfani in seguito alla terminazione di un
423 processo.\footnote{l'emissione dei segnali infatti avviene solo nella fase di
424   uscita del processo, come una delle operazioni legate all'esecuzione di
425   \func{_exit}, secondo quanto illustrato in \secref{sec:proc_termination}.}
426
427 Il leader di sessione provvederà a creare nuovi raggruppamenti di processi che
428 a questo punto non sono orfani in quanto esso resta padre per almeno uno dei
429 processi del gruppo (gli altri possono derivare dal primo). Alla terminazione
430 del leader di sessione però avremo che, come visto in
431 \secref{sec:proc_termination}, tutti i suoi figli vengono adottati da
432 \cmd{init}, che è fuori dalla sessione. Questo renderà orfani tutti i process
433 group creati direttamente dal leader di sessione (a meno di non aver spostato
434 con \func{setpgid} un processo da un gruppo ad un altro, cosa che di norma non
435 viene fatta) i quali riceveranno, nel caso siano bloccati, i due segnali:
436 \macro{SIGCONT} ne farà proseguire l'esecuzione, e, essendo stato nel
437 frattempo inviato anche \macro{SIGHUP}, se non c'è un gestore per
438 quest'ultimo, essi saranno terminati.
439
440
441
442
443 \subsection{Dal login alla shell}
444 \label{sec:sess_login}
445
446 L'organizzazione del sistema del job control è strettamente connessa alle
447 modalità con cui un utente accede al sistema per dare comandi, collegandosi ad
448 esso con un terminale, che sia questo realmente tale, come un VT100 collegato
449 ad una seriale o virtuale, come quelli associati a schermo e tastiera o ad una
450 connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
451 fine le differenze sono\footnote{in generale nel caso di login via rete o di
452   terminali lanciati dall'interfaccia grafica cambia anche il processo da cui
453   ha origine l'esecuzione della shell.} nel device cui il kernel associa i
454 file standard (vedi \secref{sec:file_std_descr}) per l'I/O, tratteremo solo il
455 caso classico del terminale.
456
457 Abbiamo già brevemente illustrato in \secref{sec:intro_kern_and_sys} le
458 modalità con cui il sistema si avvia, e di come, a partire da \cmd{init},
459 vengano lanciati tutti gli altri processi. Adesso vedremo in maniera più
460 dettagliata le modalità con cui il sistema arriva a fornire ad un utente la
461 shell che gli permette di lanciare i suoi comandi su un terminale.
462
463 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
464   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
465   altre distribuzioni dedicate a compiti limitati e specifici.}  viene usata
466 la procedura di avvio di System V; questa prevede che \cmd{init} legga dal
467 file di configurazione \file{/etc/inittab} quali programmi devono essere
468 lanciati, ed in quali modalità, a seconda del cosiddetto \textit{run level},
469 anch'esso definito nello stesso file.
470
471 Tralasciando la descrizione del sistema dei run level, (per il quale si
472 rimanda alla lettura delle pagine di manuale di \cmd{init} e di
473 \file{inittab}) quello che comunque viene sempre fatto è di eseguire almeno
474 una istanza di un programma che permetta l'accesso ad un terminale. Uno schema
475 di massima della procedura è riportato in \figref{fig:sess_term_login}.
476
477 \begin{figure}[htb]
478   \centering
479   \includegraphics[width=15cm]{img/tty_login}
480   \caption{Schema della procedura di login su un terminale.}
481   \label{fig:sess_term_login}
482 \end{figure}
483
484 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
485 ad un altro tipo di porta di comunicazione, o una delle console virtuali
486 associate allo schermo, viene sempre visto attraverso attraverso un device
487 driver che ne presenta un'interfaccia comune su un apposito file di
488 dispositivo. Storicamente i primi terminali erano appunto terminali di
489 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
490 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
491 della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali
492   vitruali associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
493
494 Per controllare un terminale si usa di solito il programma \cmd{getty} (od una
495 delle sue varianti), che permette di mettersi in ascolto su uno di questi
496 dispositivi. Alla radice della catena che porta ad una shell per i comandi
497 perciò c'è sempre \cmd{init} che esegue prima una \func{fork} e poi una
498 \func{exec} per lanciare una istanza di questo programma su un terminale, il
499 tutto ripetuto per ciascuno dei terminali che si hanno a disposizione (o per
500 un certo numero di essi, nel caso delle console virtuali), secondo quanto
501 indicato dall'amministratore nel file di configurazione del programma,
502 \file{/etc/inittab}.
503
504 Quando viene lanciato da \cmd{init} il programma parte con i privilegi di
505 amministratore e con un ambiente vuoto; \cmd{getty} si cura di chiamare
506 \func{setsid} per creare una nuova sessione ed un nuovo process group, e di
507 aprire il terminale (che così diventa il terminale di controllo della
508 sessione) in lettura sullo standard input ed in scrittura sullo standard
509 output e sullo standard error; inoltre effettuarà, qualora servano, ulteriori
510 settaggi.\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
511   di login in maiuscolo, può effettuare la conversione automatica dell'input
512   in minuscolo, ponendosi in una modalità speciale che non distingue fra i due
513   tipi di caratteri (a beneficio di alcuni vecchi terminali che non
514   supportavano le minuscole).} Alla fine il programma stamperà un messaggio di
515 benvenuto per poi porsi in attesa dell'immissione del nome di un utente.
516
517 Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente
518 il programma \cmd{login} con una \func{exevle}, passando come argomento la
519 stringa con il nome, ed un ambiente opportunamente costruito che contenga
520 quanto necessario (ad esempio di solito viene opportunamente inizializzata la
521 variabile di ambiente \texttt{TERM}) ad identificare il terminale su cui si
522 sta operando, a beneficio dei programmi che verranno lanciati in seguito.
523
524 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
525 nome dell'utente per effettuare una ricerca nel database degli
526 utenti,\footnote{in genere viene chiamata \func{getpwnam}, che abbiamo visto
527   in \secref{sec:sys_user_group}, per leggere la password e gli altri dati dal
528   database degli utenti.} e richiede una password. Se l'utente non esiste o se
529 la password non corrisponde\footnote{il confronto non viene effettuato con un
530   valore in chiaro; quanto immesso da terminale viene invece a sua volta
531   criptato, ed è il risultato che viene confrontato con il valore che viene
532   mantenuto nel database degli utenti.} la richiesta viene ripetuta un certo
533 numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a
534 rilanciare un'altra istanza di \func{getty}.
535
536 Se invece la password corrisponde \cmd{login} esegue \func{chdir} per settare
537 la \textit{home directory} dell'utente, cambia i diritti di accesso al
538 terminale (con \func{chown} e \func{chmod}) per assegnarne la titolarità
539 all'utente ed al suo gruppo principale, assegnandogli al contempo i diritti di
540 lettura e scrittura. Inoltre il programma provvede a costruire gli opportuni
541 valori per le variabili di ambiente, come \texttt{HOME}, \texttt{SHELL}, ecc.
542 Infine attraverso l'uso di \func{setuid}, \func{setpid} e \func{initgroups}
543 verrà cambiata l'identità del proprietario del processo, infatti, come
544 spiegato in \secref{sec:proc_setuid}, avendo invocato tali funzioni con i
545 privilegi di amministratore, tutti gli userid ed i groupid (reali, effettivi e
546 salvati) saranno settati a quelli dell'utente.
547
548 A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
549 iniziali, come la stampa di messaggi di benvenuto o il controllo della posta)
550 ad eseguire con un'altra \func{exec} la shell di login, che si troverà con un
551 ambiente già pronto e con file standard di \secref{sec:file_std_descr}
552 impostati sul terminale, pronta ad eseguire i comandi fino all'uscita. Dato
553 che il processo genitore resta sempre \cmd{init} quest'ultimo provvederà,
554 ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
555 per ripetere da capo tutto il procedimento.
556
557
558 In generale quando con il contollo di sessione è la shell che assume il ruolo
559 di processo di controllo, seleziona il gruppo di \textit{foregroud} e gestisce
560 l'assegnazione dei process group ai programmi eseguiti sulla stessa riga di
561 comando. 
562
563 Qualora un processo venga bloccato nella gestione della sessione, sia
564 implicitamente, perché cerca di eseguire dell'I/O sul terminale mentre è in
565 background, sia esplicitamente con l'uso di \cmd{C-z}, la shell è in grado di
566 rilevare l'evento grazie all'uso di \func{waitpid} con l'opzione
567 \macro{WUNTRACED}. In questo modo la shell può notificare (di solito prima
568 della stampa del prompt, lo stato dei vari processi. 
569
570
571
572
573
574 \subsection{Prescrizioni per un programma \textit{daemon}}
575 \label{sec:sess_daemon}
576
577 Come sottolineato fin da \secref{sec:intro_base_concept}, in un sistema
578 unix-like tutte le operazioni sono eseguite tramite processi, comprese quelle
579 operazioni di sistema (come l'esecuzione di comandi periodici, o la consegna
580 della posta, ed in generale tutti i programmi di servizio) che non hanno a che
581 fare con la gestione diretta dei comandi dell'utente.
582
583 Questi programmi, che devono essere eseguiti in modalità non interattiva senza
584 nessun intervento dell'utente, sono normalmente chiamati \textsl{demoni}, (o
585 \textit{daemons}), nome ispirato dagli omonimi spiritelli che svolgevano vari
586 compiti, di cui parlava Socrate (che sosteneva di averne uno al suo
587 servizio).\footnote{NdT. ricontrollare, i miei ricordi di filosofia sono
588   piuttosto datati.}
589
590
591
592
593 \section{L'I/O su terminale}
594 \label{sec:sess_terminal_io}
595
596 Esamineremo in questa sezione le peculiarità dell'I/O su terminale, tenendo
597 conto delle 
598
599
600 %%% Local Variables: 
601 %%% mode: latex
602 %%% TeX-master: "gapil"
603 %%% End: