Completate sessioni, aggiunti riferimenti a dove sta la roba nel kernel,
[gapil.git] / session.tex
index 7b7b738c1be28baa175c0487c699f66a07199f24..a7cd2e8faa59dc0d523185a7c68691389c03e650 100644 (file)
@@ -1,4 +1,4 @@
-\chapter{Sessioni di lavoro e terminali}
+ \chapter{Sessioni di lavoro e terminali}
 \label{cha:session}
 
 Esamineremo in questo capitolo i concetti base del sistema delle sessioni di
@@ -18,9 +18,10 @@ il cui scopo 
 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 virtuali 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. 
+  accedere a molti terminali in contemporanea da una singola postazione di
+  lavoro, 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}
@@ -35,31 +36,30 @@ 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 control} 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_proc_group}) 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.
+In un sistema che supporta il \textit{job control}, una volta completato il
+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_proc_group}) tutti i processi eseguiti all'interno
+dello stesso login (esamineremo tutto il processo in dettaglio in
+\secref{sec:sess_login}).
+
+Siccome la shell è collegata ad un solo terminale (che viene usualmente
+chiamato \textsl{terminale di controllo}, vedi \secref{sec:sess_ctrl_term}) un
+solo 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} (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.
+questo potrà sempre lanciare sottoprocessi 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
+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
@@ -67,17 +67,17 @@ originano da una riga di comando appartengano allo stesso \textit{process
 terminale, possano fare riferimento ad esso.
 
 In generale allora all'interno di una sessione avremo un eventuale (possono
-non esserci comandi in \textit{foreground}) \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
-rispettivamente in lettura o scrittura, bloccando (secondo il comportamento
-di default esposto in \secref{sec:sig_job_control}) i processi.
-
-Un comportamento analogo sia ha anche per i segnali generati dai comandi di
+non esserci) \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 rispettivamente in lettura o scrittura, bloccando (secondo
+il comportamento di default esposto in \secref{sec:sig_job_control}) i
+processi.
+
+Un comportamento analogo si ha anche per i segnali generati dai comandi di
 tastiera inviati dal terminale con \cmd{C-z}, \cmd{C-c}, \cmd{C-y} e
 \verb|C-\|; questi generano rispettivamente i segnali \macro{SIGTSTP},
 \macro{SIGINT}, \macro{SIGQUIT} e \macro{SIGTERM}, che vengono inviati a tutti
@@ -100,10 +100,14 @@ e quali sono terminati.
 Come accennato in \secref{sec:sess_job_control_overview} nel job control i
 processi vengono raggruppati in \textit{process group} e \textit{sessioni};
 per far questo vengono utilizzati due ulteriori identificatori (oltre quelli
-visti in \secref{sec:proc_pid}) che il kernel associa a ciascun processo:
-l'identificatore del \textit{process group} e l'identificatore della
-\textsl{sessione}, che vengono indicati rispettivamente con le sigle
-\acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo \type{pid\_t}.
+visti in \secref{sec:proc_pid}) che il kernel associa a ciascun
+processo:\footnote{in Linux questi identificatori sono mantenuti nei campi
+  \var{pgrp} e \var{session} della struttura \var{task\_struct} definita in
+  \file{sched.h}.}  l'identificatore del \textit{process group} e
+l'identificatore della \textsl{sessione}, che vengono indicati rispettivamente
+con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo
+\type{pid\_t}. I valori di questi identificatori possono essere visualizzati
+dal comando \cmd{ps} usando l'opzione \cmd{-j}.
 
 Un \textit{process group} è pertanto definito da tutti i processi che hanno lo
 stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con
@@ -132,9 +136,11 @@ equivalente a \code{getpgid(0)}.
 In maniera analoga l'identificatore della sessione può essere letto dalla
 funzione \func{getsid}, che però nelle \acr{glibc}\footnote{la system call è
   stata introdotta in Linux a partire dalla versione 1.3.44, il supporto nelle
-  librerie del C è iniziato dalla versione 5.2.19.} è accessibile solo
-definendo \macro{\_XOPEN\_SOURCE} e \macro{\_XOPEN\_SOURCE\_EXTENDED}; il suo
-prototipo è:
+  librerie del C è iniziato dalla versione 5.2.19. La funzione non è prevista
+  da POSIX.1, che parla solo di processi leader di sessione, e non di
+  identificatori di sessione.} è accessibile solo definendo
+\macro{\_XOPEN\_SOURCE} e \macro{\_XOPEN\_SOURCE\_EXTENDED}; il suo prototipo
+è:
 \begin{prototype}{unistd.h}{pid\_t getsid(pid\_t pid)}
   Legge l'identificatore di sessione del processo \param{pid}.
   
@@ -143,8 +149,9 @@ prototipo 
   i valori:
     \begin{errlist}
     \item[\macro{ESRCH}] Il processo selezionato non esiste.
-    \item[\macro{EPERM}] Il processo selezionato non fa parte della stessa
-    sessione del processo corrente.
+    \item[\macro{EPERM}] In alcune implementazioni viene restituito quando il
+      processo selezionato non fa parte della stessa sessione del processo
+      corrente.
     \end{errlist}
   }
 \end{prototype}
@@ -152,17 +159,20 @@ prototipo 
 Entrambi gli identificatori vengono inizializzati alla creazione di ciascun
 processo con lo stesso valore che hanno nel processo padre, per cui un
 processo appena creato appartiene sempre allo stesso raggruppamento e alla
-stessa sessione del padre.
+stessa sessione del padre. Vedremo poi come sia possibile creare più
+\textit{process group} all'interno della stessa sessione, e spostare i
+processi dall'uno all'altro, ma sempre all'interno di una stessa sessione.
 
 Ciascun gruppo di processi ha sempre un processo principale, il cosiddetto
-\textit{process leader}, che è identificato dall'avere un \acr{pgid} uguale al
-suo \acr{pid}, in genere questo è il primo processo del gruppo, che si
-incarica di lanciare tutti gli altri. Un nuovo gruppo si crea con la funzione
-\func{setpgrp},\footnote{questa è la definizione di POSIX.1, BSD definisce una
-  funzione con lo stesso nome, che però è identica a \func{setpgid}; nelle
-  \acr{glibc} viene sempre usata sempre questa definizione, a meno di non
-  richiedere esplicitamente la compatibilità all'indietro con BSD, definendo
-  la macro \macro{\_BSD\_SOURCE}.} il cui prototipo è:
+\textit{process group leader}, che è identificato dall'avere un \acr{pgid}
+uguale al suo \acr{pid}, in genere questo è il primo processo del gruppo, che
+si incarica di lanciare tutti gli altri. Un nuovo gruppo si crea con la
+funzione \func{setpgrp},\footnote{questa è la definizione di POSIX.1, BSD
+  definisce una funzione con lo stesso nome, che però è identica a
+  \func{setpgid}; nelle \acr{glibc} viene sempre usata sempre questa
+  definizione, a meno di non richiedere esplicitamente la compatibilità
+  all'indietro con BSD, definendo la macro \macro{\_BSD\_SOURCE}.} il cui
+prototipo è:
 \begin{prototype}{unistd.h}{int setpgrp(void)}
   Modifica il \acr{pgid} al valore del \acr{pid} del processo corrente.
   
@@ -182,48 +192,124 @@ da un gruppo ad un altro con la funzione \func{setpgid}, il cui prototipo 
   -1 in caso di errore, nel qual caso \var{errno} assumerà i valori:
     \begin{errlist}
     \item[\macro{ESRCH}] Il processo selezionato non esiste.
-    \item[\macro{EPERM}] Il processo selezionato non fa parte della stessa
-    sessione del processo corrente.
+    \item[\macro{EPERM}] Il cambiamento non è consentito.
+    \item[\macro{EACCESS}] Il processo ha già eseguito una \func{exec}.
+    \item[\macro{EINVAL}] Il valore di \param{pgid} è negativo.
     \end{errlist}
  }
 \end{prototype}
 
+La funzione permette di cambiare il \acr{pgid} del processo \param{pid}, ma il
+cambiamento può essere effettuato solo se \param{pgid} indica un
+\textit{process group} che è nella stessa sessione del processo chiamante.
+Inoltre la funzione può essere usata soltanto sul processo corrente o su uno
+dei suoi figli, ed in quest'ultimo caso ha successo soltanto se questo non ha
+ancora eseguito una \func{exec}. Specificando un valore nullo per \param{pid}
+si indica il processo corrente, mentre specificando un valore nullo per
+\param{pgid} si imposta il \textit{process group} al valore del \acr{pid} del
+processo selezionato; pertanto \func{setpgrp} è equivalente a \code{setpgid(0,
+  0)}.
+
+Di norma questa funzione viene usata dalla shell quando si usano delle
+pipeline, per mettere nello stesso process group tutti i programmi lanciati su
+ogni linea di comando; essa viene chiamata dopo una \func{fork} sia dal
+processo padre, per impostare il valore nel figlio, che da quest'ultimo, per
+sé stesso, in modo che il cambiamento di \textit{process group} sia immediato
+per entrambi; una delle due chiamate sarà ridondante, ma non potendo
+determinare quale dei due processi viene eseguito per primo, occorre eseguirle
+comunque entrambe per evitare di esporsi ad una race condition. 
+
+Si noti come nessuna delle funzioni esaminate finora permetta di spostare un
+processo da una sessione ad un altra; infatti l'unico modo di far cambiare
+sessione ad un processo è quello di crearne una nuova con l'uso di
+\func{setsid}; il suo prototipo è:
+\begin{prototype}{unistd.h}{pid\_t setsid(void)}
+  Crea una nuova sessione sul processo corrente settandone \acr{sid} e
+  \acr{pgid}.
+  
+  \bodydesc{La funzione ritorna il valore del nuovo \acr{sid}, e -1 in caso di
+    errore, il solo errore possibile è \macro{EPERM}, che si ha quando il
+    \acr{pgid} e \acr{pid} del processo concidono.}
+\end{prototype}
 
-
-
-
-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}.
-
-
+La funzione imposta il \acr{pgid} ed il \acr{sid} del processo corrente al
+valore del suo \acr{pid}, creando così una nuova sessione ed un nuovo
+\textit{process group} di cui esso diventa leader (come per i \textit{process
+  group} un processo si dice leader di sessione\footnote{in Linux la proprietà
+  è mantenuta in maniera indipendente con un apposito campo \var{leader} in
+  \var{task\_struct}.} se il suo \acr{sid} è uguale al suo \acr{pid}).
+Infine la funzione distacca il processo da ogni terminale di controllo
+(torneremo sull'argomento in \secref{sec:sess_ctrl_term}) cui fosse in
+precedenza associato.
+
+La funzione ha successo soltanto se il processo non è già leader di un
+\textit{process group}, per cui per usarla di norma si esegue una \func{fork}
+e si esce, per poi chiamare \func{setsid} nel processo figlio, in modo che,
+avendo questo lo stesso \acr{pgid} del padre ma un \acr{pid} diverso, non ci
+siano possibilità di errore.\footnote{potrebbe sorgere il dubbio che, per il
+  riutilizzo dei valori dei \acr{pid} fatto nella creazione dei nuovi processi
+  (vedi \secref{sec:proc_pid}), il figlio venga ad assumere un valore
+  corrispondente ad un process group esistente; questo viene evitato dal
+  kernel che considera come disponibili per un nuovo \acr{pid} solo valori che
+  non corrispondono ad altri \acr{pid}, \acr{pgid} o \acr{sid} in uso nel
+  sistema.} Questa funzione viene usata di solito nel processo di login (per i
+dettagli vedi \secref{sec:sess_login}) per raggruppare in una sessione tutti i
+comandi eseguiti da un utente dalla sua shell.
 
 
 
 \subsection{Il terminale di controllo}
 \label{sec:sess_ctrl_term}
 
-Come accennato in \secref{sec:sess_job_control_overview} ad ogni sessione di
-lavoro è associato un terminale di controllo.
-
-
-
-\subsection{La procedura di login}
+Come accennato in \secref{sec:sess_job_control_overview}, nel sistema del
+\textit{job control} i processi all'interno di una sessione fanno riferimento
+ad un terminale di controllo (ad esempio quello su cui si è effettuato il
+login), sul quale effettuano le operazioni di lettura e
+scrittura,\footnote{nel caso di login grafico la cosa può essere più
+  complessa, e di norma l'I/O è effettuato tramite il server X, ma ad esempio
+  per i programmi, anche grafici, lanciati da un qualunque emulatore di
+  terminale, sarà quest'ultimo a fare da terminale (virtuale) di controllo.} e
+dal quale ricevono gli eventuali segnali da tastiera.
+
+A tale scopo lo standard POSIX.1 prevede che ad ogni sessione possa essere
+associato un terminale di controllo (e non più di uno); in Linux questo viene
+realizzato mantenendo fra gli attributi di ciascun processo anche il terminale
+di controllo. \footnote{Lo standard POSIX.1 non specifica nulla riguardo
+  l'implementazione; in Linux anch'esso viene mantenuto nella solita struttura
+  \var{task\_struct}, nel campo \var{tty}.}
+In generale ogni processo eredita dal padre, insieme al \acr{pgid} e al
+\acr{sid} anche il terminale di controllo. In questo modo tutti processi
+originati dallo stesso leader di sessione mantengono lo stesso terminale di
+controllo.
+
+Alla creazione di una nuova sessione con \func{setsid} ogni associazione con
+il precedente terminale di controllo viene cancellata, ed il processo che è
+divenuto un nuovo leader di sessione dovrà riottenere (qualora sia necessario,
+cosa che come vedremo in \secref{sec:sess_daemon} non è sempre vera), un
+terminale di controllo. In generale questo viene fatto automaticamente dal
+sistema quando il leader di sessione apre il suo primo terminale\footnote{a
+  meno di non avere richiesto esplicitamente che questo non diventi un
+  terminale di controllo con il flag \macro{O\_NOCTTY} (vedi
+  \secref{sec:file_open}). In questo Linux segue la semantica di SVr4; BSD
+  invece richiede che il terminale venga allocato esplicitamente con una
+  \func{ioctl} con il comando \macro{TIOCSCTTY}.} che diventa automaticamente
+il terminale di controllo.
+
+
+
+\subsection{Dal login alla shell}
 \label{sec:sess_login}
 
 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
+modalità con cui un utente accede al sistema per dare comandi, 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.
+file standard (vedi \secref{sec:file_std_descr}) per l'I/O, tratteremo solo il
+caso classico del 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},
@@ -243,7 +329,7 @@ Tralasciando la descrizione del sistema dei run level, (per il quale si
 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}.
+di massima della procedura è riportato in \figref{fig:sess_term_login}.
 
 \begin{figure}[htb]
   \centering
@@ -254,39 +340,41 @@ 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*}.\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
-radice della catena che porta ad una shell per i comandi perciò c'è sempre
-\cmd{init} che esegue prima una \func{fork} e poi una \func{exec} per lanciare
-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 nel file di configurazione del programma,
+  vitruali associati alle connessioni di rete con \cmd{telnet} o \cmd{ssh}.}
+
+Per controllare un terminale si usa di solito il programma \cmd{getty} (od una
+delle sue varianti), che permette di mettersi in ascolto su uno di questi
+dispositivi. Alla radice della catena che porta ad una shell per i comandi
+perciò c'è sempre \cmd{init} che esegue prima una \func{fork} e poi una
+\func{exec} per lanciare 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 nel file di configurazione del programma,
 \file{/etc/inittab}.
 
 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, e di effettuare, qualora servano, ulteriori
-settaggi,\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
+amministratore e con un ambiente vuoto; \cmd{getty} si cura di chiamare
+\func{setsid} per creare una nuova sessione ed un nuovo process group, e di
+aprire il terminale (che così diventa il terminale di controllo della
+sessione) in lettura sullo standard input ed in scrittura sullo standard
+output e sullo standard error; inoltre effettuarà, qualora servano, ulteriori
+settaggi.\footnote{ad esempio, come qualcuno si sarà accorto scrivendo un nome
   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
+  supportavano le minuscole).} Alla fine 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
+stringa con il nome, 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.
 
@@ -302,17 +390,17 @@ la password non corrisponde\footnote{il confronto non viene effettuato con un
 numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a
 rilanciare un'altra istanza di \func{getty}.
 
-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
-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
-del processo, infatti, come spiegato in \secref{sec:proc_setuid}, avendo
-invocato tali funzioni con i privilegi di amministratore, tutti gli userid ed
-i groupid (reali, effettivi e salvati) saranno settati a quelli dell'utente.
+Se invece la password corrisponde \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 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 del processo, infatti, come
+spiegato in \secref{sec:proc_setuid}, avendo invocato tali funzioni con i
+privilegi di amministratore, tutti gli userid ed i groupid (reali, effettivi e
+salvati) saranno settati a quelli dell'utente.
 
 A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni
 iniziali, come la stampa di messaggi di benvenuto o il controllo della posta)
@@ -325,10 +413,21 @@ per ripetere da capo tutto il procedimento.
 
 
 
+\subsection{Prescrizioni per un programma \textit{daemon}}
+\label{sec:sess_daemon}
 
-Lo stato del sistema può essere verificato con il comando \cmd{ps -je f}
-
+Come sottolineato fin da \secref{sec:intro_base_concept}, in un sistema
+unix-like tutte le operazioni sono eseguite tramite processi, comprese quelle
+operazioni di sistema (come l'esecuzione di comandi periodici, o la consegna
+della posta, ed in generale tutti i programmi di servizio) che non hanno a che
+fare con la gestione diretta dei comandi dell'utente.
 
+Questi programmi, che devono essere eseguiti in modalità non interattiva senza
+nessun intervento dell'utente, sono normalmente chiamati \textsl{demoni}, (o
+\textit{daemons}), nome ispirato dagli omonimi spiritelli che svolgevano vari
+compiti, di cui parlava Socrate (che sosteneva di averne uno al suo
+servizio).\footnote{NdT. ricontrollare, i miei ricordi di filosofia sono
+  piuttosto datati.}