b97024deb0ee38f8fc2d3d4ab07c2686d80806bf
[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 vituali tutto questo non è più vero, dato che si può
21   accedere a molti terminali in contemporanea, ma il sistema è nato prima
22   dell'esistenza di tutto ciò.} avendo cioè un solo punto in cui si può avere
23 accesso all'input ed all'output degli stessi. 
24
25
26 \subsection{Una panoramica introduttiva}
27 \label{sec:sess_job_control_overview}
28
29 Il \textit{job control} è una caratteristica opzionale, introdotta in BSD
30 negli anni '80, e successivamente standardizzata da POSIX.1; la sua
31 disponibilità nel sistema è verificabile attraverso il controllo della macro
32 \macro{\_POSIX\_JOB\_CONTROL}. In generale il \textit{job control} richiede il
33 supporto sia da parte della shell (quasi tutte ormai lo fanno), che da parte
34 del kernel; in particolare il kernel deve assicurare sia la presenza di un
35 driver per i terminali abilitato al \textit{job control} che quella dei
36 relativi segnali illustrati in \secref{sec:sig_job_control}. 
37
38 In un sistema che supporta il \textit{job cotrol} una volta completato il
39 login (che esamineremo in dettaglio in \secref{sec:sess_login}), l'utente avrà
40 a disposizione una shell dalla quale eseguire i comandi e potrà iniziare
41 quella che viene chiamata una \textsl{sessione}, che riunisce (vedi
42 \secref{sec:sess_sessions}) tutti i processi eseguiti all'interno dello stesso
43 login.
44
45 Siccome la shell è collegata ad un solo terminale (il \textsl{terminale di
46   controllo}, vedi \secref{sec:sess_control_term}) solo un comando alla volta,
47 quello che viene detto in \textit{foreground}, potrà scrivere e leggere dal
48 terminale. La shell però può eseguire anche più comandi in contemporanea,
49 mandandoli in \textit{background} (si fa aggiungendo una \cmd{\&} alla fine
50 del comando), nel qual caso essi saranno eseguiti senza essere collegati al
51 terminale.
52
53 Si noti come si sia parlato di comandi e non di programmi o processi; fra le
54 funzionalità della shell infatti c'è anche quella di consentire di concatenare
55 più programmi in una sola riga di comando con le pipe, ed in tal caso verranno
56 eseguiti più programmi, inoltre, anche quando si invoca un singolo programma,
57 questo potrà sempre lanciare altri processi per eseguire dei compiti
58 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 solo \textit{process
70   group} in \textit{foreground}, che riunisce i processi che possono accedere
71 al terminale, e più \textit{process group} in \textit{background}, che non
72 possono accedervi. Il job control prevede che quando un processo appartenente
73 ad un raggruppamento in \textit{background} cerca di accedere al terminale
74 questo invii a tutti i processi del raggruppamento un segnale di
75 \macro{SIGTTIN} o di \macro{SIGTTOU} (a seconda che l'accesso sia in lettura o
76 scrittura)
77
78
79
80
81
82
83
84
85
86
87
88
89 \subsection{I \textit{process group}}
90 \label{sec:sess_proc_group}
91
92
93
94 Per poter gestire il \textit{Job Control} il kernel associa a ciascun processo
95 due ulteriori identificatori (oltre quelli visti in \secref{sec:proc_pid}):
96 l'identificatore del cosiddetto \textit{process group} (o
97 \textsl{ragguppamento di processi}), cui si fa di norma riferimento con la
98 sigla \acr{pgid}, l'identificatore di sessione (il \textit{session id}) cui si
99 fa riferimento con la sigla \acr{sid}).  In questo modo, sulla base dei valori
100 dei rispettivi indicatori, i processi vengono organizzati in \textsl{sessioni}
101 e \textsl{raggruppamenti}.
102
103 Entrambi gli identificatori vengono impostati alla creazione di ciascun
104 processo allo stesso valore che hanno nel processo padre, un processo appena
105 creato cioè appartiene sempre allo stesso raggruppamento e alla stessa
106 sessione del padre. La differenza fra i due identificatori è che un processo
107 può cambiare \acr{pgid} soltanto ad un valore che corrisponda al
108 \textit{process group} di un altro processo della stessa sessione, oppure al
109 suo stesso \acr{pid} (creando così un nuovo \textit{process group}). Se invece
110 si modifica il \acr{sid} il processo viene automaticamente messo anche in un
111 nuovo \textit{process group}, corrispondente al suo \acr{pid}.
112
113
114
115
116 \subsection{Le sessioni}
117 \label{sec:sess_sessions}
118
119
120
121 \subsection{Il terminale di controllo}
122 \label{sec:sess_ctrl_term}
123
124
125
126 \subsection{La procedura di login}
127 \label{sec:sess_login}
128
129 L'organizzazione del sistema del job control è strettamente connessa alle
130 modalità con cui un utente accede al sistema, collegandosi ad esso con un
131 terminale, che sia questo realmente tale, come un VT100 collegato ad una
132 seriale o virtuale, come quelli associati a schermo e tastiera o ad una
133 connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
134 fine le differenze sono\footnote{in generale nel caso di login via rete o di
135   terminali lanciati dall'interfaccia grafica cambia anche il processo da cui
136   ha origine l'esecuzione della shell.} nel device cui il kernel associa i
137 file standard di \secref{sec:file_std_descr}, tratteremo solo il caso in
138 questo è il classico terminale.
139
140 Abbiamo già brevemente illustrato in \secref{sec:intro_kern_and_sys} le
141 modalità con cui il sistema si avvia, e di come, a partire da \cmd{init},
142 vengano lanciati tutti gli altri processi. Adesso vedremo in maniera più
143 dettagliata le modalità con cui il sistema arriva a fornire ad un utente la
144 shell che gli permette di lanciare i suoi comandi su un terminale.
145
146 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
147   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
148   altre distribuzioni dedicate a compiti limitati e specifici.}  viene usata
149 la procedura di avvio di System V; questa prevede che \cmd{init} legga dal
150 file di configurazione \file{/etc/inittab} quali programmi devono essere
151 lanciati, ed in quali modalità, a seconda del cosiddetto \textit{run level},
152 anch'esso definito nello stesso file.
153
154 Tralasciando la descrizione del sistema dei run level, (per il quale si
155 rimanda alla lettura delle pagine di manuale di \cmd{init} e di
156 \file{inittab}) quello che comunque viene sempre fatto è di eseguire almeno
157 una istanza di un programma che permetta l'accesso ad un terminale. Uno schema
158 di massima della procedura è riportato in \secref{fig:sess_term_login}.
159
160 \begin{figure}[htb]
161   \centering
162   \includegraphics[width=15cm]{img/tty_login}
163   \caption{Schema della procedura di login su un terminale.}
164   \label{fig:sess_term_login}
165 \end{figure}
166
167 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
168 ad un altro tipo di porta di comunicazione, o una delle console virtuali
169 associate allo schermo,  viene sempre visto attraverso attraverso un device
170 driver che ne presenta un'interfaccia comune su un apposito file di
171 dispositivo. Storicamente i primi terminali erano appunto terminali di
172 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
173 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
174 della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali
175   associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
176
177 Per controllare i terminali si usa di solito il programma \cmd{getty} (od una
178 delle sue varianti), che permette di mettersi in ascolto sugli stessi. Alla
179 radice della catena che porta ad una shell per i comandi perciò c'è sempre
180 \cmd{init} che esegue prima una \func{fork} e poi una \func{exec} per lanciare
181 una istanza di questo programma su un terminale, il tutto ripetuto per
182 ciascuno dei terminali che si hanno a disposizione (o per un certo numero di
183 essi, nel caso delle console virtuali), secondo quanto indicato
184 dall'amministratore nel file di configurazione del programma,
185 \file{/etc/inittab}.
186
187 Quando viene lanciato da \cmd{init} il programma parte con i privilegi di
188 amministratore e con un ambiente vuoto; \cmd{getty} si cura di aprire il
189 terminale in lettura sullo standard input ed in scrittura sullo standard
190 output e sullo standard error, e di effettuare, qualora servano, ulteriori
191 settaggi,\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
192   di login in maiuscolo, può effettuare la conversione automatica dell'input
193   in minuscolo, ponendosi in una modalità speciale che non distingue fra i due
194   tipi di caratteri (a beneficio di alcuni vecchi terminali che non
195   supportavano le minuscole).} ed infine il programma stamperà un messaggio di
196 benvenuto per poi porsi in attesa dell'immissione del nome di un utente.
197
198 Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente
199 il programma \cmd{login} con una \func{exevle}, passando come argomento la
200 suddetta stringa ed un ambiente opportunamente costruito che contenga quanto
201 necessario (ad esempio di solito viene opportunamente inizializzata la
202 variabile di ambiente \texttt{TERM}) ad identificare il terminale su cui si
203 sta operando, a beneficio dei programmi che verranno lanciati in seguito.
204
205 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
206 nome dell'utente per effettuare una ricerca nel database degli
207 utenti,\footnote{in genere viene chiamata \func{getpwnam}, che abbiamo visto
208   in \secref{sec:sys_user_group}, per leggere la password e gli altri dati dal
209   database degli utenti.} e richiede una password. Se l'utente non esiste o se
210 la password non corrisponde\footnote{il confronto non viene effettuato con un
211   valore in chiaro; quanto immesso da terminale viene invece a sua volta
212   criptato, ed è il risultato che viene confrontato con il valore che viene
213   mantenuto nel database degli utenti.} la richiesta viene ripetuta un certo
214 numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a
215 rilanciare un'altra istanza di \func{getty}.
216
217 Se invece la password corrisponde a questo punto \cmd{login} esegue
218 \func{chdir} per settare la \textit{home directory} dell'utente, cambia i
219 diritti di accesso al terminale (con \func{chown} e \func{chmod}) per
220 assegnarne la titolarità all'utente ed al suo gruppo principale, assegnandogli
221 al contempo i diritti di lettura e scrittura. Inoltre il programma provvede
222 a costruire gli opportuni valori per le variabili di ambiente, come
223 \texttt{HOME}, \texttt{SHELL}, ecc. Infine attraverso l'uso di \func{setuid},
224 \func{setpid} e \func{initgroups} verrà cambiata l'identità del proprietario
225 del processo, infatti, come spiegato in \secref{sec:proc_setuid}, avendo
226 invocato tali funzioni con i privilegi di amministratore, tutti gli userid ed
227 i groupid (reali, effettivi e salvati) saranno settati a quelli dell'utente.
228
229 A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
230 iniziali, come la stampa di messaggi di benvenuto o il controllo della posta)
231 ad eseguire con un'altra \func{exec} la shell di login, che si troverà con un
232 ambiente già pronto e con file standard di \secref{sec:file_std_descr}
233 impostati sul terminale, pronta ad eseguire i comandi fino all'uscita. Dato
234 che il processo genitore resta sempre \cmd{init} quest'ultimo provvederà,
235 ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
236 per ripetere da capo tutto il procedimento.
237
238
239
240
241 Lo stato del sistema può essere verificato con il comando \cmd{ps -je f}
242
243
244
245
246
247
248 \section{L'I/O su terminale}
249 \label{sec:sess_terminal_io}
250
251 Esamineremo in questa sezione le peculiarità dell'I/O su terminale, tenendo
252 conto delle 
253
254
255 %%% Local Variables: 
256 %%% mode: latex
257 %%% TeX-master: "gapil"
258 %%% End: