Ricominciato coi process group
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 8 Sep 2002 22:19:31 +0000 (22:19 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 8 Sep 2002 22:19:31 +0000 (22:19 +0000)
gapil.tex
prochand.tex
session.tex
signal.tex

index be7b703..c37cd34 100644 (file)
--- a/gapil.tex
+++ b/gapil.tex
 \include{filestd}
 \include{system}
 \include{signal}
+\include{session}
 \include{fileadv}
 \include{ipc}
-\include{session}
 \include{network}
 \include{socket}
 \include{elemtcp}
index a45c0d6..f3298c0 100644 (file)
@@ -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
index b97024d..97c9a43 100644 (file)
@@ -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}
index ea55790..3fada26 100644 (file)
@@ -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.