Nuova serie di correzioni da Fabio Rossi
[gapil.git] / prochand.tex
index a663b9f489550b48cafaf4839c7cfcc83ea84d58..6fa1b86e6ce36e344cfa2a900900de26ff170c07 100644 (file)
@@ -116,7 +116,7 @@ Dato che tutti i processi attivi nel sistema sono comunque generati da
 \cmd{init} o da uno dei suoi figli\footnote{in realtà questo non è del tutto
   vero, in Linux ci sono alcuni processi speciali che pur comparendo come
   figli di \cmd{init}, o con \acr{pid} successivi, sono in realtà generati
-  direttamente dal kernel, (come \cmd{keventd}, \cmd{kswapd}, etc.).} si
+  direttamente dal kernel, (come \cmd{keventd}, \cmd{kswapd}, ecc.).} si
 possono classificare i processi con la relazione padre/figlio in
 un'organizzazione gerarchica ad albero, in maniera analoga a come i file sono
 organizzati in un albero di directory (si veda
@@ -400,8 +400,8 @@ degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione
 descrizione delle opzioni); il codice completo, compresa la parte che gestisce
 le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c},
 distribuito insieme agli altri sorgenti degli esempi su
-\href{http://gapil.firenze.linux.it/gapil_source.tgz}
-{\texttt{http://gapil.firenze.linux.it/gapil\_source.tgz}}.
+\href{http://gapil.truelite.it/gapil_source.tgz}
+{\textsf{http://gapil.truelite.it/gapil\_source.tgz}}.
 
 Decifrato il numero di figli da creare, il ciclo principale del programma
 (\texttt{\small 24--40}) esegue in successione la creazione dei processi figli
@@ -587,34 +587,34 @@ comune dopo l'esecuzione di una \func{fork} 
 \begin{itemize*}
 \item i file aperti e gli eventuali flag di
   \textit{close-on-exec}\index{\textit{close-on-exec}} impostati (vedi
-  sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}).
+  sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl});
 \item gli identificatori per il controllo di accesso: l'\textsl{user-ID
     reale}, il \textsl{group-ID reale}, l'\textsl{user-ID effettivo}, il
   \textsl{group-ID effettivo} ed i \textit{group-ID supplementari} (vedi
-  sez.~\ref{sec:proc_access_id}).
+  sez.~\ref{sec:proc_access_id});
 \item gli identificatori per il controllo di sessione: il \textit{process
     group-ID} e il \textit{session id} ed il terminale di controllo (vedi
-  sez.~\ref{sec:sess_proc_group}).
+  sez.~\ref{sec:sess_proc_group});
 \item la directory di lavoro e la directory radice (vedi
-  sez.~\ref{sec:file_work_dir} e sez.~\ref{sec:file_chroot}).
-\item la maschera dei permessi di creazione (vedi sez.~\ref{sec:file_umask}).
+  sez.~\ref{sec:file_work_dir} e sez.~\ref{sec:file_chroot});
+\item la maschera dei permessi di creazione (vedi sez.~\ref{sec:file_umask});
 \item la maschera dei segnali bloccati (vedi sez.~\ref{sec:sig_sigmask}) e le
-  azioni installate (vedi sez.~\ref{sec:sig_gen_beha}).
+  azioni installate (vedi sez.~\ref{sec:sig_gen_beha});
 \item i segmenti di memoria condivisa agganciati al processo (vedi
-  sez.~\ref{sec:ipc_sysv_shm}).
-\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}).
+  sez.~\ref{sec:ipc_sysv_shm});
+\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit});
 \item le variabili di ambiente (vedi sez.~\ref{sec:proc_environ}).
 \end{itemize*}
-le differenze fra padre e figlio dopo la \func{fork} invece sono:
+Le differenze fra padre e figlio dopo la \func{fork} invece sono:
 \begin{itemize*}
-\item il valore di ritorno di \func{fork}.
-\item il \acr{pid} (\textit{process id})
+\item il valore di ritorno di \func{fork};
+\item il \acr{pid} (\textit{process id});
 \item il \acr{ppid} (\textit{parent process id}), quello del figlio viene
-  impostato al \acr{pid} del padre.
+  impostato al \acr{pid} del padre;
 \item i valori dei tempi di esecuzione della struttura \struct{tms} (vedi
-  sez.~\ref{sec:sys_cpu_times}) che nel figlio sono posti a zero.
+  sez.~\ref{sec:sys_cpu_times}) che nel figlio sono posti a zero;
 \item i \textit{lock} sui file (vedi sez.~\ref{sec:file_locking}), che non
-  vengono ereditati dal figlio.
+  vengono ereditati dal figlio;
 \item gli allarmi ed i segnali pendenti (vedi sez.~\ref{sec:sig_gen_beha}), che
   per il figlio vengono cancellati.
 \end{itemize*}
@@ -640,11 +640,11 @@ venne introdotta in BSD per migliorare le prestazioni.
 Dato che Linux supporta il \textit{copy on
   write}\index{\textit{copy~on~write}} la perdita di prestazioni è
 assolutamente trascurabile, e l'uso di questa funzione (che resta un caso
-speciale della system call \func{\_\_clone}), è deprecato; per questo
-eviteremo di trattarla ulteriormente.
+speciale della system call \func{\_\_clone}) è deprecato; per questo eviteremo
+di trattarla ulteriormente.
 
 
-\subsection{La conclusione di un processo.}
+\subsection{La conclusione di un processo}
 \label{sec:proc_termination}
 
 In sez.~\ref{sec:proc_conclusion} abbiamo già affrontato le modalità con cui
@@ -671,16 +671,16 @@ comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
 memoria che stava usando, e così via; l'elenco completo delle operazioni
 eseguite alla chiusura di un processo è il seguente:
 \begin{itemize*}
-\item tutti i file descriptor sono chiusi.
-\item viene memorizzato lo stato di terminazione del processo.
+\item tutti i file descriptor sono chiusi;
+\item viene memorizzato lo stato di terminazione del processo;
 \item ad ogni processo figlio viene assegnato un nuovo padre (in genere
-  \cmd{init}).
+  \cmd{init});
 \item viene inviato il segnale \const{SIGCHLD} al processo padre (vedi
-  sez.~\ref{sec:sig_sigchld}).
+  sez.~\ref{sec:sig_sigchld});
 \item se il processo è un leader di sessione ed il suo terminale di controllo
   è quello della sessione viene mandato un segnale di \const{SIGHUP} a tutti i
   processi del gruppo di foreground e il terminale di controllo viene
-  disconnesso (vedi sez.~\ref{sec:sess_ctrl_term}).
+  disconnesso (vedi sez.~\ref{sec:sess_ctrl_term});
 \item se la conclusione di un processo rende orfano un \textit{process
     group} ciascun membro del gruppo viene bloccato, e poi gli vengono
   inviati in successione i segnali \const{SIGHUP} e \const{SIGCONT}
@@ -959,26 +959,32 @@ generato dalla terminazione di un figlio, avremo la certezza che la chiamata a
     \hline
     \hline
     \macro{WIFEXITED(s)}   & Condizione vera (valore non nullo) per un processo
-    figlio che sia terminato normalmente. \\
+                             figlio che sia terminato normalmente. \\
     \macro{WEXITSTATUS(s)} & Restituisce gli otto bit meno significativi dello
-    stato di uscita del processo (passato attraverso \func{\_exit}, \func{exit}
-    o come valore di ritorno di \func{main}). Può essere valutata solo se
-    \val{WIFEXITED} ha restituito un valore non nullo.\\
+                             stato di uscita del processo (passato attraverso
+                             \func{\_exit}, \func{exit} o come valore di
+                             ritorno di \func{main}). Può essere valutata solo
+                             se \val{WIFEXITED} ha restituito un valore non
+                             nullo.\\ 
     \macro{WIFSIGNALED(s)} & Vera se il processo figlio è terminato
-    in maniera anomala a causa di un segnale che non è stato catturato (vedi
-    sez.~\ref{sec:sig_notification}).\\
-    \macro{WTERMSIG(s)}    & restituisce il numero del segnale che ha causato
-    la terminazione anomala del processo.  Può essere valutata solo se
-    \val{WIFSIGNALED} ha restituito un valore non nullo.\\
+                             in maniera anomala a causa di un segnale che non
+                             è stato catturato (vedi
+                             sez.~\ref{sec:sig_notification}).\\ 
+    \macro{WTERMSIG(s)}    & Restituisce il numero del segnale che ha causato
+                             la terminazione anomala del processo.  Può essere
+                             valutata solo se \val{WIFSIGNALED} ha restituito
+                             un valore non nullo.\\ 
     \macro{WCOREDUMP(s)}   & Vera se il processo terminato ha generato un
-    file si \textit{core dump}. Può essere valutata solo se
-    \val{WIFSIGNALED} ha restituito un valore non nullo.\footnotemark \\
+                             file di \textit{core dump}. Può essere valutata
+                             solo se \val{WIFSIGNALED} ha restituito un valore
+                             non nullo.\footnotemark \\ 
     \macro{WIFSTOPPED(s)}  & Vera se il processo che ha causato il ritorno di
-    \func{waitpid} è bloccato. L'uso è possibile solo avendo specificato
-    l'opzione \const{WUNTRACED}. \\
-    \macro{WSTOPSIG(s)}    & restituisce il numero del segnale che ha bloccato
-    il processo, Può essere valutata solo se \val{WIFSTOPPED} ha
-    restituito un valore non nullo. \\
+                             \func{waitpid} è bloccato. L'uso è possibile solo
+                             avendo specificato l'opzione \const{WUNTRACED}. \\
+    \macro{WSTOPSIG(s)}    & Restituisce il numero del segnale che ha bloccato
+                             il processo. Può essere valutata solo se
+                             \val{WIFSTOPPED} ha restituito un valore non
+                             nullo. \\ 
     \hline
   \end{tabular}
   \caption{Descrizione delle varie macro di preprocessore utilizzabili per 
@@ -1026,8 +1032,8 @@ sono:
   \headdecl{sys/times.h} \headdecl{sys/types.h} \headdecl{sys/wait.h}
   \headdecl{sys/resource.h} 
   
-  \funcdecl{pid\_t wait4(pid\_t pid, int * status, int options, struct rusage
-    * rusage)}   
+  \funcdecl{pid\_t wait4(pid\_t pid, int *status, int options, struct rusage
+    *rusage)}   
   È identica a \func{waitpid} sia per comportamento che per i valori degli
   argomenti, ma restituisce in \param{rusage} un sommario delle risorse usate
   dal processo.
@@ -1075,14 +1081,14 @@ famiglia di funzioni) che possono essere usate per questo compito, in realt
     riconosciuto come tale, o compilato per un'altra architettura.
   \item[\errcode{ENOENT}] il file o una delle librerie dinamiche o l'interprete
     necessari per eseguirlo non esistono.
-  \item[\errcode{ETXTBSY}] L'eseguibile è aperto in scrittura da uno o più
+  \item[\errcode{ETXTBSY}] l'eseguibile è aperto in scrittura da uno o più
     processi. 
-  \item[\errcode{EINVAL}] L'eseguibile ELF ha più di un segmento
+  \item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento
     \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un
     interprete.
-  \item[\errcode{ELIBBAD}] Un interprete ELF non è in un formato
+  \item[\errcode{ELIBBAD}] un interprete ELF non è in un formato
     riconoscibile.
-  \item[\errcode{E2BIG}] La lista degli argomenti è troppo grande.
+  \item[\errcode{E2BIG}] la lista degli argomenti è troppo grande.
   \end{errlist}
   ed inoltre anche \errval{EFAULT}, \errval{ENOMEM}, \errval{EIO},
   \errval{ENAMETOOLONG}, \errval{ELOOP}, \errval{ENOTDIR}, \errval{ENFILE},
@@ -1097,8 +1103,8 @@ argomenti e dell'ambiente possono essere acceduti dal nuovo programma
 quando la sua funzione \func{main} è dichiarata nella forma
 \code{main(int argc, char *argv[], char *envp[])}.
 
-Le altre funzioni della famiglia servono per fornire all'utente una serie
-possibile di diverse interfacce per la creazione di un nuovo processo. I loro
+Le altre funzioni della famiglia servono per fornire all'utente una serie di
+possibili diverse interfacce per la creazione di un nuovo processo. I loro
 prototipi sono:
 \begin{functions}
 \headdecl{unistd.h}
@@ -1153,8 +1159,8 @@ per indicare il nome del file che contiene il programma che verr
     argomenti a lista    &$\bullet$&$\bullet$&$\bullet$&&& \\
     argomenti a vettore  &&&&$\bullet$&$\bullet$&$\bullet$\\
     \hline
-    filename completo    &&$\bullet$&&&$\bullet$& \\ 
-    ricerca su \var{PATH}&$\bullet$&&$\bullet$&$\bullet$&&$\bullet$ \\
+    filename completo     &$\bullet$&&$\bullet$&$\bullet$&&$\bullet$\\ 
+    ricerca su \var{PATH} &&$\bullet$&&&$\bullet$& \\
     \hline
     ambiente a vettore   &&&$\bullet$&&&$\bullet$ \\
     uso di \var{environ} &$\bullet$&$\bullet$&&$\bullet$&$\bullet$& \\
@@ -1203,21 +1209,21 @@ Oltre a mantenere lo stesso \acr{pid}, il nuovo programma fatto partire da
 la lista completa è la seguente:
 \begin{itemize*}
 \item il \textit{process id} (\acr{pid}) ed il \textit{parent process id}
-  (\acr{ppid}).
+  (\acr{ppid});
 \item l'\textsl{user-ID reale}, il \textit{group-ID reale} ed i
-  \textsl{group-ID supplementari} (vedi sez.~\ref{sec:proc_access_id}).
+  \textsl{group-ID supplementari} (vedi sez.~\ref{sec:proc_access_id});
 \item il \textit{session id} (\acr{sid}) ed il \textit{process group-ID}
-  (\acr{pgid}), vedi sez.~\ref{sec:sess_proc_group}.
-\item il terminale di controllo (vedi sez.~\ref{sec:sess_ctrl_term}).
-\item il tempo restante ad un allarme (vedi sez.~\ref{sec:sig_alarm_abort}).
+  (\acr{pgid}), vedi sez.~\ref{sec:sess_proc_group};
+\item il terminale di controllo (vedi sez.~\ref{sec:sess_ctrl_term});
+\item il tempo restante ad un allarme (vedi sez.~\ref{sec:sig_alarm_abort});
 \item la directory radice e la directory di lavoro corrente (vedi
-  sez.~\ref{sec:file_work_dir}).
+  sez.~\ref{sec:file_work_dir});
 \item la maschera di creazione dei file (\var{umask}, vedi
   sez.~\ref{sec:file_umask}) ed i \textit{lock} sui file (vedi
-  sez.~\ref{sec:file_locking}).
+  sez.~\ref{sec:file_locking});
 \item i segnali sospesi (\textit{pending}) e la maschera dei segnali (si veda
-  sez.~\ref{sec:sig_sigmask}).
-\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}).
+  sez.~\ref{sec:sig_sigmask});
+\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit});
 \item i valori delle variabili \var{tms\_utime}, \var{tms\_stime},
   \var{tms\_cutime}, \var{tms\_ustime} (vedi sez.~\ref{sec:sys_cpu_times}).
 \end{itemize*}
@@ -1254,17 +1260,17 @@ bit impostato, in questo caso l'\textsl{user-ID effettivo} ed il
 gruppo cui il file appartiene (per i dettagli vedi sez.~\ref{sec:proc_perms}).
 
 Se il file da eseguire è in formato \emph{a.out} e necessita di librerie
-condivise, viene lanciato il \textit{linker} dinamico \cmd{ld.so} prima del
-programma per caricare le librerie necessarie ed effettuare il link
+condivise, viene lanciato il \textit{linker} dinamico \cmd{/lib/ld.so} prima
+del programma per caricare le librerie necessarie ed effettuare il link
 dell'eseguibile. Se il programma è in formato ELF per caricare le librerie
 dinamiche viene usato l'interprete indicato nel segmento \const{PT\_INTERP},
 in genere questo è \file{/lib/ld-linux.so.1} per programmi linkati con le
 \acr{libc5}, e \file{/lib/ld-linux.so.2} per programmi linkati con le
-\acr{glibc}. Infine nel caso il file sia uno script esso deve iniziare con
-una linea nella forma \cmd{\#!/path/to/interpreter} dove l'interprete indicato
-deve esse un programma valido (binario, non un altro script) che verrà
-chiamato come se si fosse eseguito il comando \cmd{interpreter [argomenti]
-  filename}.
+\acr{glibc}. Infine nel caso il file sia uno script esso deve iniziare con una
+linea nella forma \cmd{\#!/path/to/interpreter [argomenti]} dove l'interprete
+indicato deve essere un programma valido (binario, non un altro script) che
+verrà chiamato come se si fosse eseguito il comando \cmd{interpreter
+  [argomenti] filename}.
 
 Con la famiglia delle \func{exec} si chiude il novero delle funzioni su cui è
 basata la gestione dei processi in Unix: con \func{fork} si crea un nuovo
@@ -2258,8 +2264,9 @@ zero 
 
 Lo standard POSIX.1b prevede comunque che i due valori della massima e minima
 priorità statica possano essere ottenuti, per ciascuna delle politiche di
-scheduling realtime, tramite le due funzioni \funcd{sched\_get\_priority\_max}
-e \funcd{sched\_get\_priority\_min}, i cui prototipi sono:
+scheduling \textit{real-time}, tramite le due funzioni
+\funcd{sched\_get\_priority\_max} e \funcd{sched\_get\_priority\_min}, i cui
+prototipi sono:
 \begin{functions}
   \headdecl{sched.h}