\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
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
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}.
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.
\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}
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
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.
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)
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.}