risistemato il capitolo sulle sessioni di lavoro
[gapil.git] / session.tex
index 969c05db00568956836ea4bafe8cc1fd63fa949a..cdc557360e7171ba87bed6c0715662f15134bfd9 100644 (file)
 \chapter{Sessioni di lavoro}
 \label{cha:session}
 
 \chapter{Sessioni di lavoro}
 \label{cha:session}
 
-Esamineremo in questo capitolo le modalità in cui sono organizzati i processi
-all'interno del sistema e le varie relazioni che intercorrono fra di essi, e
-le modalità che permettono, a partire dall'avvio del sistema, di organizzare
-il lavoro degli utenti in sessioni di lavoro associate ai terminali di
-controllo con cui essi si sono collegati al sistema.
+Unix nasce prima dell'esistenza dei moderni PC, quando i computer occupavano
+stanze intere e ci si poteva collegare solo attraverso dei terminali, ma fin
+dalle sue origini è sempre stato un sistema multitasking e multiutente,
+in grado di consentire l'utilizzo di un solo computer da parte di più persone.
 
 
-\section{La procedura di login}
+Esamineremo in questo capitolo i concetti base del sistema delle sessioni di
+lavoro, vale a dire il metodo con cui il kernel gestisce l'accesso concorrente
+al sistema da parte di più utenti, permettendo loro di eseguire più programmi
+in contemporanea.
+
+
+\section{Il \textit{Job control}}
+\label{sec:sess_job_control}
+
+Viene comunemente chiamato \textit{Job control} quell'insieme di funzionalità
+del sistema il cui scopo è quello di permettere ad un utente di poter
+sfruttare le capacità multitasking di un sistema Unix per eseguire in
+contemporanea più processi, pur potendo accedere, di solito, ad un solo
+terminale,\footnote{con X e con i terminali vituali tutto questo non è più
+  vero, dato che si può accedere a molti terminali in contemporanea, ma il
+  sistema è nato prima dell'esistenza di tutto ciò.} avendo cioè un solo punto
+in cui si può avere accesso all'input ed all'output degli stessi.
+
+
+\subsection{La struttura di base}
+\label{sec:sess_relation}
+
+Per poter gestire il \textit{Job Control} il kernel associa a ciascun processo
+due ulteriori identificatori (oltre quelli visti in \secref{sec:proc_pid}):
+l'identificatore del cosiddetto \textit{process group} (o
+\textsl{ragguppamento di processi}), cui si fa di norma riferimento con la
+sigla \acr{pgid}, l'identificatore di sessione (il \textit{session id}) cui si
+fa riferimento con la sigla \acr{sid}).  In questo modo, sulla base dei valori
+dei rispettivi indicatori, i processi vengono organizzati in \textsl{sessioni}
+e \textsl{raggruppamenti}.
+
+Entrambi gli identificatori vengono impostati alla creazione di ciascun
+processo allo stesso valore che hanno nel processo padre, un processo appena
+creato cioè appartiene sempre allo stesso raggruppamento e alla stessa
+sessione del padre. La differenza fra i due identificatori è che un processo
+può cambiare \acr{pgid} soltanto ad un valore che corrisponda al
+\textit{process group} di un altro processo della stessa sessione, oppure al
+suo stesso \acr{pid} (creando così un nuovo \textit{process group}). Se invece
+si modifica il \acr{sid} il processo viene automaticamente messo anche in un
+nuovo \textit{process group}, corrispondente al suo \acr{pid}.
+
+Per capire meglio il significato di questi identificatori vediamone subito
+l'uso concreto nella gestione del \textit{job control} della linea di comando.
+Una volta che si è completata la procedura di login (che esamineremo in
+dettaglio in \secref{sec:sess_login}), si avrà a disposizione una shell,
+associata ad un terminale (detto \textsl{terminale di controllo}), dalla quale
+eseguire i comandi, una delle caratteristiche della shell è quella di
+consentire di inviare un comando in \textit{background}, cioè di farlo
+eseguire distaccandolo dal terminale, che potrà essere utilizzato da altri
+comandi. Così un solo un comando alla volta potrà leggere e scrivere sul
+terminale (quello che viene detto in \textit{foreground}).
+
+Fra le funzionalità della shell c'è anche quella di consentire di concatenare
+più programmi in una sola riga di comando con le pipe, in tal caso, ed
+inoltre, anche quando si invoca un singolo programma, questo può sempre
+lanciare ulteriori sottoprocessi per eseguire dei compiti specifici.
+
+La shell farà si che tutti i processi che originano da un sola riga di
+comando vengano raggruppati in un unico \textit{process group}; questo perché
+i segnali inviati sul terminale con i comandi da tastiera (quelli illustrati
+in \secref{sec:sig_job_control}) vengono inviati a tutti i processi che fan
+parte del raggruppamento di \textit{foreground}, cioè quelli che stanno corre
+
+
+Per consentire l'utilizzo contemporaneo dello stesso terminale la shell deve
+essere in grado di garantire che solo un comando alla volta possa accedervi; 
+
+
+
+
+
+Lo stato del sistema può essere verificato con il comando \cmd{ps -je f}
+
+
+
+\subsection{Il login ed il terminale di controllo}
 \label{sec:sess_login}
 
 \label{sec:sess_login}
 
-L'organizzazione del sistema del \textit{Job Control}\footnote{viene
-  usualmente chiamata così la capacità del sistema di poter gestire più
-  processi (i \textit{job}) lanciati in contemporanea a partire da una shell,
-  di solito associata al terminale su cui si è appunto effettuato il login, in
-  modo da poter gestire la possibile presenza di più di un processo che
-  necessita di accedere a quest'ultimo.} è strettamente connessa alle modalità
-con cui un utente accede al sistema, collegandosi ad esso con un terminale,
-che sia questo realmente tale, come un VT100 collegato ad una seriale o
-virtuale, come quelli associati a schermo e tastiera, o semplicemente
-associato ad una connessione di rete. Per questo motivo in questa prima
-sezione prenderemo in esame le modalità di come avviene tutto ciò e di come il
-sistema (a partire da \cmd{init}) sia in grado di gestire il tutto.
-
-
-\subsection{Il login su terminale}
-\label{sec:sess_tty_log}
-
-La modalità più classica di accesso ad un sistema Unix è quella del login su
-terminale, che pertanto esamineremo per prima. Abbiamo già brevemente
-illustrato in \secref{sec:intro_kern_and_sys} le modalità con cui il sistema
-si avvia, e di come, a partire da \cmd{init}, vengano lanciati tutti gli altri
-programmi. Adesso prenderemo in esame in maniera dettagliata le modalità con
-cui si arriva a fornire ad un utente la shell che gli permette di lanciare i
-suoi comandi.
+L'organizzazione del sistema del \textit{Job Control} è strettamente connessa
+alle modalità con cui un utente accede al sistema, collegandosi ad esso con un
+terminale, che sia questo realmente tale, come un VT100 collegato ad una
+seriale o virtuale, come quelli associati a schermo e tastiera o ad una
+connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
+fine le differenze sono\footnote{in generale nel caso di login via rete o di
+  terminali lanciati dall'interfaccia grafica cambia anche il processo da cui
+  ha origine l'esecuzione della shell.} nel device cui il kernel associa i
+file standard di \secref{sec:file_std_descr}, tratteremo solo il caso in
+questo è il classico terminale.
+
+Abbiamo già brevemente illustrato in \secref{sec:intro_kern_and_sys} le
+modalità con cui il sistema si avvia, e di come, a partire da \cmd{init},
+vengano lanciati tutti gli altri processi. Adesso vedremo in maniera più
+dettagliata le modalità con cui il sistema arriva a fornire ad un utente la
+shell che gli permette di lanciare i suoi comandi su un terminale.
 
 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
 
 Nella maggior parte delle distribuzioni di GNU/Linux\footnote{fa eccezione la
   distribuzione \textit{Slackware}, come alcune distribuzioni su dischetto, ed
@@ -44,18 +110,27 @@ lanciati, ed in quali modalit
 anch'esso definito nello stesso file.
 
 Tralasciando la descrizione del sistema dei run level, (per il quale si
 anch'esso definito nello stesso file.
 
 Tralasciando la descrizione del sistema dei run level, (per il quale si
-rimanda alla lettura della pagina di manuale di \cmd{init} e di
-\file{inittab}) quello che comunque viene sempre fatto è di lanciare almeno
-una istanza di un programma che permetta l'accesso ad un terminale.
+rimanda alla lettura delle pagine di manuale di \cmd{init} e di
+\file{inittab}) quello che comunque viene sempre fatto è di eseguire almeno
+una istanza di un programma che permetta l'accesso ad un terminale. Uno schema
+di massima della procedura è riportato in \secref{fig:sess_term_login}.
+
+\begin{figure}[htb]
+  \centering
+  \includegraphics[width=15cm]{img/tty_login}
+  \caption{Schema della procedura di login su un terminale.}
+  \label{fig:sess_term_login}
+\end{figure}
 
 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
 ad un altro tipo di porta di comunicazione, o una delle console virtuali
 
 Un terminale, che esso sia un terminale effettivo, attaccato ad una seriale o
 ad un altro tipo di porta di comunicazione, o una delle console virtuali
-associate allo schermo, viene sempre visto attraverso attraverso un device
+associate allo schermo,  viene sempre visto attraverso attraverso un device
 driver che ne presenta un'interfaccia comune su un apposito file di
 dispositivo. Storicamente i primi terminali erano appunto terminali di
 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
 driver che ne presenta un'interfaccia comune su un apposito file di
 dispositivo. Storicamente i primi terminali erano appunto terminali di
 telescriventi (\textit{teletype}), da cui deriva sia il nome dell'interfaccia,
 \textit{tty}, che quello dei relativi file di dispositivo, che sono sempre
-della forma \texttt{/dev/tty*}.
+della forma \texttt{/dev/tty*}.\footnote{questo vale anche per i terminali
+  associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
 
 Per controllare i terminali si usa di solito il programma \cmd{getty} (od una
 delle sue varianti), che permette di mettersi in ascolto sugli stessi. Alla
 
 Per controllare i terminali si usa di solito il programma \cmd{getty} (od una
 delle sue varianti), che permette di mettersi in ascolto sugli stessi. Alla
@@ -64,25 +139,26 @@ radice della catena che porta ad una shell per i comandi perci
 una istanza di questo programma su un terminale, il tutto ripetuto per
 ciascuno dei terminali che si hanno a disposizione (o per un certo numero di
 essi, nel caso delle console virtuali), secondo quanto indicato
 una istanza di questo programma su un terminale, il tutto ripetuto per
 ciascuno dei terminali che si hanno a disposizione (o per un certo numero di
 essi, nel caso delle console virtuali), secondo quanto indicato
-dall'amministratore in \file{/etc/inittab}.
+dall'amministratore nel file di configurazione del programma,
+\file{/etc/inittab}.
 
 
-Il programma viene lanciato da \texttt{init} con i privilegi di
-amministratore, e con un ambiente vuoto; \cmd{getty} si cura di aprire il
+Quando viene lanciato da \cmd{init} il programma parte con i privilegi di
+amministratore e con un ambiente vuoto; \cmd{getty} si cura di aprire il
 terminale in lettura sullo standard input ed in scrittura sullo standard
 terminale in lettura sullo standard input ed in scrittura sullo standard
-output e sullo standard error, di effettuare, qualora servano, ulteriori
+output e sullo standard error, di effettuare, qualora servano, ulteriori
 settaggi,\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
 settaggi,\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
-  di login in maiuscolo, può effettuare la conversione in minuscole
-  automaticamente, ponendosi in una modalità speciale che non distingue fra i
-  due tipi di caratteri (a beneficio di vecchi terminali che non supportano le
-  minuscole).} ed infine di stampare un messaggio di benvenuto e porsi in
-attesa dell'immissione del nome di un utente.
-
-Una volta che si sia immesso un nome di login \cmd{getty} esegue il programma
-\cmd{login} con una \func{exevle}, passando come argomento la suddetta stringa
-ed un ambiente opportunamente costruito che contenga quanto necessario (ad
-esempio di solito viene opportunamente inizializzata la variabile di ambiente
-\texttt{TERM}) ad identificare il terminale su cui si sta operando, a
-beneficio dei programmi che verranno lanciati in seguito.
+  di login in maiuscolo, può effettuare la conversione automatica dell'input
+  in minuscolo, ponendosi in una modalità speciale che non distingue fra i due
+  tipi di caratteri (a beneficio di alcuni vecchi terminali che non
+  supportavano le minuscole).} ed infine il programma stamperà un messaggio di
+benvenuto per poi porsi in attesa dell'immissione del nome di un utente.
+
+Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente
+il programma \cmd{login} con una \func{exevle}, passando come argomento la
+suddetta stringa ed un ambiente opportunamente costruito che contenga quanto
+necessario (ad esempio di solito viene opportunamente inizializzata la
+variabile di ambiente \texttt{TERM}) ad identificare il terminale su cui si
+sta operando, a beneficio dei programmi che verranno lanciati in seguito.
 
 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
 nome dell'utente per effettuare una ricerca nel database degli
 
 A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il
 nome dell'utente per effettuare una ricerca nel database degli
@@ -100,7 +176,7 @@ Se invece la password corrisponde a questo punto \cmd{login} esegue
 \func{chdir} per settare la \textit{home directory} dell'utente, cambia i
 diritti di accesso al terminale (con \func{chown} e \func{chmod}) per
 assegnarne la titolarità all'utente ed al suo gruppo principale, assegnandogli
 \func{chdir} per settare la \textit{home directory} dell'utente, cambia i
 diritti di accesso al terminale (con \func{chown} e \func{chmod}) per
 assegnarne la titolarità all'utente ed al suo gruppo principale, assegnandogli
-al contempo i diritti di lettura e scrittura. Inoltre il programma provvede
+al contempo i diritti di lettura e scrittura. Inoltre il programma provvede
 a costruire gli opportuni valori per le variabili di ambiente, come
 \texttt{HOME}, \texttt{SHELL}, ecc. Infine attraverso l'uso di \func{setuid},
 \func{setpid} e \func{initgroups} verrà cambiata l'identità del proprietario
 a costruire gli opportuni valori per le variabili di ambiente, come
 \texttt{HOME}, \texttt{SHELL}, ecc. Infine attraverso l'uso di \func{setuid},
 \func{setpid} e \func{initgroups} verrà cambiata l'identità del proprietario
@@ -118,44 +194,6 @@ ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
 per ripetere da capo tutto il procedimento.
 
 
 per ripetere da capo tutto il procedimento.
 
 
-\subsection{Il login via rete}
-\label{sec:sess_net_log}
-
-Nel caso di un login via rete la cosa si fa leggermente diversa, in tal caso
-infatti non essendo possibile prevedere 
-
-
-\subsection{Il login attraverso X}
-\label{sec:sess_X_log}
-
-Quanto scritto finora riguardo i terminali è piuttosto diverso quando si ha a
-che fare con X. In tal caso infatti la procedura grafica per il login è
-gestira da un apposito programma (il cosiddetto \textit{Display Manager}, come
-\cmd{xdm}, che fa parte della distribuzione base di X o uno dei suoi molti
-cloni) che viene lanciato all'avvio insieme agli altri demoni, e che si cura
-di gestire la procedura di login, lanciare eventuali programmi che si vogliono
-attivare all'avvio (sia fondamentali, come il gestore delle fineste, che
-effimeri, come un notificatore di posta in arrivo).
-
-In questo caso q
-
-\section{Il \textit{Job control}}
-\label{sec:sess_job_control}
-
-Lo scopo del \textit{Job control} è quello di permettere ad un utente di poter
-sfruttare le capacità multitasking di un sistema Unix per eseguire in
-contemporanea più processi, pur potendo accedere, di solito, ad un solo
-terminale,\footnote{con X e con i terminali vituali tutto questo non è più
-  vero, dato che si può accedere a molti terminali in contemporanea, ma il
-  sistema è nato prima dell'esistenza di tutto ciò.} avendo cioè un solo punto
-in cui su può avere accesso all'input ed all'output degli stessi.
-
-
-
-\subsection{La struttura di base}
-\label{sec:sess_relation}
-
-
 
 
 \subsection{I \textit{process group}}
 
 
 \subsection{I \textit{process group}}
@@ -177,6 +215,7 @@ in cui su pu
 \label{sec:sess_shell}
 
 
 \label{sec:sess_shell}
 
 
+
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"