Inizio revisione capitolo 6.
[gapil.git] / prochand.tex
index 985a6af558d0889ecd1f7f52948165fd2774a519..a87e848a7499201135d65446d1e73b5132894443 100644 (file)
@@ -193,7 +193,7 @@ esecuzione fino alla successiva invocazione.
 Come accennato nella sezione precedente ogni processo viene identificato dal
 sistema da un numero identificativo univoco, il \textit{process ID} o
 \ids{PID}. Questo è un tipo di dato standard, \type{pid\_t} che in genere è un
-intero con segno (nel caso di Linux e delle \acr{glibc} il tipo usato è
+intero con segno (nel caso di Linux e della \acr{glibc} il tipo usato è
 \ctyp{int}).
 
 Il \ids{PID} viene assegnato in forma progressiva ogni volta che un nuovo
@@ -217,8 +217,8 @@ avvio (\cmd{init}) ha sempre il \ids{PID} uguale a uno.
 Tutti i processi inoltre memorizzano anche il \ids{PID} del genitore da cui
 sono stati creati, questo viene chiamato in genere \ids{PPID} (da
 \itindex{Parent~Process~ID~(PPID)} \textit{Parent Process ID}).  Questi due
-identificativi possono essere ottenuti usando le due funzioni \funcd{getpid} e
-\funcd{getppid}, i cui prototipi sono:
+identificativi possono essere ottenuti usando le due funzioni di sistema
+\funcd{getpid} e \funcd{getppid}, i cui prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -266,11 +266,11 @@ sez.~\ref{sec:proc_perms}.
 \subsection{La funzione \func{fork} e le funzioni di creazione dei processi}
 \label{sec:proc_fork}
 
-La funzione \funcd{fork} è la funzione fondamentale della gestione dei
-processi: come si è detto tradizionalmente l'unico modo di creare un nuovo
+La funzione di sistema \funcd{fork} è la funzione fondamentale della gestione
+dei processi: come si è detto tradizionalmente l'unico modo di creare un nuovo
 processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la
   \textit{system call} usata da Linux per creare nuovi processi è \func{clone}
-  (vedi \ref{sec:process_clone}), anche perché a partire dalle \acr{glibc}
+  (vedi \ref{sec:process_clone}), anche perché a partire dalla \acr{glibc}
   2.3.3 non viene più usata la \textit{system call} originale, ma la stessa
   \func{fork} viene implementata tramite \func{clone}, cosa che consente una
   migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo
@@ -490,7 +490,7 @@ codice.
 Un secondo aspetto molto importante nella creazione dei processi figli è
 quello dell'interazione dei vari processi con i file. Ne parleremo qui anche
 se buona parte dei concetti relativi ai file verranno trattati più avanti
-(principalmente nel cap.~\ref{cha:file_unix_interface}). Per illustrare meglio
+(principalmente in sez.~\ref{sec:file_unix_interface}). Per illustrare meglio
 quello che avviene si può redirigere su un file l'output del programma di
 test, quello che otterremo è:
 \begin{Command}
@@ -524,8 +524,8 @@ Go to next child
 che come si vede è completamente diverso da quanto ottenevamo sul terminale.
 
 Il comportamento delle varie funzioni di interfaccia con i file è analizzato
-in gran dettaglio in cap.~\ref{cha:file_unix_interface} per l'interfaccia
-nativa Unix ed in cap.~\ref{cha:files_std_interface} per la standardizzazione
+in gran dettaglio in sez.~\ref{sec:file_unix_interface} per l'interfaccia
+nativa Unix ed in sez.~\ref{sec:files_std_interface} per la standardizzazione
 adottata nelle librerie del linguaggio C e valida per qualunque sistema
 operativo. Qui basta accennare che si sono usate le funzioni standard della
 libreria del C che prevedono l'output bufferizzato. Il punto è che questa
@@ -549,22 +549,23 @@ ultimo) troveremo anche l'output completo del padre.
 L'esempio ci mostra un altro aspetto fondamentale dell'interazione con i file,
 valido anche per l'esempio precedente, ma meno evidente: il fatto cioè che non
 solo processi diversi possono scrivere in contemporanea sullo stesso file
-(l'argomento della condivisione dei file è trattato in dettaglio in
-sez.~\ref{sec:file_sharing}), ma anche che, a differenza di quanto avviene per
-le variabili in memoria, la posizione corrente sul file è condivisa fra il
-padre e tutti i processi figli. 
+(l'argomento dell'accesso concorrente ai file è trattato in dettaglio in
+sez.~\ref{sec:file_shared_access}), ma anche che, a differenza di quanto
+avviene per le variabili in memoria, la posizione corrente sul file è
+condivisa fra il padre e tutti i processi figli.
 
 Quello che succede è che quando lo \textit{standard output}\footnote{si chiama
   così il file su cui un programma scrive i suoi dati in uscita, tratteremo
-  l'argomento in dettaglio in sez.~\ref{sec:file_std_descr}.} del padre viene
+  l'argomento in dettaglio in sez.~\ref{sec:file_fd}.} del padre viene
 rediretto come si è fatto nell'esempio, lo stesso avviene anche per tutti i
 figli. La funzione \func{fork} infatti ha la caratteristica di duplicare nei
 processi figli tutti i \textit{file descriptor} (vedi sez.~\ref{sec:file_fd})
 dei file aperti nel processo padre (allo stesso modo in cui lo fa la funzione
 \func{dup}, trattata in sez.~\ref{sec:file_dup}), il che comporta che padre e
 figli condividono le stesse voci della \itindex{file~table} \textit{file
-  table} (tratteremo in dettagli questi termini in
-sez.~\ref{sec:file_sharing}) fra cui c'è anche la posizione corrente nel file.
+  table} (tratteremo in dettaglio questi termini in
+sez.~\ref{sec:file_shared_access}) fra cui c'è anche la posizione corrente nel
+file.
 
 In questo modo se un processo scrive su un file aggiornerà la posizione
 corrente sulla \itindex{file~table} \textit{file table}, e tutti gli altri
@@ -606,7 +607,7 @@ comune dopo l'esecuzione di una \func{fork} è la seguente:
 \begin{itemize*}
 \item i file aperti e gli eventuali flag di \itindex{close-on-exec}
   \textit{close-on-exec} impostati (vedi sez.~\ref{sec:proc_exec} e
-  sez.~\ref{sec:file_fcntl});
+  sez.~\ref{sec:file_fcntl_ioctl});
 \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
@@ -896,8 +897,8 @@ processi figli.
 Si è già sottolineato al paragrafo precedente come in questo caso diventi
 necessario gestire esplicitamente la conclusione dei figli onde evitare di
 riempire di \itindex{zombie} \textit{zombie} la tabella dei
-processi. Tratteremo in questa sezione le funzioni deputate a questo compito;
-la prima è \funcd{wait} ed il suo prototipo è:
+processi. Tratteremo in questa sezione le funzioni di sistema deputate a
+questo compito; la prima è \funcd{wait} ed il suo prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -948,8 +949,8 @@ ampie, legate anche al controllo di sessione (si veda
 sez.~\ref{sec:sess_job_control}).  Dato che è possibile ottenere lo stesso
 comportamento di \func{wait}\footnote{in effetti il codice
   \code{wait(\&status)} è del tutto equivalente a \code{waitpid(WAIT\_ANY,
-    \&status, 0)}.} si consiglia di utilizzare sempre questa nuova funzione,
-\funcd{waitpid}, il cui prototipo è:
+    \&status, 0)}.} si consiglia di utilizzare sempre questa nuova funzione di
+sistema, \funcd{waitpid}, il cui prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -1204,8 +1205,8 @@ trattate in sez.~\ref{sec:sig_strsignal}.
 A partire dal kernel 2.6.9, sempre in conformità allo standard POSIX.1-2001, è
 stata introdotta una nuova funzione di attesa che consente di avere un
 controllo molto più preciso sui possibili cambiamenti di stato dei processi
-figli e più dettagli sullo stato di uscita; la funzione è \funcd{waitid} ed il
-suo prototipo è:
+figli e più dettagli sullo stato di uscita; la funzione di sistema è
+\funcd{waitid} ed il suo prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -1327,8 +1328,8 @@ la lettura dello stato di terminazione di un processo, analoghe alle
 precedenti ma che prevedono un ulteriore argomento attraverso il quale il
 kernel può restituire al padre informazioni sulle risorse (vedi
 sez.~\ref{sec:sys_res_limits}) usate dal processo terminato e dai vari figli.
-Le due funzioni sono \funcd{wait3} e \funcd{wait4}, che diventano accessibili
-definendo la macro \macro{\_USE\_BSD}, i loro prototipi sono:
+Le due funzioni di sistema sono \funcd{wait3} e \funcd{wait4}, che diventano
+accessibili definendo la macro \macro{\_USE\_BSD}, i loro prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -1621,7 +1622,7 @@ nell'esecuzione della funzione \func{exec}, queste sono:
 
 La gestione dei file aperti nel passaggio al nuovo programma lanciato con
 \func{exec} dipende dal valore che ha il flag di \itindex{close-on-exec}
-\textit{close-on-exec} (vedi sez.~\ref{sec:file_fcntl}) per ciascun
+\textit{close-on-exec} (vedi sez.~\ref{sec:file_fcntl_ioctl}) per ciascun
 \textit{file descriptor}. I file per cui è impostato vengono chiusi, tutti gli
 altri file restano aperti. Questo significa che il comportamento predefinito è
 che i file restano aperti attraverso una \func{exec}, a meno di una chiamata
@@ -1654,8 +1655,8 @@ dell'eseguibile.\footnote{il formato è ormai in completo disuso, per cui è
 programma è in formato ELF per caricare le librerie dinamiche viene usato
 l'interprete indicato nel segmento \const{PT\_INTERP} previsto dal formato
 stesso, in genere questo è \sysfile{/lib/ld-linux.so.1} per programmi
-collegati con le \acr{libc5}, e \sysfile{/lib/ld-linux.so.2} per programmi
-collegati con le \acr{glibc}.
+collegati con la \acr{libc5}, e \sysfile{/lib/ld-linux.so.2} per programmi
+collegati con la \acr{glibc}.
 
 Infine nel caso il programma che si vuole eseguire sia uno script e non un
 binario, questo deve essere un file di testo che deve iniziare con una linea
@@ -1810,8 +1811,8 @@ permessi di un altro, compreso l'amministratore.
 
 Come nel caso del \ids{PID} e del \ids{PPID}, anche tutti questi
 identificatori possono essere ottenuti da un programma attraverso altrettante
-funzioni di lettura, queste sono \funcd{getuid}, \funcd{geteuid},
-\funcd{getgid} e \funcd{getegid}, ed i loro prototipi sono:
+funzioni di sistema dedicate alla loro lettura, queste sono \funcd{getuid},
+\funcd{geteuid}, \funcd{getgid} e \funcd{getegid}, ed i loro prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{unistd.h}
@@ -1870,12 +1871,11 @@ ignorarne l'esistenza, in quanto saranno del tutto equivalenti ai precedenti.
 \subsection{Le funzioni di gestione degli identificatori dei processi}
 \label{sec:proc_setuid}
 
-Le due funzioni più comuni che vengono usate per cambiare identità (cioè
-utente e gruppo di appartenenza) ad un processo sono rispettivamente
-\funcd{setuid} e \funcd{setgid}; come accennato in
-sez.~\ref{sec:proc_access_id} in Linux esse seguono la semantica POSIX che
-prevede l'esistenza dell'\ids{UID} salvato e del \ids{GID} salvato; i loro
-prototipi sono:
+Le funzioni di sistema più comuni che vengono usate per cambiare identità
+(cioè utente e gruppo di appartenenza) ad un processo, e che come accennato in
+sez.~\ref{sec:proc_access_id} seguono la semantica POSIX che prevede
+l'esistenza dell'\ids{UID} salvato e del \ids{GID} salvato, sono
+rispettivamente \funcd{setuid} e \funcd{setgid}; i loro prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{unistd.h}
@@ -1966,10 +1966,10 @@ crea una nuova shell per l'utente, ma quando si vuole cambiare soltanto
 l'\ids{UID} effettivo del processo per cedere i privilegi occorre
 ricorrere ad altre funzioni.
 
-Le due funzioni \funcd{setreuid} e \funcd{setregid} derivano da BSD che, non
-supportando (almeno fino alla versione 4.3+BSD) gli identificatori del gruppo
-\textit{saved}, le usa per poter scambiare fra di loro \textit{effective} e
-\textit{real}; i rispettivi prototipi sono:
+Le due funzioni di sistema \funcd{setreuid} e \funcd{setregid} derivano da BSD
+che, non supportando (almeno fino alla versione 4.3+BSD) gli identificatori
+del gruppo \textit{saved}, le usa per poter scambiare fra di loro
+\textit{effective} e \textit{real}; i rispettivi prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{unistd.h}
@@ -2018,10 +2018,10 @@ questo motivo in Linux tutte le volte che si imposta un qualunque valore
 diverso da quello dall'\ids{UID} reale corrente, l'\ids{UID} salvato viene
 automaticamente uniformato al valore dell'\ids{UID} effettivo.
 
-Altre due funzioni, \funcd{seteuid} e \funcd{setegid}, sono un'estensione
-dello standard POSIX.1, ma sono comunque supportate dalla maggior parte degli
-Unix, esse vengono usate per cambiare gli identificatori del gruppo
-\textit{effective} ed i loro prototipi sono:
+Altre due funzioni di sistema, \funcd{seteuid} e \funcd{setegid}, sono
+un'estensione dello standard POSIX.1, ma sono comunque supportate dalla
+maggior parte degli Unix, esse vengono usate per cambiare gli identificatori
+del gruppo \textit{effective} ed i loro prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{unistd.h}
@@ -2045,7 +2045,7 @@ per permettere all'amministratore di impostare solo l'\ids{UID} effettivo,
 dato che l'uso normale di \func{setuid} comporta l'impostazione di tutti gli
 identificatori.
  
-Le due funzioni \funcd{setresuid} e \funcd{setresgid} sono invece
+Le due funzioni di sistema \funcd{setresuid} e \funcd{setresgid} sono invece
 un'estensione introdotta in Linux (a partire dal kernel 2.1.44) e permettono
 un completo controllo su tutti e tre i gruppi di identificatori
 (\textit{real}, \textit{effective} e \textit{saved}), i loro prototipi sono:
@@ -2074,11 +2074,11 @@ quello salvato, l'amministratore può specificare i valori che vuole. Un valore
 di $-1$ per un qualunque argomento lascia inalterato l'identificatore
 corrispondente.
 
-Per queste funzioni esistono anche due controparti, \funcd{getresuid} e
-\funcd{getresgid},\footnote{le funzioni non sono standard, anche se appaiono
-  in altri kernel, su Linux sono presenti dal kernel 2.1.44 e con le versioni
-  della \acr{glibc} a partire dalla 2.3.2, definendo la macro
-  \macro{\_GNU\_SOURCE}.} che permettono di leggere in blocco i vari
+Per queste funzioni di sistema esistono anche due controparti,
+\funcd{getresuid} e \funcd{getresgid},\footnote{le funzioni non sono standard,
+  anche se appaiono in altri kernel, su Linux sono presenti dal kernel 2.1.44
+  e con le versioni della \acr{glibc} a partire dalla 2.3.2, definendo la
+  macro \macro{\_GNU\_SOURCE}.} che permettono di leggere in blocco i vari
 identificatori; i loro prototipi sono:
 
 \begin{funcproto}{ 
@@ -2123,9 +2123,10 @@ si ottengono i privilegi necessari per accedere ai file, mantenendo quelli
 originari per quanto riguarda tutti gli altri controlli di accesso, così che
 l'utente non possa inviare segnali al server NFS.
 
-Le due funzioni usate per cambiare questi identificatori sono \funcd{setfsuid}
-e \funcd{setfsgid}, ed ovviamente sono specifiche di Linux e non devono essere
-usate se si intendono scrivere programmi portabili; i loro prototipi sono:
+Le due funzioni di sistema usate per cambiare questi identificatori sono
+\funcd{setfsuid} e \funcd{setfsgid}, ed ovviamente sono specifiche di Linux e
+non devono essere usate se si intendono scrivere programmi portabili; i loro
+prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{sys/fsuid.h}
@@ -2153,13 +2154,13 @@ Le ultime funzioni che esamineremo sono quelle che permettono di operare sui
 gruppi supplementari cui un utente può appartenere. Ogni processo può avere
 almeno \const{NGROUPS\_MAX} gruppi supplementari\footnote{il numero massimo di
   gruppi secondari può essere ottenuto con \func{sysconf} (vedi
-  sez.~\ref{sec:sys_sysconf}), leggendo il parametro
+  sez.~\ref{sec:sys_limits}), leggendo il parametro
   \texttt{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono
 ereditati dal processo padre e possono essere cambiati con queste funzioni.
 
-La funzione che permette di leggere i gruppi supplementari associati ad un
-processo è \funcd{getgroups}; questa funzione è definita nello standard
-POSIX.1, ed il suo prototipo è:
+La funzione di sistema che permette di leggere i gruppi supplementari
+associati ad un processo è \funcd{getgroups}; questa funzione è definita nello
+standard POSIX.1, ed il suo prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -2212,9 +2213,9 @@ chiamata con un vettore di dimensioni adeguate.
 Infine per impostare i gruppi supplementari di un processo ci sono due
 funzioni, che possono essere usate solo se si hanno i privilegi di
 amministratore.\footnote{e più precisamente se si ha la \itindex{capabilities}
-  \textit{capability} \macro{CAP\_SETGID}.} La prima delle due è
-\funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4, ma a
-  differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per
+  \textit{capability} \macro{CAP\_SETGID}.} La prima delle due è la funzione
+di sistema \funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4,
+  ma a differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per
   poterla utilizzare deve essere definita la macro \macro{\_BSD\_SOURCE}.} ed
 il suo prototipo è:
 
@@ -2239,8 +2240,9 @@ date dall'argomento \param{size}. Il numero massimo di gruppi supplementari
 che si possono impostare è un parametro di sistema, che può essere ricavato
 con le modalità spiegate in sez.~\ref{sec:sys_characteristics}.
 
-Se invece si vogliono impostare i gruppi supplementari del processo a quelli di
-un utente specifico, si può usare \funcd{initgroups} il cui prototipo è:
+Se invece si vogliono impostare i gruppi supplementari del processo a quelli
+di un utente specifico, si può usare la funzione \funcd{initgroups} il cui
+prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/types.h}
@@ -2516,7 +2518,7 @@ errore. La \textit{system call} originaria inoltre non consente, se non dotati
 di adeguati privilegi, di diminuire un valore di \textit{nice} precedentemente
 innalzato.
  
-Fino alle \acr{glibc} 2.2.4 la funzione di libreria riportava direttamente il
+Fino alla \acr{glibc} 2.2.4 la funzione di libreria riportava direttamente il
 risultato dalla \textit{system call}, violando lo standard, per cui per
 ottenere il nuovo valore occorreva una successiva chiamata alla funzione
 \func{getpriority}. A partire dalla \acr{glibc} 2.2.4 \func{nice} è stata
@@ -2529,7 +2531,7 @@ errore è quello di azzerare \var{errno} prima della chiamata della funzione e
 verificarne il valore quando \func{nice} restituisce $-1$.
 
 Per leggere il valore di \textit{nice} di un processo occorre usare la
-funzione \funcd{getpriority}, derivata da BSD; il suo prototipo è:
+funzione di sistema \funcd{getpriority}, derivata da BSD; il suo prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/time.h}
@@ -2590,8 +2592,8 @@ necessario cancellare sempre \var{errno} prima della chiamata alla funzione e
 quando si ottiene un valore di ritorno uguale a $-1$ per verificare che essa
 resti uguale a zero.
 
-Analoga a \func{getpriority} è la funzione \funcd{setpriority} che permette di
-impostare la priorità di uno o più processi; il suo prototipo è:
+Analoga a \func{getpriority} è la funzione di sistema \funcd{setpriority} che
+permette di impostare la priorità di uno o più processi; il suo prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sys/time.h}
@@ -2730,7 +2732,7 @@ che si è scelta; lo standard ne prevede due:
 Lo standard POSIX.1-2001 prevede una funzione che consenta sia di modificare
 le politiche di \textit{scheduling}, passando da \textit{real-time} a
 ordinarie o viceversa, che di specificare, in caso di politiche
-\textit{real-time}, la eventuale priorità statica; la funzione è
+\textit{real-time}, la eventuale priorità statica; la funzione di sistema è
 \funcd{sched\_setscheduler} ed il suo prototipo è:
 
 \begin{funcproto}{ 
@@ -2821,7 +2823,7 @@ rispettivamente 1 e 99.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
-  \begin{minipage}[c]{\textwidth}
+  \begin{minipage}[c]{0.5\textwidth}
     \includestruct{listati/sched_param.c}
   \end{minipage} 
   \normalsize 
@@ -2836,7 +2838,7 @@ la priorità dinamica determinata dal valore di \textit{nice}, che deve essere
 impostato con le funzioni viste in precedenza.
 
 Lo standard POSIX.1b prevede comunque che l'intervallo dei valori delle
-priorità statiche possa essere ottenuto tramite le due funzioni
+priorità statiche possa essere ottenuto con le funzioni di sistema
 \funcd{sched\_get\_priority\_max} e \funcd{sched\_get\_priority\_min}, i cui
 prototipi sono:
 
@@ -2898,11 +2900,11 @@ dal valore di \const{RLIMIT\_RTPRIO}, diminuirne la priorità o portarlo ad una
 politica ordinaria.
 
 Se si intende operare solo sulla priorità statica di un processo si possono
-usare le due funzioni \funcd{sched\_setparam} e \funcd{sched\_getparam} che
-consentono rispettivamente di impostarne e leggerne il valore, i loro
-prototipi sono:
+usare le due funzioni di sistema \funcd{sched\_setparam} e
+\funcd{sched\_getparam} che consentono rispettivamente di impostarne e
+leggerne il valore, i loro prototipi sono:
 
-\begin{funcproto}{ 
+\begin{funcproto}{
 \fhead{sched.h}
 \fdecl{int sched\_setparam(pid\_t pid, const struct sched\_param *param)}
 \fdesc{Imposta la priorità statica di un processo.} 
@@ -2937,8 +2939,8 @@ macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è definita nell'\textit{header
   file} \headfile{sched.h}.
 
 Se invece si vuole sapere quale è politica di \textit{scheduling} di un
-processo si può usare la funzione \funcd{sched\_getscheduler}, il cui
-prototipo è:
+processo si può usare la funzione di sistema \funcd{sched\_getscheduler}, il
+cui prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sched.h}
@@ -2959,10 +2961,10 @@ tab.~\ref{tab:proc_sched_policy}, della politica di \textit{scheduling} per il
 processo specificato dall'argomento \param{pid}, se questo è nullo viene
 restituito il valore relativo al processo chiamante.
 
-L'ultima funzione che permette di leggere le informazioni relative ai processi
-real-time è \funcd{sched\_rr\_get\_interval}, che permette di ottenere la
-lunghezza della \textit{time-slice} usata dalla politica \textit{round robin};
-il suo prototipo è:
+L'ultima funzione di sistema che permette di leggere le informazioni relative
+ai processi real-time è \funcd{sched\_rr\_get\_interval}, che permette di
+ottenere la lunghezza della \textit{time-slice} usata dalla politica
+\textit{round robin}; il suo prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sched.h}
@@ -2997,8 +2999,8 @@ di un processo ordinario, che però viene usato anche dai processi
 \textit{real-time}.
 
 Come accennato ogni processo può rilasciare volontariamente la CPU in modo da
-consentire agli altri processi di essere eseguiti; la funzione che consente di
-fare tutto ciò è \funcd{sched\_yield}, il cui prototipo è:
+consentire agli altri processi di essere eseguiti; la funzione di sistema che
+consente di fare tutto questo è \funcd{sched\_yield}, il cui prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sched.h}
@@ -3091,17 +3093,18 @@ sempre eseguito dallo stesso processore,\footnote{quella che viene detta
   solo una preferenza, non un requisito assoluto.} e per poter risolvere
 questo tipo di problematiche nei nuovi kernel\footnote{le due \textit{system
     call} per la gestione della \textit{CPU affinity} sono state introdotte
-  nel kernel 2.5.8, e le funzioni di libreria nelle \textsl{glibc} 2.3.} è
-stata introdotta l'opportuna infrastruttura ed una nuova \textit{system call}
-che permette di impostare su quali processori far eseguire un determinato
-processo attraverso una \textsl{maschera di affinità}. La corrispondente
-funzione di libreria è \funcd{sched\_setaffinity} ed il suo prototipo è:
+  nel kernel 2.5.8, e le corrispondenti funzioni di sistema nella
+  \textsl{glibc} 2.3.} è stata introdotta l'opportuna infrastruttura ed una
+nuova \textit{system call} che permette di impostare su quali processori far
+eseguire un determinato processo attraverso una \textsl{maschera di
+  affinità}. La corrispondente funzione di sistema è
+\funcd{sched\_setaffinity} ed il suo prototipo è:
 
 \index{insieme~di~processori|(}
 
 \begin{funcproto}{ 
 \fhead{sched.h}
-\fdecl{int sched\_setaffinity (pid\_t pid, size\_t setsize, 
+\fdecl{int sched\_setaffinity(pid\_t pid, size\_t setsize, 
   cpu\_set\_t *mask)}
 \fdesc{Imposta la maschera di affinità di un processo.} 
 }
@@ -3117,17 +3120,17 @@ caso \var{errno} assumerà uno dei valori:
 ed inoltre anche \errval{EFAULT} nel suo significato generico.}
 \end{funcproto}
 
-Questa funzione e la corrispondente \func{sched\_setaffinity} hanno una storia
+Questa funzione e la corrispondente \func{sched\_getaffinity} hanno una storia
 abbastanza complessa, la sottostante \textit{system call} infatti prevede
 l'uso di due soli argomenti (per il pid e l'indicazione della maschera dei
 processori), che corrispondono al fatto che l'implementazione effettiva usa
-una semplice maschera binaria. Quando le funzioni vennero incluse nelle
+una semplice maschera binaria. Quando le funzioni vennero incluse nella
 \acr{glibc} assunsero invece un prototipo simile a quello mostrato però con il
 secondo argomento di tipo \ctyp{unsigned int}. A complicare la cosa si
-aggiunge il fatto che nella versione 2.3.3 delle \acr{glibc} detto argomento
+aggiunge il fatto che nella versione 2.3.3 della \acr{glibc} detto argomento
 venne stato eliminato, per poi essere ripristinato nella versione 2.3.4 nella
 forma attuale.\footnote{pertanto se la vostra pagina di manuale non è
-  aggiornata, o usate quella particolare versione delle \acr{glibc}, potrete
+  aggiornata, o usate quella particolare versione della \acr{glibc}, potrete
   trovare indicazioni diverse, il prototipo illustrato è quello riportato
   nella versione corrente (maggio 2008) delle pagine di manuale e
   corrispondente alla definizione presente in \headfile{sched.h}.}
@@ -3166,9 +3169,9 @@ nell'evitare la perdita della cache da rendere conveniente l'uso dell'affinità
 di processore.
 
 Dato che il numero di processori può variare a seconda delle architetture, per
-semplificare l'uso dell'argomento \param{mask} le \acr{glibc} hanno introdotto
-un apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione
-  specifica delle \acr{glibc}, da attivare definendo la macro
+semplificare l'uso dell'argomento \param{mask} la \acr{glibc} ha introdotto un
+apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione
+  specifica della \acr{glibc}, da attivare definendo la macro
   \macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per questo
   tipo di interfaccia e POSIX al momento non prevede nulla al riguardo.} che
 permette di identificare un insieme di processori. Il dato è normalmente una
@@ -3216,7 +3219,7 @@ Si tenga presente che trattandosi di macro l'argomento \param{cpu} può essere
 valutato più volte. Questo significa ad esempio che non si può usare al suo
 posto una funzione o un'altra macro, altrimenti queste verrebbero eseguite più
 volte, l'argomento cioè non deve avere \textsl{effetti collaterali} (in gergo
-\itindex{side!effects} \textit{side effects}).\footnote{nel linguaggio C si
+\itindex{side~effects} \textit{side effects}).\footnote{nel linguaggio C si
   parla appunto di \textit{side effects} quando si usano istruzioni la cui
   valutazione comporta effetti al di fuori dell'istruzione stessa, come il
   caso indicato in cui si passa una funzione ad una macro che usa l'argomento
@@ -3317,8 +3320,8 @@ insieme di processori allocato dinamicamente.
 A meno di non aver utilizzato \func{sched\_setaffinity}, in condizioni
 ordinarie la maschera di affinità di un processo è preimpostata dal sistema in
 modo che esso possa essere eseguito su qualunque processore. Se ne può
-comunque ottenere il valore usando la funzione \funcd{sched\_getaffinity}, il
-cui prototipo è:
+comunque ottenere il valore corrente usando la funzione di sistema
+\funcd{sched\_getaffinity}, il cui prototipo è:
 
 \begin{funcproto}{ 
 \fhead{sched.h}
@@ -3388,15 +3391,15 @@ documentazione nella directory \texttt{Documentation/block/} dei sorgenti del
 kernel.
 
 Una volta che si sia impostato lo \textit{scheduler} CFQ ci sono due
-specifiche system call, specifiche di Linux, che consentono di leggere ed
-impostare le priorità di I/O.\footnote{se usate in corrispondenza ad uno
-  \textit{scheduler} diverso il loro utilizzo non avrà alcun effetto.} Dato
-che non esiste una interfaccia diretta nelle \acr{glibc} per queste due
+specifiche \textit{system call}, specifiche di Linux, che consentono di
+leggere ed impostare le priorità di I/O.\footnote{se usate in corrispondenza
+  ad uno \textit{scheduler} diverso il loro utilizzo non avrà alcun effetto.}
+Dato che non esiste una interfaccia diretta nella \acr{glibc} per queste due
 funzioni\footnote{almeno al momento della scrittura di questa sezione, con la
   versione 2.11 della \acr{glibc}.} occorrerà invocarle tramite la funzione
 \func{syscall} (come illustrato in sez.~\ref{sec:proc_syscall}). Le due
-funzioni sono \funcd{ioprio\_get} ed \funcd{ioprio\_set}; i rispettivi
-prototipi sono:
+\textit{system call} sono \funcd{ioprio\_get} ed \funcd{ioprio\_set}; i
+rispettivi prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{linux/ioprio.h}
@@ -3463,15 +3466,15 @@ della priorità da impostare con l'argomento \param{ioprio} di
     \hline
     \hline
     \macro{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})}
-                                & dato il valore di una priorità come
+                                & Dato il valore di una priorità come
                                   restituito da \func{ioprio\_get} estrae il
                                   valore della classe.\\
     \macro{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})}
-                                & dato il valore di una priorità come
+                                & Dato il valore di una priorità come
                                   restituito da \func{ioprio\_get} estrae il
                                   valore della priorità.\\
     \macro{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})}
-                                & dato un valore di priorità ed una classe
+                                & Dato un valore di priorità ed una classe
                                   ottiene il valore numerico da passare a
                                   \func{ioprio\_set}.\\
     \hline
@@ -3584,9 +3587,9 @@ che abbiamo già esaminato nelle sezioni precedenti, esistono una serie di
 proprietà e caratteristiche particolari dei processi non coperte da esse, per
 la cui gestione è stata predisposta una apposita \textit{system call} che
 fornisce una interfaccia generica per tutte le operazioni specialistiche. La
-funzione è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è
-  standardizzata ed è specifica di Linux, anche se ne esiste una analoga in
-  IRIX; è stata introdotta con il kernel 2.1.57.}
+funzione di sistema è \funcd{prctl} ed il suo prototipo è:\footnote{la
+  funzione non è standardizzata ed è specifica di Linux, anche se ne esiste
+  una analoga in IRIX; è stata introdotta con il kernel 2.1.57.}
 
 \begin{funcproto}{ 
 \fhead{sys/prctl.h}
@@ -3915,10 +3918,10 @@ indicare la unità di esecuzione generica messa a disposizione del kernel che
 
 Oltre a questo la funzione consente, ad uso delle nuove funzionalità di
 virtualizzazione dei processi, di creare nuovi \textit{namespace} per una
-serie di proprietà generali dei processi (come l'elenco dei PID, l'albero dei
-file, i \itindex{mount~point} \textit{mount point}, la rete, ecc.), che
-consentono di creare gruppi di processi che vivono in una sorta di spazio
-separato dagli altri, che costituisce poi quello che viene chiamato un
+serie di proprietà generali dei processi (come l'elenco dei \ids{PID},
+l'albero dei file, i \itindex{mount~point} \textit{mount point}, la rete,
+ecc.), che consentono di creare gruppi di processi che vivono in una sorta di
+spazio separato dagli altri, che costituisce poi quello che viene chiamato un
 \textit{container}.
 
 La \textit{system call} richiede soltanto due argomenti: il
@@ -3968,7 +3971,7 @@ automaticamente copiate come le altre e il nuovo processo avrà un suo
 \textit{stack} totalmente indipendente da quello del padre.
 
 Dato che l'uso principale della nuova \textit{system call} è quello relativo
-alla creazione dei \textit{thread}, le \acr{glibc} definiscono una funzione di
+alla creazione dei \textit{thread}, la \acr{glibc} definisce una funzione di
 libreria con una sintassi diversa, orientata a questo scopo, e la
 \textit{system call} resta accessibile solo se invocata esplicitamente come
 visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
@@ -4146,11 +4149,11 @@ Nel caso dell'interazione fra processi la situazione è molto più semplice, ed
 occorre preoccuparsi della atomicità delle operazioni solo quando si ha a che
 fare con meccanismi di intercomunicazione (che esamineremo in dettaglio in
 cap.~\ref{cha:IPC}) o nelle operazioni con i file (vedremo alcuni esempi in
-sez.~\ref{sec:file_atomic}). In questi casi in genere l'uso delle appropriate
-funzioni di libreria per compiere le operazioni necessarie è garanzia
-sufficiente di atomicità in quanto le \textit{system call} con cui esse sono
-realizzate non possono essere interrotte (o subire interferenze pericolose) da
-altri processi.
+sez.~\ref{sec:file_shared_access}). In questi casi in genere l'uso delle
+appropriate funzioni di libreria per compiere le operazioni necessarie è
+garanzia sufficiente di atomicità in quanto le \textit{system call} con cui
+esse sono realizzate non possono essere interrotte (o subire interferenze
+pericolose) da altri processi.
 
 Nel caso dei segnali invece la situazione è molto più delicata, in quanto lo
 stesso processo, e pure alcune \textit{system call}, possono essere interrotti
@@ -4280,8 +4283,8 @@ se viene passato lo stesso oggetto; in tutti questi casi occorre molta cura da
 parte del programmatore.
 
 In genere le funzioni di libreria non sono rientranti, molte di esse ad
-esempio utilizzano \index{variabili!statiche} variabili statiche, le
-\acr{glibc} però mettono a disposizione due macro di compilatore,
+esempio utilizzano \index{variabili!statiche} variabili statiche, la
+\acr{glibc} però mette a disposizione due macro di compilatore,
 \macro{\_REENTRANT} e \macro{\_THREAD\_SAFE}, la cui definizione attiva le
 versioni rientranti di varie funzioni di libreria, che sono identificate
 aggiungendo il suffisso \code{\_r} al nome della versione normale.