From: Simone Piccardi Date: Fri, 13 Sep 2002 10:33:41 +0000 (+0000) Subject: Risistemazione di sessioni e pgid X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=221191d7d22570a7adaf6f1089f87ab0a547d88a Risistemazione di sessioni e pgid --- diff --git a/intro.tex b/intro.tex index 5ea4f9a..fcf632d 100644 --- 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. diff --git a/session.tex b/session.tex index 13bc2c5..c5c1d24 100644 --- a/session.tex +++ b/session.tex @@ -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.}