Continua la ristrutturazione.
[gapil.git] / session.tex
index 180b03202955399c7e8085339a15ac00175ca544..b97024deb0ee38f8fc2d3d4ab07c2686d80806bf 100644 (file)
-\chapter{Sessioni di lavoro}
+\chapter{Sessioni di lavoro e terminali}
 \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.
+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.  Nella seconda parte del capitolo tratteremo poi il
+funzionamento dell'I/O su terminale, e delle varie peculiarità che esso viene
+ad assumere a causa del suo stretto legame con le modalità di accesso al
+sistema da parte degli utenti.
 
-\section{La procedura di login}
+
+\section{Il \textit{job control}}
+\label{sec:sess_job_control}
+
+Viene comunemente chiamato \textit{job control} quell'insieme di funzionalità
+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{Una panoramica introduttiva}
+\label{sec:sess_job_control_overview}
+
+Il \textit{job control} è una caratteristica opzionale, introdotta in BSD
+negli anni '80, e successivamente standardizzata da POSIX.1; la sua
+disponibilità nel sistema è verificabile attraverso il controllo della macro
+\macro{\_POSIX\_JOB\_CONTROL}. In generale il \textit{job control} richiede il
+supporto sia da parte della shell (quasi tutte ormai lo fanno), che da parte
+del kernel; in particolare il kernel deve assicurare sia la presenza di un
+driver per i terminali abilitato al \textit{job control} che quella dei
+relativi segnali illustrati in \secref{sec:sig_job_control}. 
+
+In un sistema che supporta il \textit{job cotrol} una volta completato il
+login (che esamineremo in dettaglio in \secref{sec:sess_login}), l'utente avrà
+a disposizione una shell dalla quale eseguire i comandi e potrà iniziare
+quella che viene chiamata una \textsl{sessione}, che riunisce (vedi
+\secref{sec:sess_sessions}) tutti i processi eseguiti all'interno dello stesso
+login.
+
+Siccome la shell è collegata ad un solo terminale (il \textsl{terminale di
+  controllo}, vedi \secref{sec:sess_control_term}) solo un comando alla volta,
+quello che viene detto in \textit{foreground}, potrà scrivere e leggere dal
+terminale. La shell però può eseguire anche più comandi in contemporanea,
+mandandoli in \textit{background} (si fa aggiungendo una \cmd{\&} alla fine
+del comando), nel qual caso essi saranno eseguiti senza essere collegati al
+terminale.
+
+Si noti come si sia parlato di comandi e non di programmi o processi; fra le
+funzionalità della shell infatti c'è anche quella di consentire di concatenare
+più programmi in una sola riga di comando con le pipe, ed in tal caso verranno
+eseguiti più programmi, inoltre, anche quando si invoca un singolo programma,
+questo potrà sempre lanciare altri processi per eseguire dei compiti
+specifici.
+
+Per questo l'esecuzione di un comando può originare più di un processo; quindi
+nella gestione del job control non si può far riferimento ai singoli processi,
+per questo il kernel prevede la possibilità di raggruppare più processi in un
+\textit{process group} (detto anche \textsl{raggruppamento}, vedi
+\secref{sec:sess_proc_group}) e la shell farà sì che tutti i processi che
+originano da una riga di comando appartengano allo stesso \textit{process
+  group}, in modo che le varie funzioni di controllo, ed i segnali inviati dal
+terminale, possano fare riferimento ad esso.
+
+In generale allora all'interno di una sessione avremo un solo \textit{process
+  group} in \textit{foreground}, che riunisce i processi che possono accedere
+al terminale, e più \textit{process group} in \textit{background}, che non
+possono accedervi. Il job control prevede che quando un processo appartenente
+ad un raggruppamento in \textit{background} cerca di accedere al terminale
+questo invii a tutti i processi del raggruppamento un segnale di
+\macro{SIGTTIN} o di \macro{SIGTTOU} (a seconda che l'accesso sia in lettura o
+scrittura)
+
+
+
+
+
+
+
+
+
+
+
+
+\subsection{I \textit{process group}}
+\label{sec:sess_proc_group}
+
+
+
+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}.
+
+
+
+
+\subsection{Le sessioni}
+\label{sec:sess_sessions}
+
+
+
+\subsection{Il terminale di controllo}
+\label{sec:sess_ctrl_term}
+
+
+
+\subsection{La procedura di 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 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
@@ -44,8 +152,8 @@ lanciati, ed in quali modalit
 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
+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}.
 
@@ -58,12 +166,13 @@ di massima della procedura 
 
 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
-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
@@ -72,25 +181,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
-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
-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
-  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
@@ -108,7 +218,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
-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
@@ -126,63 +236,20 @@ ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
 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}}
-\label{sec:sess_proc_group}
 
 
+Lo stato del sistema può essere verificato con il comando \cmd{ps -je f}
 
-\subsection{Le sessioni}
-\label{sec:sess_sessions}
 
 
 
-\subsection{Il terminale di controllo}
-\label{sec:sess_ctrl_term}
 
 
+\section{L'I/O su terminale}
+\label{sec:sess_terminal_io}
 
-\subsection{La shell e i programmi}
-\label{sec:sess_shell}
+Esamineremo in questa sezione le peculiarità dell'I/O su terminale, tenendo
+conto delle 
 
 
 %%% Local Variables: