Risistemazione di sessioni e pgid
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 13 Sep 2002 10:33:41 +0000 (10:33 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 13 Sep 2002 10:33:41 +0000 (10:33 +0000)
intro.tex
session.tex

index 5ea4f9a8a84cf3dc57693c99342fd87d2cc1b9df..fcf632d2028a315f8daa0075a57315d1931b520c 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -54,11 +54,11 @@ porte di input/output).
 
 Una parte del kernel, lo \textit{scheduler}, si occupa di stabilire, ad
 intervalli fissi e sulla base di un opportuno calcolo delle priorità, quale
-``processo'' deve essere posto in esecuzione (il cosiddetto
-\textit{preemptive scheduling}). Questo verrà comunque eseguito in modalità
-protetta; quando necessario il processo potrà accedere alle risorse hardware
-soltanto attraverso delle opportune chiamate al sistema che restituiranno il
-controllo al kernel.
+``processo'' deve essere posto in esecuzione (il cosiddetto \textit{preemptive
+  scheduling}\index{preemptive scheduling}). Questo verrà comunque eseguito in
+modalità protetta; quando necessario il processo potrà accedere alle risorse
+hardware soltanto attraverso delle opportune chiamate al sistema che
+restituiranno il controllo al kernel.
 
 La memoria viene sempre gestita dal kernel attraverso il meccanismo della
 \textsl{memoria virtuale}\index{memoria virtuale}, che consente di assegnare a
@@ -133,7 +133,7 @@ Per questo motivo quando ci si riferisce al sistema nella sua interezza 
 corretto parlare di un sistema GNU/Linux: da solo il kernel è assolutamente
 inutile; quello che costruisce un sistema operativo utilizzabile è la presenza
 di tutta una serie di librerie e programmi di utilità (che di norma sono
-quelli realizzati dal progetto GNU della Free Softwae Foundation) che
+quelli realizzati dal progetto GNU della Free Software Foundation) che
 permettono di eseguire le normali operazioni che ci si aspetta da un sistema
 operativo.
 
index 13bc2c5efdb1a620ca87dfca80420e65e38a1664..c5c1d2430c08d142ebccdb2969c1d76afd4ae477 100644 (file)
@@ -42,24 +42,23 @@ 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
+Siccome la shell è collegata ad un solo terminale (che viene usualmente
+chiamato \textsl{terminale di controllo}) 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} (si fa aggiungendo una \cmd{\&} alla fine
-del comando), nel qual caso essi saranno eseguiti senza essere collegati al
+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 +66,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
@@ -136,8 +135,9 @@ funzione \func{getsid}, che per
   stata introdotta in Linux a partire dalla versione 1.3.44, il supporto nelle
   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
-  \textit{session id}.} è accessibile solo definendo \macro{\_XOPEN\_SOURCE} e
-\macro{\_XOPEN\_SOURCE\_EXTENDED}; il suo prototipo è:
+  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}.
   
@@ -232,16 +232,17 @@ 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 se il suo \acr{sid} è uguale
-al suo \acr{pid}).  Infine il processo viene distaccato dal terminale di
+al suo \acr{pid}).  Inoltre il processo non avrà più un terminale di
 controllo.
 
 La funzione ha successo soltanto se il processo non è già leader per un
-\textit{process group}, per cui 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.  Questa funzione viene usata di solito dal processo di
-login quando si lancia una nuova shell per un utente.
-
+\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.  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.
 
 
 
@@ -249,8 +250,12 @@ login quando si lancia una nuova shell per un utente.
 \label{sec:sess_ctrl_term}
 
 Come accennato in \secref{sec:sess_job_control_overview} ad ogni sessione di
-lavoro è associato un terminale di controllo.  
+lavoro di norma viene associato un terminale di controllo. Alla creazione
+della sessione con \func{setsid} infatti ogni associazione con un precedente
+terminale di controllo viene spezzata, ed il processo dovrà riottenere (se
+necessario, vedi \secref{sec:sess_daemon}), un terminale di controllo.
 
+Le modalità con cui 
 
 
 \subsection{Dal login alla shell}
@@ -285,7 +290,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
@@ -296,41 +301,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 chiamare
 \func{setsid} per creare una nuova sessione ed un nuovo process group, e 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 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.
+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).} 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.
 
@@ -346,17 +351,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)
@@ -367,7 +372,23 @@ che il processo genitore resta sempre \cmd{init} quest'ultimo provveder
 ricevendo un \macro{SIGCHLD} all'uscita della shell, a rilanciare \cmd{getty}
 per ripetere da capo tutto il procedimento.
 
-Una volta arrivati alla 
+
+
+\subsection{Prescrizioni per un programma \textit{daemon}}
+\label{sec:sess_daemon}
+
+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.}