92e532d847973d7be79692c3daaf934010c6ebd3
[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}) un
48 solo comando alla volta (quello che viene detto in \textit{foreground}), potrà
49 scrivere e leggere dal terminale. La shell però può eseguire anche più comandi
50 in contemporanea, mandandoli in \textit{background} (aggiungendo una \cmd{\&}
51 alla fine del comando), nel qual caso essi saranno eseguiti senza essere
52 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}, 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 questo invii a tutti i processi del
75 raggruppamento un segnale di \macro{SIGTTIN} o di \macro{SIGTTOU}, a seconda
76 che l'accesso sia rispettivamente in lettura o scrittura, bloccando (secondo
77 il comportamento di default esposto in \secref{sec:sig_job_control}) i
78 processi.
79
80 Un comportamento analogo si ha anche per i segnali generati dai comandi di
81 tastiera inviati dal terminale con \cmd{C-z}, \cmd{C-c}, \cmd{C-y} e
82 \verb|C-\|; questi generano rispettivamente i segnali \macro{SIGTSTP},
83 \macro{SIGINT}, \macro{SIGQUIT} e \macro{SIGTERM}, che vengono inviati a tutti
84 i processi del raggruppamento in \textit{foreground}. In particolare il primo
85 di essi, \macro{SIGTSTP}, interrompe l'esecuzione del comando, che può poi
86 essere mandato in \textit{background} con il comando \cmd{bg}. Il comando
87 \cmd{fg} consente invece di mettere in \textit{foreground} un comando
88 precedentemente lanciato in \textit{background}.
89
90 Di norma la shell si cura anche di notificare all'utente (di solito prima
91 della stampa a video del prompt) lo stato dei vari processi, essa infatti usa
92 le caratteristiche della funzione \func{waitpid} (si riveda quanto detto in
93 \secref{sec:proc_wait}) per verificare quali gruppi di processi sono bloccati
94 e quali sono terminati. 
95
96
97 \subsection{I \textit{process group} e le \textsl{sessioni}}
98 \label{sec:sess_proc_group}
99
100 Come accennato in \secref{sec:sess_job_control_overview} nel job control i
101 processi vengono raggruppati in \textit{process group} e \textit{sessioni};
102 per far questo vengono utilizzati due ulteriori identificatori (oltre quelli
103 visti in \secref{sec:proc_pid}) che il kernel associa a ciascun
104 processo:\footnote{in Linux questi identificatori sono mantenuti nei campi
105   \var{pgrp} e \var{session} della struttura \var{task\_struct} definita in
106   \file{sched.h}.}  l'identificatore del \textit{process group} e
107 l'identificatore della \textsl{sessione}, che vengono indicati rispettivamente
108 con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo
109 \type{pid\_t}. I valori di questi identificatori possono essere visualizzati
110 dal comando \cmd{ps} usando l'opzione \cmd{-j}.
111
112 Un \textit{process group} è pertanto definito da tutti i processi che hanno lo
113 stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con
114 le funzioni \func{getpgid} e \func{getpgrp},\footnote{\func{getpgrp} è
115   definita nello standard POSIX.1, mentre \func{getpgid} è richiesta da SVr4.}
116 i cui prototipi sono:
117 \begin{functions}
118   \headdecl{unistd.h}
119
120   \funcdecl{pid\_t getpgid(pid\_t pid)} 
121   Legge il \acr{pgid} del processo \param{pid}.
122
123   \funcdecl{pid\_t getpgrp(void)}
124   Legge il \acr{pgid} del processo corrente.
125   
126   \bodydesc{Le funzioni restituiscono il \acr{pgid} del processo,
127     \func{getpgrp} ha sempre successo, mentre \func{getpgid} restituisce -1
128     ponendo \var{errno} a \macro{ESRCH} se il processo selezionato non esiste.}
129 \end{functions}
130
131 La funzione \func{getpgid} permette di specificare il \acr{pid} del processo
132 di cui si vuole sapere il \acr{pgid}; un valore nullo per \param{pid}
133 restituisce il \acr{pgid} del processo corrente; \func{getpgrp} è di norma
134 equivalente a \code{getpgid(0)}.
135
136 In maniera analoga l'identificatore della sessione può essere letto dalla
137 funzione \func{getsid}, che però nelle \acr{glibc}\footnote{la system call è
138   stata introdotta in Linux a partire dalla versione 1.3.44, il supporto nelle
139   librerie del C è iniziato dalla versione 5.2.19. La funzione non è prevista
140   da POSIX.1, che parla solo di processi leader di sessione, e non di
141   identificatori di sessione.} è accessibile solo definendo
142 \macro{\_XOPEN\_SOURCE} e \macro{\_XOPEN\_SOURCE\_EXTENDED}; il suo prototipo
143 è:
144 \begin{prototype}{unistd.h}{pid\_t getsid(pid\_t pid)}
145   Legge l'identificatore di sessione del processo \param{pid}.
146   
147   \bodydesc{La funzione restituisce l'identificatore (un numero positivo) in
148   caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà
149   i valori:
150     \begin{errlist}
151     \item[\macro{ESRCH}] Il processo selezionato non esiste.
152     \item[\macro{EPERM}] In alcune implementazioni viene restituito quando il
153       processo selezionato non fa parte della stessa sessione del processo
154       corrente.
155     \end{errlist}
156   }
157 \end{prototype}
158
159 Entrambi gli identificatori vengono inizializzati alla creazione di ciascun
160 processo con lo stesso valore che hanno nel processo padre, per cui un
161 processo appena creato appartiene sempre allo stesso raggruppamento e alla
162 stessa sessione del padre. Vedremo poi come sia possibile creare più
163 \textit{process group} all'interno della stessa sessione, e spostare i
164 processi dall'uno all'altro, ma sempre all'interno di una stessa sessione.
165
166 Ciascun gruppo di processi ha sempre un processo principale, il cosiddetto
167 \textit{process group leader}, che è identificato dall'avere un \acr{pgid}
168 uguale al suo \acr{pid}, in genere questo è il primo processo del gruppo, che
169 si incarica di lanciare tutti gli altri. Un nuovo gruppo si crea con la
170 funzione \func{setpgrp},\footnote{questa è la definizione di POSIX.1, BSD
171   definisce una funzione con lo stesso nome, che però è identica a
172   \func{setpgid}; nelle \acr{glibc} viene sempre usata sempre questa
173   definizione, a meno di non richiedere esplicitamente la compatibilità
174   all'indietro con BSD, definendo la macro \macro{\_BSD\_SOURCE}.} il cui
175 prototipo è:
176 \begin{prototype}{unistd.h}{int setpgrp(void)}
177   Modifica il \acr{pgid} al valore del \acr{pid} del processo corrente.
178   
179   \bodydesc{La funzione restituisce il valore del nuovo \textit{process
180       group}.}
181 \end{prototype}
182
183 La funzione, assegnando al \acr{pgid} il valore del \acr{pid} processo
184 corrente, rende questo \textit{process leader} di un nuovo gruppo, tutti i
185 successivi processi da esso creati apparterranno (a meno di non cambiare di
186 nuovo il \acr{pgid}) al nuovo gruppo. È possibile invece spostare un processo
187 da un gruppo ad un altro con la funzione \func{setpgid}, il cui prototipo è:
188 \begin{prototype}{unistd.h}{int setpgid(pid\_t pid, pid\_t pgid)}
189   Assegna al \acr{pgid} del processo \param{pid} il valore \param{pgid}.
190   
191   \bodydesc{La funzione ritorna il valore del nuovo \textit{process group}, e
192   -1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
193     \begin{errlist}
194     \item[\macro{ESRCH}] Il processo selezionato non esiste.
195     \item[\macro{EPERM}] Il cambiamento non è consentito.
196     \item[\macro{EACCESS}] Il processo ha già eseguito una \func{exec}.
197     \item[\macro{EINVAL}] Il valore di \param{pgid} è negativo.
198     \end{errlist}
199  }
200 \end{prototype}
201
202 La funzione permette di cambiare il \acr{pgid} del processo \param{pid}, ma il
203 cambiamento può essere effettuato solo se \param{pgid} indica un
204 \textit{process group} che è nella stessa sessione del processo chiamante.
205 Inoltre la funzione può essere usata soltanto sul processo corrente o su uno
206 dei suoi figli, ed in quest'ultimo caso ha successo soltanto se questo non ha
207 ancora eseguito una \func{exec}. Specificando un valore nullo per \param{pid}
208 si indica il processo corrente, mentre specificando un valore nullo per
209 \param{pgid} si imposta il \textit{process group} al valore del \acr{pid} del
210 processo selezionato; pertanto \func{setpgrp} è equivalente a \code{setpgid(0,
211   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 settandone \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 concidono.}
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 La 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. In questo modo tutti processi originati dallo stesso leader di
282 sessione mantengono lo stesso terminale di controllo.
283
284 Alla creazione di una nuova sessione con \func{setsid} ogni associazione con
285 il precedente terminale di controllo viene cancellata, ed il processo che è
286 divenuto un nuovo leader di sessione dovrà riottenere (qualora sia necessario,
287 cosa che, come vedremo in \secref{sec:sess_daemon}, non è sempre vera), un
288 terminale di controllo. In generale questo viene fatto automaticamente dal
289 sistema quando il leader di sessione apre il suo primo terminale\footnote{a
290   meno di non avere richiesto esplicitamente che questo non diventi un
291   terminale di controllo con il flag \macro{O\_NOCTTY} (vedi
292   \secref{sec:file_open}). In questo Linux segue la semantica di SVr4; BSD
293   invece richiede che il terminale venga allocato esplicitamente con una
294   \func{ioctl} con il comando \macro{TIOCSCTTY}.} che diventa automaticamente
295 il terminale di controllo. 
296
297 Per ciascuna sessione di lavoro avremo allora un terminale di controllo, ed un
298 processo di \textit{foreground}, che è quello 
299
300 Il kernel identifica 
301
302 \subsection{Dal login alla shell}
303 \label{sec:sess_login}
304
305 L'organizzazione del sistema del job control è strettamente connessa alle
306 modalità con cui un utente accede al sistema per dare comandi, collegandosi ad
307 esso con un terminale, che sia questo realmente tale, come un VT100 collegato
308 ad una seriale o virtuale, come quelli associati a schermo e tastiera o ad una
309 connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
310 fine le differenze sono\footnote{in generale nel caso di login via rete o di
311   terminali lanciati dall'interfaccia grafica cambia anche il processo da cui
312   ha origine l'esecuzione della shell.} nel device cui il kernel associa i
313 file standard (vedi \secref{sec:file_std_descr}) per l'I/O, tratteremo solo il
314 caso classico del terminale.
315
316 Abbiamo già brevemente illustrato in \secref{sec:intro_kern_and_sys} le
317 modalità con cui il sistema si avvia, e di come, a partire da \cmd{init},
318 vengano lanciati tutti gli altri processi. Adesso vedremo in maniera più
319 dettagliata le modalità con cui il sistema arriva a fornire ad un utente la
320 shell che gli permette di lanciare i suoi comandi su un terminale.
321
322 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
323   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
324   altre distribuzioni dedicate a compiti limitati e specifici.}  viene usata
325 la procedura di avvio di System V; questa prevede che \cmd{init} legga dal
326 file di configurazione \file{/etc/inittab} quali programmi devono essere
327 lanciati, ed in quali modalità, a seconda del cosiddetto \textit{run level},
328 anch'esso definito nello stesso file.
329
330 Tralasciando la descrizione del sistema dei run level, (per il quale si
331 rimanda alla lettura delle pagine di manuale di \cmd{init} e di
332 \file{inittab}) quello che comunque viene sempre fatto è di eseguire almeno
333 una istanza di un programma che permetta l'accesso ad un terminale. Uno schema
334 di massima della procedura è riportato in \figref{fig:sess_term_login}.
335
336 \begin{figure}[htb]
337   \centering
338   \includegraphics[width=15cm]{img/tty_login}
339   \caption{Schema della procedura di login su un terminale.}
340   \label{fig:sess_term_login}
341 \end{figure}
342
343 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
344 ad un altro tipo di porta di comunicazione, o una delle console virtuali
345 associate allo schermo, viene sempre visto attraverso attraverso un device
346 driver che ne presenta un'interfaccia comune su un apposito file di
347 dispositivo. Storicamente i primi terminali erano appunto terminali di
348 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
349 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
350 della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali
351   vitruali associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
352
353 Per controllare un terminale si usa di solito il programma \cmd{getty} (od una
354 delle sue varianti), che permette di mettersi in ascolto su uno di questi
355 dispositivi. Alla radice della catena che porta ad una shell per i comandi
356 perciò c'è sempre \cmd{init} che esegue prima una \func{fork} e poi una
357 \func{exec} per lanciare una istanza di questo programma su un terminale, il
358 tutto ripetuto per ciascuno dei terminali che si hanno a disposizione (o per
359 un certo numero di essi, nel caso delle console virtuali), secondo quanto
360 indicato dall'amministratore nel file di configurazione del programma,
361 \file{/etc/inittab}.
362
363 Quando viene lanciato da \cmd{init} il programma parte con i privilegi di
364 amministratore e con un ambiente vuoto; \cmd{getty} si cura di chiamare
365 \func{setsid} per creare una nuova sessione ed un nuovo process group, e di
366 aprire il terminale (che così diventa il terminale di controllo della
367 sessione) in lettura sullo standard input ed in scrittura sullo standard
368 output e sullo standard error; inoltre effettuarà, qualora servano, ulteriori
369 settaggi.\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
370   di login in maiuscolo, può effettuare la conversione automatica dell'input
371   in minuscolo, ponendosi in una modalità speciale che non distingue fra i due
372   tipi di caratteri (a beneficio di alcuni vecchi terminali che non
373   supportavano le minuscole).} Alla fine il programma stamperà un messaggio di
374 benvenuto per poi porsi in attesa dell'immissione del nome di un utente.
375
376 Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente
377 il programma \cmd{login} con una \func{exevle}, passando come argomento la
378 stringa con il nome, ed un ambiente opportunamente costruito che contenga
379 quanto necessario (ad esempio di solito viene opportunamente inizializzata la
380 variabile di ambiente \texttt{TERM}) ad identificare il terminale su cui si
381 sta operando, a beneficio dei programmi che verranno lanciati in seguito.
382
383 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
384 nome dell'utente per effettuare una ricerca nel database degli
385 utenti,\footnote{in genere viene chiamata \func{getpwnam}, che abbiamo visto
386   in \secref{sec:sys_user_group}, per leggere la password e gli altri dati dal
387   database degli utenti.} e richiede una password. Se l'utente non esiste o se
388 la password non corrisponde\footnote{il confronto non viene effettuato con un
389   valore in chiaro; quanto immesso da terminale viene invece a sua volta
390   criptato, ed è il risultato che viene confrontato con il valore che viene
391   mantenuto nel database degli utenti.} la richiesta viene ripetuta un certo
392 numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a
393 rilanciare un'altra istanza di \func{getty}.
394
395 Se invece la password corrisponde \cmd{login} esegue \func{chdir} per settare
396 la \textit{home directory} dell'utente, cambia i diritti di accesso al
397 terminale (con \func{chown} e \func{chmod}) per assegnarne la titolarità
398 all'utente ed al suo gruppo principale, assegnandogli al contempo i diritti di
399 lettura e scrittura. Inoltre il programma provvede a costruire gli opportuni
400 valori per le variabili di ambiente, come \texttt{HOME}, \texttt{SHELL}, ecc.
401 Infine attraverso l'uso di \func{setuid}, \func{setpid} e \func{initgroups}
402 verrà cambiata l'identità del proprietario del processo, infatti, come
403 spiegato in \secref{sec:proc_setuid}, avendo invocato tali funzioni con i
404 privilegi di amministratore, tutti gli userid ed i groupid (reali, effettivi e
405 salvati) saranno settati a quelli dell'utente.
406
407 A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
408 iniziali, come la stampa di messaggi di benvenuto o il controllo della posta)
409 ad eseguire con un'altra \func{exec} la shell di login, che si troverà con un
410 ambiente già pronto e con file standard di \secref{sec:file_std_descr}
411 impostati sul terminale, pronta ad eseguire i comandi fino all'uscita. Dato
412 che il processo genitore resta sempre \cmd{init} quest'ultimo provvederà,
413 ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
414 per ripetere da capo tutto il procedimento.
415
416
417
418 \subsection{Prescrizioni per un programma \textit{daemon}}
419 \label{sec:sess_daemon}
420
421 Come sottolineato fin da \secref{sec:intro_base_concept}, in un sistema
422 unix-like tutte le operazioni sono eseguite tramite processi, comprese quelle
423 operazioni di sistema (come l'esecuzione di comandi periodici, o la consegna
424 della posta, ed in generale tutti i programmi di servizio) che non hanno a che
425 fare con la gestione diretta dei comandi dell'utente.
426
427 Questi programmi, che devono essere eseguiti in modalità non interattiva senza
428 nessun intervento dell'utente, sono normalmente chiamati \textsl{demoni}, (o
429 \textit{daemons}), nome ispirato dagli omonimi spiritelli che svolgevano vari
430 compiti, di cui parlava Socrate (che sosteneva di averne uno al suo
431 servizio).\footnote{NdT. ricontrollare, i miei ricordi di filosofia sono
432   piuttosto datati.}
433
434
435
436
437 \section{L'I/O su terminale}
438 \label{sec:sess_terminal_io}
439
440 Esamineremo in questa sezione le peculiarità dell'I/O su terminale, tenendo
441 conto delle 
442
443
444 %%% Local Variables: 
445 %%% mode: latex
446 %%% TeX-master: "gapil"
447 %%% End: