From: Simone Piccardi Date: Sun, 8 Sep 2002 22:19:31 +0000 (+0000) Subject: Ricominciato coi process group X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=96e11f1878552c4c4f245448e9dc6d66e1658542;p=gapil.git Ricominciato coi process group --- diff --git a/gapil.tex b/gapil.tex index be7b703..c37cd34 100644 --- a/gapil.tex +++ b/gapil.tex @@ -114,9 +114,9 @@ \include{filestd} \include{system} \include{signal} +\include{session} \include{fileadv} \include{ipc} -\include{session} \include{network} \include{socket} \include{elemtcp} diff --git a/prochand.tex b/prochand.tex index a45c0d6..f3298c0 100644 --- a/prochand.tex +++ b/prochand.tex @@ -256,8 +256,8 @@ un processo e le varie relazioni fra processi utilizzate per definire una sessione. Oltre al \acr{pid} e al \acr{ppid}, (e a quelli che vedremo in -\secref{sec:sess_xxx}, relativi al controllo di sessione), ad ogni processo -vengono associati degli altri identificatori che vengono usati per il +\secref{sec:sess_proc_group}, relativi al controllo di sessione), ad ogni +processo vengono associati degli altri identificatori che vengono usati per il controllo di accesso. Questi servono per determinare se un processo può eseguire o meno le operazioni richieste, a seconda dei privilegi e dell'identità di chi lo ha posto in esecuzione; l'argomento è complesso e sarà @@ -607,7 +607,7 @@ comune dopo l'esecuzione di una \func{fork} \secref{sec:proc_access_id}). \item gli identificatori per il controllo di sessione: il \textit{process groupid} e il \textit{session id} ed il terminale di controllo (vedi - \secref{sec:sess_xxx} e \secref{sec:sess_xxx}). + \secref{sec:sess_proc_group}). \item la directory di lavoro e la directory radice (vedi \secref{sec:file_work_dir} e \secref{sec:file_chroot}). \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}). @@ -871,9 +871,10 @@ cercato sia ancora attivo. Per questo motivo lo standard POSIX.1 ha introdotto la funzione \func{waitpid} che effettua lo stesso servizio, ma dispone di una serie di funzionalità più -ampie, legate anche al controllo di sessione. Dato che è possibile ottenere -lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre -questa funzione, il cui prototipo è: +ampie, legate anche al controllo di sessione (si veda +\ref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso +comportamento di \func{wait} si consiglia di utilizzare sempre questa +funzione, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/wait.h} @@ -896,7 +897,7 @@ sempre fino a che un processo figlio non termina, mentre \func{waitpid} ha la possibilità si specificare un'opzione \macro{WNOHANG} che ne previene il blocco; inoltre \func{waitpid} può specificare quale processo attendere sulla base del valore fornito dall'argomento \param{pid}, secondo lo -specchietto riportato in \ntab: +specchietto riportato in \tabref{tab:proc_waidpid_pid}: \begin{table}[!htb] \centering \footnotesize @@ -905,7 +906,8 @@ specchietto riportato in \ntab: \textbf{Valore} & \textbf{Macro} &\textbf{Significato}\\ \hline \hline - $<-1$& -- & attende per un figlio il cui \textit{process group} è uguale al + $<-1$& -- & attende per un figlio il cui \textit{process group} (vedi + \ref{sec:sess_proc_group}) è uguale al valore assoluto di \var{pid}. \\ $-1$ & \macro{WAIT\_ANY} & attende per un figlio qualsiasi, usata in questa maniera è equivalente a \func{wait}.\\ @@ -924,11 +926,11 @@ Il comportamento di \func{waitpid} pu delle opportune opzioni tramite l'argomento \param{option}. I valori possibili sono il già citato \macro{WNOHANG}, che previene il blocco della funzione quando il processo figlio non è terminato, e \macro{WUNTRACED} (usata per il -controllo di sessione, trattato in \capref{cha:session}) che fa ritornare la -funzione anche per i processi figli che sono bloccati ed il cui stato non è -stato ancora riportato al padre. Il valore dell'opzione deve essere -specificato come maschera binaria ottenuta con l'OR delle suddette costanti -con zero. +controllo di sessione, trattato in \secref{sec:sess_job_control}) che fa +ritornare la funzione anche per i processi figli che sono bloccati ed il cui +stato non è stato ancora riportato al padre. Il valore dell'opzione deve +essere specificato come maschera binaria ottenuta con l'OR delle suddette +costanti con zero. La terminazione di un processo figlio è chiaramente un evento asincrono rispetto all'esecuzione di un programma e può avvenire in un qualunque @@ -1202,8 +1204,8 @@ la lista completa (\acr{ppid}). \item l'\textsl{userid reale}, il \textit{groupid reale} ed i \textsl{groupid supplementari} (vedi \secref{sec:proc_access_id}). -\item il \textit{session id} ed il \textit{process groupid} (vedi - \secref{sec:sess_xxx}). +\item il \textit{session id} (\acr{sid}) ed il \textit{process groupid} + (\acr{pgid}), vedi \secref{sec:sess_proc_group}. \item il terminale di controllo (vedi \secref{sec:sess_xxx}). \item il tempo restante ad un allarme (vedi \secref{sec:sig_alarm_abort}). \item la directory radice e la directory di lavoro corrente (vedi diff --git a/session.tex b/session.tex index b97024d..97c9a43 100644 --- a/session.tex +++ b/session.tex @@ -39,8 +39,8 @@ In un sistema che supporta il \textit{job cotrol} 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 comportamenento +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} restitusce -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} +restiruisce 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} diff --git a/signal.tex b/signal.tex index ea55790..3fada26 100644 --- a/signal.tex +++ b/signal.tex @@ -950,7 +950,7 @@ la funzione \func{kill}; il cui prototipo \funcdecl{int kill(pid\_t pid, int sig)} Invia il segnale \param{sig} al processo specificato con \param{pid}. - \bodydesc{ La funzione restituisce 0 in caso di successo e -1 in caso di + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore nel qual caso \var{errno} può assumere i valori: \begin{errlist} \item[\macro{EINVAL}] Il segnale specificato non esiste.