X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=session.tex;h=58e4ddbe03ffbbdf08c4d31eb1128ef34e88c781;hp=b97024deb0ee38f8fc2d3d4ab07c2686d80806bf;hb=34f320bccbbb744f178061b94e3a7197c35edd28;hpb=5b2a6aa7395bed71cf47e8183cecd78c4b02fe5e diff --git a/session.tex b/session.tex index b97024d..58e4ddb 100644 --- a/session.tex +++ b/session.tex @@ -17,7 +17,7 @@ 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ò + 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. @@ -35,12 +35,12 @@ 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 +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_sessions}) tutti i processi eseguiti all'interno dello stesso -login. +\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, @@ -66,44 +66,99 @@ 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 +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 in lettura o -scrittura) - - - - - - - - - - - - -\subsection{I \textit{process group}} +\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 +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 +i processi del raggruppamento in \textit{foreground}. In particolare il primo +di essi, \macro{SIGTSTP}, interrompe l'esecuzione del comando, che può poi +essere mandato in \textit{background} con il comando \cmd{bg}. Il comando +\cmd{fg} consente invece di mettere in \textit{foreground} un comando +precedentemente lanciato in \textit{background}. + +Di norma la shell si cura anche di notificare all'utente (di solito prima +della stampa a video del prompt) lo stato dei vari processi, essa infatti usa +le caratteristiche della funzione \func{waitpid} (si riveda quanto detto in +\secref{sec:proc_wait}) per verificare quali gruppi di processi sono bloccati +e quali sono terminati. + + +\subsection{I \textit{process group} e le \textsl{sessioni}} \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 +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}. + +Un \textit{process group} è pertanto definito da tutti i processi che hanno lo +stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con +le funzioni \func{getpgid} e \func{getpgrp},\footnote{\func{getpgrp} è + definita nello standard POSIX.1, mentre \func{getpgid} è richiesta da SVr4.} +i cui prototipi sono: +\begin{functions} + \headdecl{unistd.h} + + \funcdecl{pid\_t getpgid(pid\_t pid)} + Legge il \acr{pgid} del processo \param{pid}. + + \funcdecl{pid\_t getpgrp(void)} + Legge il \acr{pgid} del processo corrente. + + \bodydesc{Le funzioni restituiscono il \acr{pgid} del processo, + \func{getpgrp} ha sempre successo, mentre \func{getpgid} restituisce -1 + ponendo \var{errno} a \macro{ESRCH} se il processo selezionato non esiste.} +\end{functions} + +La funzione \func{getpgid} permette di specificare il \acr{pid} del processo +di cui si vuole sapere il \acr{pgid}; un valore nullo per \param{pid} +restituisce il \acr{pgid} del processo corrente; \func{getpgrp} è di norma +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 è: +\begin{prototype}{unistd.h}{pid\_t getsid(pid\_t pid)} + Legge l'identificatore di sessione del processo \param{pid}. + + \bodydesc{La funzione restituisce l'identificatore (un numero positivo) in + caso di successo, e -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. + \end{errlist} + } +\end{prototype} + +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. + +Ciascun gruppo di processi ha sempre un processo principale, il +\textit{process leader}, che è quello che è identificato dall'avere il suo +\acr{pgid} uguale al \acr{pid}, per + +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 @@ -113,14 +168,13 @@ 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} +Come accennato in \secref{sec:sess_job_control_overview} ad ogni sessione di +lavoro è associato un terminale di controllo. + \subsection{La procedura di login}