Merge branch 'master' of ssh://gapil.gnulinux.it/srv/git/gapil
[gapil.git] / system.tex
index 820bf41a3d2bb1bb6660468a6da89fba6d091f4e..a761b4dcd31e2431c3ea9f19294975863f1ee21f 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
-%% Copyright (C) 2000-2018 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -32,14 +32,14 @@ l'implementazione del kernel e delle librerie, le opzioni di
 configurazione. Il kernel inoltre mette a disposizione l'accesso ad alcuni
 parametri che possono modificarne il comportamento.
 
-La definizione di queste caratteristiche ed il tentativo di provvedere dei
+La definizione di queste caratteristiche ed il tentativo di fornire dei
 meccanismi generali che i programmi possono usare per ricavarle è uno degli
 aspetti più complessi e controversi con cui le diverse standardizzazioni si
-sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari.
-Daremo comunque una descrizione dei principali metodi previsti dai vari
-standard per ricavare sia le caratteristiche specifiche del sistema, che
-quelle della gestione dei file e prenderemo in esame le modalità con cui è
-possibile intervenire sui parametri del kernel.
+sono dovute confrontare, con risultati spesso tutt'altro che chiari.  Daremo
+comunque una descrizione dei principali metodi previsti dai vari standard per
+ricavare sia le caratteristiche specifiche del sistema che quelle della
+gestione dei file, e prenderemo in esame le modalità con cui è possibile
+intervenire sui parametri del kernel.
 
 \subsection{Limiti e caratteristiche del sistema}
 \label{sec:sys_limits}
@@ -58,16 +58,17 @@ sono necessari due tipi diversi di funzionalità:
 \item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
 \end{itemize*}
 
-La prima funzionalità si può ottenere includendo gli opportuni header file che
-contengono le costanti necessarie definite come macro di preprocessore, per la
-seconda invece sono ovviamente necessarie delle funzioni. La situazione è
-complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti
-sono fissi in un'implementazione mentre possono variare in un altra: tutto
-questo crea una ambiguità che non è sempre possibile risolvere in maniera
-chiara. In generale quello che succede è che quando i limiti del sistema sono
-fissi essi vengono definiti come macro di preprocessore nel file
-\headfile{limits.h}, se invece possono variare, il loro valore sarà ottenibile
-tramite la funzione \func{sysconf} (che esamineremo a breve).
+La prima funzionalità si può ottenere includendo gli opportuni file di
+intestazione che contengono le costanti necessarie definite come macro di
+preprocessore, per la seconda invece sono ovviamente necessarie delle
+funzioni. La  situazione è complicata dal fatto che ci sono molti casi in cui
+alcuni di questi limiti sono fissi in un'implementazione mentre possono
+variare in un altra: tutto questo crea una ambiguità che non è sempre
+possibile risolvere in maniera chiara. In generale quello che succede è che
+quando i limiti del sistema sono fissi essi vengono definiti come macro di
+preprocessore nel file \headfile{limits.h}, se invece possono variare, il loro
+valore sarà ottenibile tramite la funzione \func{sysconf} (che esamineremo a
+breve).
 
 \begin{table}[htb]
   \centering
@@ -151,7 +152,7 @@ sez.~\ref{sec:sys_file_limits}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|r|p{8cm}|}
+  \begin{tabular}[c]{|l|r|p{9cm}|}
     \hline
     \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
     \hline
@@ -187,7 +188,7 @@ file, riportate in tab.~\ref{tab:sys_file_macro}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|r|p{8cm}|}
+  \begin{tabular}[c]{|l|r|p{9cm}|}
     \hline
     \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
     \hline
@@ -247,7 +248,7 @@ valori ottenuti da \func{sysconf}.
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{8cm}|}
+  \begin{tabular}[c]{|l|p{9cm}|}
     \hline
     \textbf{Macro}&\textbf{Significato}\\
     \hline
@@ -370,12 +371,12 @@ relative spiegazioni, si può trovare nel manuale della \acr{glibc}.
 \end{table}
 
 In generale ogni limite o caratteristica del sistema per cui è definita una
-macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può
-essere ottenuto attraverso una chiamata a \func{sysconf}. Il nome della
-costante da utilizzare come valore dell'argomento \param{name} si otterrà
-aggiungendo \code{\_SC\_} ai nomi delle costanti definite dai primi due
-standard (quelle di tab.~\ref{tab:sys_generic_macro}), o sostituendolo a
-\code{\_POSIX\_} per le costanti definite dagli altri due standard (quelle di
+macro, sia da ANSI C e ISO C90 che da POSIX.1 e POSIX.2, può essere ottenuto
+attraverso una chiamata a \func{sysconf}. Il nome della costante da utilizzare
+come valore dell'argomento \param{name} si otterrà aggiungendo \code{\_SC\_}
+ai nomi delle costanti definite dai primi due standard (quelle di
+tab.~\ref{tab:sys_generic_macro}), o sostituendolo a \code{\_POSIX\_} per le
+costanti definite dagli altri due standard (quelle di
 tab.~\ref{tab:sys_posix1_general}).
 
 In linea teorica si dovrebbe fare uso di \func{sysconf} solo quando la
@@ -516,8 +517,10 @@ BSD4.4 ed introdotta su Linux a partire dal kernel 1.3.57, ma oggi il suo uso
 esistere, ma non dispone più di una interfaccia nella \acr{glibc} ed il suo
 utilizzo può essere effettuato solo tramite \func{syscall}, ma di nuovo questo
 viene sconsigliato in quanto la funzionalità non è più mantenuta e molto
-probabilmente sarà rimossa nel prossimo futuro. Per questo motivo eviteremo di
-trattarne i particolari.
+probabilmente sarà rimossa nel prossimo futuro.\footnote{a partire dal kernel
+  2.6.34 la funzione viene inserita nella compilazione del kernel previa
+  esplicita richiesta, ed il suo uso produce avvertimenti nei log del kernel.}
+Per questo motivo eviteremo di trattarne i particolari.
 
 Lo scopo di \funcm{sysctl} era quello di fornire ai programmi una modalità per
 modificare i parametri di sistema. Questi erano organizzati in maniera
@@ -531,33 +534,36 @@ moduli che sono stati caricati nel sistema. Inoltre non essendo standardizzati
 i loro nomi possono variare da una versione di kernel all'altra, alcuni esempi
 di questi parametri sono:
 \begin{itemize*}
-\item il nome di dominio
-\item i parametri del meccanismo di \textit{paging}.
-\item il filesystem montato come radice
-\item la data di compilazione del kernel
-\item i parametri dello stack TCP
-\item il numero massimo di file aperti
+\item il nome di dominio,
+\item i parametri del meccanismo di \textit{paging},
+\item il filesystem montato come radice,
+\item la data di compilazione del kernel,
+\item i parametri dello stack TCP,
+\item il numero massimo di file aperti,
+\item il numero massimo di processi,
+\item i parametri del \textit{SystemV IPC} (vedi sez.~\ref{sec:ipc_sysv}).
 \end{itemize*}
-
-
+%\noindent e molti altri che abbiamo già incontrato 
 
 \index{file!filesystem~\texttt  {/proc}!definizione|(}
 
 Dato che fin dall'inizio i parametri erano organizzati in una struttura
-albero, è parso naturale rimappare questa organizzazione utilizzando il
-filesystem \file{/proc}. Questo è un filesystem completamente virtuale, il cui
-contenuto è generato direttamente dal kernel, che non fa riferimento a nessun
-dispositivo fisico, ma presenta in forma di file e directory i dati di alcune
-delle strutture interne del kernel stesso. Il suo utilizzo principale, come
-denuncia il nome stesso, è quello di fornire una interfaccia per ottenere i
-dati relativi ai processi (venne introdotto a questo scopo su BSD), ma nel
-corso del tempo il suo uso è stato ampliato.
+albero, è parso naturale riportare questa organizzazione all'interno del
+filesystem \file{/proc}. Questo è un filesystem virtuale il cui contenuto è
+generato direttamente dal kernel, che non fa riferimento a nessun dispositivo
+fisico, ma presenta in forma di file e directory i dati di alcune delle
+strutture interne del kernel. Il suo utilizzo principale, come denuncia il
+nome stesso, è quello di fornire una interfaccia per ottenere i dati relativi
+ai processi (venne introdotto a questo scopo su BSD), ma nel corso del tempo
+il suo uso è stato ampliato.
 
 All'interno di questo filesystem sono pertanto presenti una serie di file che
 riflettono il contenuto dei parametri del kernel (molti dei quali accessibili
 in sola lettura) e in altrettante directory, nominate secondo il relativo
 \ids{PID}, vengono mantenute le informazioni relative a ciascun processo
-attivo nel sistema.
+attivo nel sistema (abbiamo già incontrato questa caratteristica in
+sez.~\ref{sec:file_openat} per accedere ai filedescriptor del processo
+stesso).
 
 In particolare l'albero dei valori dei parametri di sistema impostabili con
 \func{sysctl} viene presentato in forma di una gerarchia di file e directory a
@@ -579,8 +585,8 @@ l'accesso, con altrettante corrispondenze ai file presenti in
 ma vista la assoluta naturalità dell'interfaccia, e la sua maggiore
 efficienza, nelle versioni più recenti del kernel questa è diventata la
 modalità canonica per modificare i parametri del kernel, evitando di dover
-ricorrere all'uso di una \textit{system call} specifica che pur essendo ancora
-presente, prima o poi verrà eliminata.
+ricorrere all'uso di una \textit{system call} specifica, che pur essendo
+ancora presente prima o poi verrà eliminata.
 
 Nonostante la semplificazione nella gestione ottenuta con l'uso di
 \file{/proc/sys} resta il problema generale di conoscere il significato di
@@ -661,8 +667,6 @@ trovano sotto la directory \file{/proc/sys/kernel/}.
 
 \index{file!filesystem~\texttt  {/proc}!definizione|)}
 
-
-
 \section{La gestione del sistema}
 \label{sec:sys_management}
 
@@ -681,11 +685,11 @@ Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
 directory, ecc.)  venivano registrate all'interno dei due file di testo
 \conffiled{/etc/passwd} ed \conffiled{/etc/group}, il cui formato è descritto
 dalle relative pagine del manuale\footnote{nella quinta sezione, quella dei
-  file di configurazione (esistono comandi corrispondenti), una trattazione
-  sistemistica dell'intero argomento coperto in questa sezione si consulti
-  sez.~4.3 di \cite{AGL}.} e tutte le funzioni che richiedevano l'accesso a
-queste informazione andavano a leggere direttamente il contenuto di questi
-file.
+  file di configurazione, dato che esistono comandi corrispondenti; per una
+  trattazione sistemistica dell'intero argomento coperto in questa sezione si
+  consulti sez.~4.3 di \cite{AGL}.} e tutte le funzioni che richiedevano
+l'accesso a queste informazione andavano a leggere direttamente il contenuto
+di questi file.
 
 In realtà oltre a questi due file da molto tempo gran parte dei sistemi
 unix-like usano il cosiddetto sistema delle \textit{shadow password} che
@@ -701,26 +705,29 @@ la maggior parte delle distribuzioni di GNU/Linux usa la libreria PAM (sigla
 che sta per \textit{Pluggable Authentication Method}) che fornisce una
 interfaccia comune per i processi di autenticazione, svincolando completamente
 le singole applicazioni dai dettagli del come questa viene eseguita e di dove
-vengono mantenuti i dati relativi. Si tratta di un sistema modulare, in cui è
-possibile utilizzare anche più meccanismi insieme, diventa così possibile
-avere vari sistemi di riconoscimento (biometria, chiavi hardware, ecc.),
-diversi formati per le password e diversi supporti per le informazioni. Il
-tutto avviene in maniera trasparente per le applicazioni purché per ciascun
-meccanismo si disponga della opportuna libreria che implementa l'interfaccia
-di PAM.
+vengono mantenuti i dati relativi.
+
+Si tratta  di un  sistema modulare,  in cui è  possibile utilizzare  anche più
+meccanismi   insieme,   diventa  così   possibile   avere   vari  sistemi   di
+riconoscimento  (biometria, chiavi  hardware,  ecc.), diversi  formati per  le
+password e diversi  supporti per le informazioni. Il tutto  avviene in maniera
+trasparente  per le  applicazioni purché  per ciascun  meccanismo si  disponga
+della opportuna libreria che implementa l'interfaccia di PAM.
 
 Dall'altra parte, il diffondersi delle reti e la necessità di centralizzare le
 informazioni degli utenti e dei gruppi per insiemi di macchine e servizi
 all'interno di una stessa organizzazione, in modo da mantenere coerenti i
 dati, ha portato anche alla necessità di poter recuperare e memorizzare dette
 informazioni su supporti diversi dai file citati, introducendo il sistema del
-\textit{Name Service Switch} (che tratteremo brevemente in
-sez.~\ref{sec:sock_resolver}) dato che la sua applicazione è cruciale nella
+\textit{Name Service Switch}che tratteremo brevemente in
+sez.~\ref{sec:sock_resolver} dato che la sua applicazione è cruciale nella
 procedura di risoluzione di nomi di rete.
 
 In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche
 per la lettura delle informazioni relative a utenti e gruppi tralasciando
-completamente quelle relative all'autenticazione. 
+completamente quelle relative all'autenticazione.\footnote{la cui
+  programmazione ormai attiene all'uso dell'interfaccia di PAM, che va al di
+  la dello scopo di questo testo.}
 %  Per questo non tratteremo
 % affatto l'interfaccia di PAM, ma approfondiremo invece il sistema del
 % \textit{Name Service Switch}, un meccanismo messo a disposizione dalla
@@ -814,7 +821,7 @@ illustrato in sez.~\ref{sec:sys_errno}) per cui se lo si vuole utilizzare è
 opportuno inizializzarlo a zero prima di invocare le funzioni per essere
 sicuri di non avere un residuo di errore da una chiamata precedente. Il non
 aver trovato l'utente richiesto infatti può essere dovuto a diversi motivi (a
-partire dal fatto che non esista) per cui si possono ottenere i valori di
+partire dal fatto che non esista) per cui si possono ottenere i codici di
 errore più vari a seconda dei casi.
 
 Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e
@@ -970,15 +977,15 @@ informazioni sono descritte in dettaglio nel manuale della \acr{glibc}.
 
 Questi file non devono mai essere letti direttamente, ma le informazioni che
 contengono possono essere ricavate attraverso le opportune funzioni di
-libreria. Queste sono analoghe alle precedenti funzioni (vedi
-tab.~\ref{tab:sys_passwd_func}) usate per accedere al registro degli utenti,
-solo che in questo caso la struttura del registro della \textsl{contabilità} è
-molto più complessa, dato che contiene diversi tipi di informazione.
+libreria. Queste sono analoghe alle precedenti funzioni usate per accedere al
+registro degli utenti (vedi tab.~\ref{tab:sys_passwd_func}), solo che in
+questo caso la struttura del registro della \textsl{contabilità} è molto più
+complessa, dato che contiene diversi tipi di informazione.
 
 Le prime tre funzioni, \funcd{setutent}, \funcd{endutent} e \funcd{utmpname}
 servono rispettivamente a aprire e a chiudere il file che contiene il registro
 della \textsl{contabilità} degli, e a specificare su quale file esso viene
-mantenuto. I loro prototipi sono:
+mantenuto; i loro prototipi sono:
 
 \begin{funcproto}{
 \fhead{utmp.h} 
@@ -1151,7 +1158,7 @@ argomenti aggiuntivi, i rispettivi prototipi sono:
 
 Le funzioni si comportano esattamente come le precedenti analoghe non
 rientranti, solo che restituiscono il risultato all'indirizzo specificato dal
-primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result)}
+primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result},
 viene usato per restituire il puntatore al buffer stesso.
 
 Infine la \acr{glibc} fornisce altre due funzioni, \funcd{updwtmp} e
@@ -1275,15 +1282,16 @@ illustra i comandi attualmente disponibili:
 \item[\constd{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il
   messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata
   immediatamente la procedura di riavvio usando il comando fornito
-  nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'}
+  nell'argomento \param{arg} che viene stampato al posto di \texttt{'\%s'}
   (veniva usato per lanciare un altro programma al posto di \cmd{init}). Nelle
   versioni recenti questo argomento viene ignorato ed il riavvio può essere
   controllato dall'argomento di avvio del kernel \texttt{reboot=...}  Se non
   si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi
   saranno perduti.
+  % TODO: trattare LINUX_REBOOT_CMD_SW_SUSPEND
+  % TODO: rimandare agli effetti di reboot sui namespace
 \end{basedescript}
 
-
 Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si
 può eseguire un riavvio immediato pre-caricando una immagine del kernel, che
 verrà eseguita direttamente. Questo meccanismo consente di evitare la
@@ -1357,14 +1365,14 @@ che sia effettivamente eseguibile sul proprio processore.
     \hline
     \constd{KEXEC\_ON\_CRASH}        & Il kernel caricato sarà eseguito
                                       automaticamente in caso di crollo del
-                                      sistema.\\
+                                      sistema (dal kernel 2.6.13).\\
     \constd{KEXEC\_PRESERVE\_CONTEXT}& Viene preservato lo stato dei programmi 
                                       e dei dispositivi prima dell'esecuzione
                                       del nuovo kernel. Viene usato
                                       principalmente per l'ibernazione del
                                       sistema ed ha senso solo se si è
                                       indicato un numero di segmento maggiore
-                                      di zero.\\
+                                      di zero (dal kernel 2.6.27).\\
     \hline
     \constd{KEXEC\_ARCH\_DEFAULT}    & Il kernel caricato verrà eseguito nella
                                       architettura corrente. \\
@@ -1394,30 +1402,14 @@ più in grado di essere eseguito in maniera coerente.  Il secondo valore,
 programmi e dei dispositivi, e viene in genere usato per realizzare la
 cosiddetta ibernazione in RAM.
 
-% TODO: introdotta con il kernel 3.17 è stata introdotta
-% kexec_file_load, per caricare immagine firmate per il secure boot,
-% vedi anche http://lwn.net/Articles/603116/
-
-% TODO documentare keyctl ????
-% (fare sezione dedicata ????)
-
-% TODO documentare la Crypto API del kernel
-
-% TODO documentare la syscall getrandom, introdotta con il kernel 3.17, vedi
-% http://lwn.net/Articles/606141/, ed introdotta con le glibc solo con la
-% versione 2.25, vedi https://lwn.net/Articles/711013/
+% TODO: con il kernel 3.17 è stata introdotta kexec_file_load, per caricare
+% immagine firmate per il secure boot, vedi anche
+% http://lwn.net/Articles/603116/
 
-%\subsection{La gestione delle chiavi crittografiche}
-%\label{sec:keyctl_management}
-
-%TODO non è chiaro se farlo qui, ma documentare la syscall bpf aggiunta con il
-% kernel 3.18, vedi http://lwn.net/Articles/612878/; al riguardo vedi anche
-% https://lwn.net/Articles/660331/ 
 
 \section{Il controllo dell'uso delle risorse}
 \label{sec:sys_res_limits}
 
-
 Dopo aver esaminato in sez.~\ref{sec:sys_management} le funzioni che
 permettono di controllare le varie caratteristiche, capacità e limiti del
 sistema a livello globale, in questa sezione tratteremo le varie funzioni che
@@ -1533,7 +1525,7 @@ sez.~\ref{sec:sys_unix_time}). I campi \var{ru\_minflt} e \var{ru\_majflt}
 servono a quantificare l'uso della memoria virtuale e corrispondono
 rispettivamente al numero di \textit{page fault} (vedi
 sez.~\ref{sec:proc_mem_gen}) avvenuti senza richiedere I/O su disco (i
-cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O
+cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O
 su disco (detti invece \textit{major page
   fault}).% mentre \var{ru\_nswap} ed al numero di volte che
 % il processo è stato completamente tolto dalla memoria per essere inserito
@@ -1635,13 +1627,13 @@ limite corrente e limite massimo.
   \label{fig:sys_rlimit_struct}
 \end{figure}
 
-Come accennato processo ordinario può alzare il proprio limite corrente fino
-al valore del limite massimo, può anche ridurre, irreversibilmente, il valore
-di quest'ultimo.  Nello specificare un limite, oltre a fornire dei valori
-specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette
-di sbloccare completamente l'uso di una risorsa. Si ricordi però che solo un
-processo con i privilegi di amministratore\footnote{per essere precisi in
-  questo caso quello che serve è la \textit{capability}
+Come accennato un processo ordinario può alzare il proprio limite corrente
+fino al valore del limite massimo, e può anche ridurre, irreversibilmente, il
+valore di quest'ultimo.  Nello specificare un limite, oltre a fornire dei
+valori specifici, si può anche usare la costante \const{RLIM\_INFINITY} che
+permette di sbloccare completamente l'uso di una risorsa. Si ricordi però che
+solo un processo con i privilegi di amministratore\footnote{per essere precisi
+  in questo caso quello che serve è la \textit{capability}
   \const{CAP\_SYS\_RESOURCE} (vedi sez.~\ref{sec:proc_capabilities}).} può
 innalzare un limite al di sopra del valore corrente del limite massimo ed
 usare un valore qualsiasi per entrambi i limiti.
@@ -1650,7 +1642,7 @@ Ciascuna risorsa su cui si possono applicare dei limiti è identificata da uno
 specifico valore dell'argomento \param{resource}, i valori possibili per
 questo argomento, ed il significato della risorsa corrispondente, dei
 rispettivi limiti e gli effetti causati dal superamento degli stessi sono
-riportati nel seguente elenco:
+riportati nel seguente elenco.
 
 \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}}
 \item[\constd{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione
@@ -1690,8 +1682,8 @@ riportati nel seguente elenco:
   dimensione del segmento dati di un processo (vedi
   sez.~\ref{sec:proc_mem_layout}).  Il tentativo di allocare più memoria di
   quanto indicato dal limite corrente causa il fallimento della funzione di
-  allocazione eseguita (\func{brk} o \func{sbrk}) con un errore di
-  \errcode{ENOMEM}.
+  allocazione eseguita (\func{brk} o \func{sbrk} e dal kernel 4.7 anche
+  \func{mmap}) con un errore di \errcode{ENOMEM}.
 
 \item[\constd{RLIMIT\_FSIZE}] Questa risorsa indica, in byte, la massima
   dimensione di un file che un processo può usare. Se il processo cerca di
@@ -1749,6 +1741,13 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa
   descriptor farà fallire la funzione (\func{open}, \func{dup}, \func{pipe},
   ecc.) con un errore \errcode{EMFILE}.
 
+  % TODO: aggiungere Dal 4.5 definisce anche il limite sul numero massimo di
+  % file descriptor che un processo non privilegiato (senza la capacità
+  % \const{CAP\_SYS\_RESOURCE}, vedi sez.~\ref{sec:proc_capabilities}) può
+  % avere in corso di trasmissione verso altri
+  % processi usando i socket Unix-domain (vedi sez.XXX), il limite si applica
+  % si applica a \func{sendmsg}.
+
 \item[\constd{RLIMIT\_NPROC}] Questa risorsa indica il numero massimo di
   processi che possono essere creati dallo stesso utente, che viene
   identificato con l'\ids{UID} reale (vedi sez.~\ref{sec:proc_access_id}) del
@@ -1818,12 +1817,12 @@ Si noti come le due funzioni \func{getrlimit} e \func{setrlimit} consentano di
 operare solo sul processo corrente. Per questo motivo a partire dal kernel
 2.6.36 (e dalla \acr{glibc} 2.13) è stata introdotta un'altra funzione di
 sistema \funcd{prlimit} il cui scopo è quello di estendere e sostituire le
-precedenti.  Il suo prototipo è:
+precedenti; il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/resource.h}
 \fdecl{int prlimit(pid\_t pid, int resource, const struct rlimit *new\_limit,\\
-\phantom{int prlimit(}struct rlimit *old\_limit}
+\phantom{int prlimit(}struct rlimit *old\_limit)}
 \fdesc{Legge e imposta i limiti di una risorsa.} 
 }
 
@@ -1842,7 +1841,7 @@ precedenti.  Il suo prototipo è:
 }
 \end{funcproto}
 
-La funzione è specifica di Linux e non portabile; per essere usata richiede
+La funzione è specifica di Linux e non portabile, per essere usata richiede
 che sia stata definita la macro \macro{\_GNU\_SOURCE}. Il primo argomento
 indica il \ids{PID} del processo di cui si vogliono cambiare i limiti e si può
 usare un valore nullo per indicare il processo chiamante.  Per modificare i
@@ -1861,6 +1860,8 @@ possibile sia leggere che scrivere, anche in contemporanea, i valori dei
 limiti. Il significato dell'argomento \param{resource} resta identico rispetto
 a \func{getrlimit} e \func{setrlimit}, così come i restanti requisiti. 
 
+% TODO: a bassa priorità, documentare i vari problemi e cambiamenti nella
+% implementazione di queste funzioni dettagliati nella pagina di manuale
 
 \subsection{Le informazioni sulle risorse di memoria e processore}
 \label{sec:sys_memory_res}
@@ -1946,8 +1947,8 @@ attivi); anche queste sono informazioni comunque ottenibili attraverso
 
 Infine la \acr{glibc} riprende da BSD la funzione \funcd{getloadavg} che
 permette di ottenere il carico di processore della macchina, in questo modo è
-possibile prendere decisioni su quando far partire eventuali nuovi processi.
-Il suo prototipo è:
+possibile prendere decisioni su quando far partire eventuali nuovi processi,
+il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{stdlib.h}
@@ -2006,7 +2007,7 @@ prototipo è:
 \end{funcproto}
 
 La funzione attiva il salvataggio dei dati sul file indicato dal
-\textit{pathname} contenuti nella stringa puntata da \param{filename}; la
+\textit{pathname} contenuto nella stringa puntata da \param{filename}; la
 funzione richiede che il processo abbia i privilegi di amministratore (è
 necessaria la \textit{capability} \const{CAP\_SYS\_PACCT}, vedi
 sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per
@@ -2056,13 +2057,14 @@ espressi con diversi tipi di dati, chiamati rispettivamente \textit{calendar
   time} e \textit{process time}, secondo le seguenti definizioni:
 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 
-\item[\textit{calendar time}] detto anche \textsl{tempo di calendario}, 
-  \textsl{tempo d'orologio} o \textit{tempo reale}. Si tratta di un
-  tempo assoluto o di un intervallo di tempo come lo intende
-  normalmente per le misure fatte con un orologio. Per esprimere
-  questo tempo è stato riservato il tipo \type{time\_t}, e viene
-  tradizionalmente misurato in secondi a partire dalla mezzanotte del
-  primo gennaio 1970, data che viene chiamata \textit{the Epoch}.
+\item[\textit{calendar time}] detto anche \textsl{tempo di calendario},
+  \textsl{tempo d'orologio} o \textit{tempo reale}. Si tratta di un tempo
+  assoluto o di un intervallo di tempo come lo intende normalmente per le
+  misure fatte con un orologio. Per esprimere questo tempo è stato riservato
+  il tipo \type{time\_t}, e viene tradizionalmente misurato nel cosiddetto
+  \itindex{unix-time} \textit{unix-time}, espresso in secondi a partire dalla
+  mezzanotte del primo gennaio 1970, data che viene chiamata \textit{the
+    Epoch}.
 
 \item[\textit{process time}] detto anche \textsl{tempo di processore} o
   \textsl{tempo di CPU}. Si tratta del tempo impiegato da un processore
@@ -2332,10 +2334,12 @@ primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo
 Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time}
 viene espresso normalmente con una variabile di tipo \type{time\_t}, che
 usualmente corrisponde ad un tipo elementare; in Linux è definito come
-\ctyp{long int}, che di norma corrisponde a 32 bit. Il valore corrente del
-\textit{calendar time}, che indicheremo come \textsl{tempo di sistema}, può
-essere ottenuto con la funzione \funcd{time} che lo restituisce nel suddetto
-formato, il suo prototipo è:
+\ctyp{long int}, che di norma corrisponde a 32 bit, cosa che pone un limite al
+valore massimo esprimibile al 19 gennaio 2038, per ovviare alla cosa nelle
+versioni più recenti viene usato un valore di dimensioni maggiori. Il valore
+corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di
+  sistema}, può essere ottenuto con la funzione \funcd{time} che lo
+restituisce nel suddetto formato, il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{time.h}
@@ -2349,7 +2353,9 @@ formato, il suo prototipo è:
 \end{funcproto}
 
 L'argomento \param{t}, se non nullo, deve essere l'indirizzo di una variabile
-su cui duplicare il valore di ritorno.
+su cui duplicare il valore di ritorno, ma il suo uso è considerato obsoleto e
+deve essere sempre specificato come \val{NULL}, nel qual caso la funzione non
+può fallire.
 
 Analoga a \func{time} è la funzione \funcd{stime} che serve per effettuare
 l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo
@@ -2373,14 +2379,15 @@ sia necessario; il suo prototipo è:
 Dato che modificare l'ora ha un impatto su tutto il sistema il cambiamento
 dell'orologio è una operazione privilegiata e questa funzione può essere usata
 solo da un processo con i privilegi di amministratore (per la precisione la
-\textit{capability} \const{CAP\_SYS\_TIME}), altrimenti la chiamata fallirà
-con un errore di \errcode{EPERM}.
+\textit{capability} \const{CAP\_SYS\_TIME}, vedi
+sez.~\ref{sec:proc_capabilities}), altrimenti la chiamata fallirà con un
+errore di \errcode{EPERM}.
 
 Data la scarsa precisione nell'uso di \type{time\_t}, che ha una risoluzione
-massima di un secondo, quando si devono effettuare operazioni sui tempi di
-norma l'uso delle due funzioni precedenti è sconsigliato, ed esse sono di
-solito sostituite da \funcd{gettimeofday} e \funcd{settimeofday},\footnote{le
-  due funzioni \func{time} e \func{stime} sono più antiche e derivano da SVr4,
+di un secondo, quando si devono effettuare operazioni sui tempi l'uso delle
+due funzioni precedenti è sconsigliato, ed esse sono di solito sostituite da
+\funcd{gettimeofday} e \funcd{settimeofday},\footnote{le due funzioni
+  \func{time} e \func{stime} sono più antiche e derivano da SVr4,
   \func{gettimeofday} e \func{settimeofday} sono state introdotte da BSD, ed
   in BSD4.3 sono indicate come sostitute delle precedenti, \func{gettimeofday}
   viene descritta anche in POSIX.1-2001.} i cui prototipi sono:
@@ -2454,7 +2461,6 @@ usare la funzione \funcd{adjtime}, il cui prototipo è:
 }  
 \end{funcproto}
 
-
 Questa funzione permette di avere un aggiustamento graduale del tempo di
 sistema in modo che esso sia sempre crescente in maniera monotona. Il valore
 indicato nella struttura \struct{timeval} puntata da \param{delta} esprime il
@@ -2530,9 +2536,10 @@ delle costanti elencate in tab.~\ref{tab:adjtimex_return}.
 La funzione richiede come argomento il puntatore ad una struttura di tipo
 \struct{timex}, la cui definizione, effettuata in \headfiled{sys/timex.h}, è
 riportata in fig.~\ref{fig:sys_timex_struct} per i campi che interessano la
-possibilità di essere modificati documentati anche nella pagina di manuale. In
-realtà la struttura è stata estesa con ulteriori campi, i cui valori sono
-utilizzabili solo in lettura, la cui definizione si può trovare direttamente
+possibilità di essere modificati. In realtà la struttura è stata estesa con
+ulteriori campi, i cui valori sono utilizzabili solo in lettura, non riportati
+in fig.~\ref{fig:sys_timex_struct}, i dettagli di questi campi si possono
+recuperare dalla pagina di manuale di \func{adjtimex}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2555,46 +2562,46 @@ riportate in tab.~\ref{tab:sys_timex_mode}.
 \begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|p{8cm}|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
-    \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
+    \textbf{Nome} & \textbf{Significato}\\
     \hline
     \hline
-    \constd{ADJ\_OFFSET}        & 0x0001 & Imposta la differenza fra il tempo
-                                           reale e l'orologio di sistema: 
-                                           deve essere indicata in microsecondi
-                                           nel campo \var{offset} di
-                                           \struct{timex}.\\ 
-    \constd{ADJ\_FREQUENCY}     & 0x0002 & Imposta la differenza in frequenza
-                                           fra il tempo reale e l'orologio di
-                                           sistema: deve essere indicata
-                                           in parti per milione nel campo
-                                           \var{frequency} di \struct{timex}.\\
-    \constd{ADJ\_MAXERROR}      & 0x0004 & Imposta il valore massimo 
-                                           dell'errore sul tempo, espresso in
-                                           microsecondi nel campo
-                                           \var{maxerror} di \struct{timex}.\\ 
-    \constd{ADJ\_ESTERROR}      & 0x0008 & Imposta la stima dell'errore
-                                           sul tempo, espresso in microsecondi 
-                                           nel campo \var{esterror} di
-                                           \struct{timex}.\\
-    \constd{ADJ\_STATUS}        & 0x0010 & Imposta alcuni valori di stato
-                                           interni usati dal 
-                                           sistema nella gestione
-                                           dell'orologio specificati nel campo
-                                           \var{status} di \struct{timex}.\\ 
-    \constd{ADJ\_TIMECONST}     & 0x0020 & Imposta la larghezza di banda del 
-                                           PLL implementato dal kernel,
-                                           specificato nel campo
-                                           \var{constant} di \struct{timex}.\\ 
-    \constd{ADJ\_TICK}          & 0x4000 & Imposta il valore dei \textit{tick}
-                                           del timer in
-                                           microsecondi, espresso nel campo
-                                           \var{tick} di \struct{timex}.\\  
-    \constd{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum 
-                                           dell'orologio secondo il valore del
-                                           campo \var{offset} simulando il
-                                           comportamento di \func{adjtime}.\\ 
+    \constd{ADJ\_OFFSET}        & Imposta la differenza fra il tempo
+                                  reale e l'orologio di sistema: 
+                                  deve essere indicata in microsecondi
+                                  nel campo \var{offset} di
+                                  \struct{timex}.\\ 
+    \constd{ADJ\_FREQUENCY}     & Imposta la differenza in frequenza
+                                  fra il tempo reale e l'orologio di
+                                  sistema: deve essere indicata
+                                  in parti per milione nel campo
+                                  \var{frequency} di \struct{timex}.\\
+    \constd{ADJ\_MAXERROR}      & Imposta il valore massimo 
+                                  dell'errore sul tempo, espresso in
+                                  microsecondi nel campo
+                                  \var{maxerror} di \struct{timex}.\\ 
+    \constd{ADJ\_ESTERROR}      & Imposta la stima dell'errore
+                                  sul tempo, espresso in microsecondi 
+                                  nel campo \var{esterror} di
+                                  \struct{timex}.\\
+    \constd{ADJ\_STATUS}        & Imposta alcuni valori di stato
+                                  interni usati dal 
+                                  sistema nella gestione
+                                  dell'orologio specificati nel campo
+                                  \var{status} di \struct{timex}.\\ 
+    \constd{ADJ\_TIMECONST}     & Imposta la larghezza di banda del 
+                                  PLL implementato dal kernel,
+                                  specificato nel campo
+                                  \var{constant} di \struct{timex}.\\ 
+    \constd{ADJ\_TICK}          & Imposta il valore dei \textit{tick}
+                                  del timer in
+                                  microsecondi, espresso nel campo
+                                  \var{tick} di \struct{timex}.\\  
+    \constd{ADJ\_OFFSET\_SINGLESHOT}&Chiede uno spostamento una tantum 
+                                      dell'orologio secondo il valore del
+                                      campo \var{offset} simulando il
+                                      comportamento di \func{adjtime}.\\ 
     \hline
   \end{tabular}
   \caption{Costanti per l'assegnazione del valore del campo \var{mode} della
@@ -2667,7 +2674,7 @@ dell'orologio per effettuare gli aggiustamenti del calendario per tenere conto
 del disallineamento con il tempo solare.\footnote{per dettagli si consulti
   \url{http://it.wikipedia.org/wiki/Leap_second}.}
 
-I campi \var{tm\_min} e\var{tm\_hour} che indicano rispettivamente minuti ed
+I campi \var{tm\_min} e \var{tm\_hour} che indicano rispettivamente minuti ed
 ore hanno valori compresi rispettivamente fra 0 e 59 e fra 0 e 23. Il campo
 \var{tm\_mday} che indica il giorno del mese prevede invece un valore compreso
 fra 1 e 31, ma la \acr{glibc} supporta pure il valore 0 come indicazione
@@ -2715,7 +2722,7 @@ Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione
 di una \textit{timezone} e effettua una chiamata preventiva a \func{tzset}
 (che vedremo a breve), in modo che la data espressa tenga conto del fuso
 orario. In realtà \func{ctime} è banalmente definita in termini di
-\func{asctime} come \code{asctime(localtime(t)}.
+\func{asctime} come \code{asctime(localtime(t))}.
 
 Dato che l'uso di una stringa statica rende le funzioni non rientranti
 POSIX.1c e SUSv2 prevedono due sostitute rientranti, il cui nome è al solito
@@ -2761,40 +2768,30 @@ preallocare la struttura su cui sarà restituita la conversione. La versione
 rientrante di \func{localtime} però non effettua la chiamata preventiva a
 \func{tzset} che deve essere eseguita a cura dell'utente.
 
-Infine \func{mktime} esegue la conversione di un \textit{broken-down time} a
-partire da una struttura \struct{tm} restituendo direttamente un valore di
-tipo \type{time\_t} con il \textit{calendar time}. La funzione ignora i campi
-\var{tm\_wday} e \var{tm\_yday} e per gli altri campi normalizza eventuali
-valori fuori degli intervalli specificati in precedenza: se cioè si indica un
-12 per \var{tm\_mon} si prenderà il gennaio dell'anno successivo. Inoltre la
-funzione tiene conto del valore di \var{tm\_isdst} per effettuare le
-correzioni relative al fuso orario: un valore positivo indica che deve essere
-tenuta in conto l'ora legale, un valore nullo che non deve essere applicata
-nessuna correzione, un valore negativo che si deve far ricorso alle
+La funzione \func{mktime} esegue invece la conversione di un
+\textit{broken-down time} a partire da una struttura \struct{tm} restituendo
+direttamente un valore di tipo \type{time\_t} con il \textit{calendar
+  time}. La funzione ignora i campi \var{tm\_wday} e \var{tm\_yday} e per gli
+altri campi normalizza eventuali valori fuori degli intervalli specificati in
+precedenza: se cioè si indica un 12 per \var{tm\_mon} si prenderà il gennaio
+dell'anno successivo.
+
+Inoltre la funzione tiene conto del valore di \var{tm\_isdst} per effettuare
+le correzioni relative al fuso orario: un valore positivo indica che deve
+essere tenuta in conto l'ora legale, un valore nullo che non deve essere
+applicata nessuna correzione, un valore negativo che si deve far ricorso alle
 informazioni relative al proprio fuso orario per determinare lo stato dell'ora
-legale.  
+legale.
 
-La funzione inoltre modifica i valori della struttura \struct{tm} in forma di
+La funzione infine modifica i valori della struttura \struct{tm} in forma di
 \textit{value result argument}, normalizzando i valori dei vari campi,
 impostando i valori risultanti per \var{tm\_wday} e \var{tm\_yday} e
 assegnando a \var{tm\_isdst} il valore (positivo o nullo) corrispondente allo
-stato dell'ora legale. La funzione inoltre provvede ad impostare il valore
-della variabile globale \var{tzname}.
+stato dell'ora legale. La funzione provvede anche ad impostare il valore della
+variabile globale \var{tzname}.
 
 \itindend{calendar~time}
 
-\begin{figure}[!htb]
-  \footnotesize
-  \centering
-  \begin{minipage}[c]{.75\textwidth}
-    \includestruct{listati/time_zone_var.c}
-  \end{minipage} 
-  \normalsize 
-  \caption{Le variabili globali usate per la gestione delle
-    \textit{timezone}.}
-  \label{fig:sys_tzname}
-\end{figure}
-
 Come accennato l'uso del \textit{broken-down time} permette di tenere conto
 anche della differenza fra tempo universale e ora locale, compresa l'eventuale
 ora legale.  Questo viene fatto dalle funzioni di conversione grazie alle
@@ -2824,6 +2821,18 @@ per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come
 \var{timezone} indica la differenza di fuso orario in secondi, mentre
 \var{daylight} indica se è attiva o meno l'ora legale.
 
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{.75\textwidth}
+    \includestruct{listati/time_zone_var.c}
+  \end{minipage} 
+  \normalsize 
+  \caption{Le variabili globali usate per la gestione delle
+    \textit{timezone}.}
+  \label{fig:sys_tzname}
+\end{figure}
+
 Benché la funzione \func{asctime} fornisca la modalità più immediata per
 stampare un tempo o una data, la flessibilità non fa parte delle sue
 caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il
@@ -2894,8 +2903,8 @@ Il risultato della funzione è controllato dalla stringa di formato
 \param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che
 viene utilizzato come modificatore. Alcuni dei possibili valori che esso può
 assumere sono riportati in tab.~\ref{tab:sys_strftime_format}.\footnote{per la
-  precisione si sono riportati definiti dallo standard ANSI C, che sono anche
-  quelli ripresi in POSIX.1; la \acr{glibc} fornisce anche le estensioni
+  precisione si sono riportati quelli definiti dallo standard ANSI C che sono
+  anche quelli ripresi in POSIX.1; la \acr{glibc} fornisce anche le estensioni
   introdotte da POSIX.2 per il comando \cmd{date}, i valori introdotti da
   SVID3 e ulteriori estensioni GNU; l'elenco completo dei possibili valori è
   riportato nella pagina di manuale della funzione.} La funzione tiene conto
@@ -2931,7 +2940,7 @@ questo riguardo si rimanda alla lettura della pagina di manuale.
 
 Si tenga presente comunque che anche in caso di scansione completamente
 riuscita la funzione sovrascrive soltanto i campi di \param{tm} indicati dal
-formato, la struttura originaria infatti non viene inizializzati e gli altri
+formato, la struttura originaria infatti non viene inizializzata e gli altri
 campi restano ai valori che avevano in precedenza.
 
 
@@ -2973,9 +2982,9 @@ questo è infatti il metodo usato da Linux per renderla locale ai singoli
 \textit{thread}.
 
 La variabile è in genere definita come \dirct{volatile} dato che può essere
-cambiata in modo asincrono da un segnale, per un esempio si veda
+cambiata in modo asincrono da un segnale; per un esempio si veda
 sez.~\ref{sec:sig_sigchld} ricordando quanto trattato in
-sez.~\ref{sec:proc_race_cond}). Dato che un gestore di segnale scritto bene si
+sez.~\ref{sec:proc_race_cond}. Dato che un gestore di segnale scritto bene si
 cura di salvare e ripristinare il valore della variabile all'uscita, nella
 programmazione normale, quando si può fare l'assunzione che i gestori di
 segnali siano ben scritti, di questo non è necessario preoccuparsi.
@@ -3103,7 +3112,9 @@ variabili globali:
 dichiarate in \headfile{errno.h}. La prima contiene i puntatori alle stringhe
 di errore indicizzati da \var{errno}; la seconda esprime il valore più alto
 per un codice di errore, l'utilizzo di una di queste stringhe è
-sostanzialmente equivalente a quello di \func{strerror}.
+sostanzialmente equivalente a quello di \func{strerror}, ma dato che non è
+detto che \var{sys\_errlist} sia stato aggiornato in caso di aggiunta di nuovi
+errori, il suo uso è deprecato e si deve sempre usare \func{perror}.
 
 \begin{figure}[!htbp]
   \footnotesize \centering
@@ -3269,7 +3280,7 @@ che errori relativi alla stessa linea non vengano ripetuti.
 % LocalWords:  memory mlockall MAP LOCKED shmctl MSGQUEUE attr NICE nice MADV
 % LocalWords:  madvise WILLNEED RTPRIO sched setscheduler setparam scheduling
 % LocalWords:  RTTIME execve kb prlimit pid new old ESRCH EUSERS refresh high
-% LocalWords:  resolution HRT jiffies strptime
+% LocalWords:  resolution HRT jiffies strptime pre l'I value argument
 
 %%% Local Variables: 
 %%% mode: latex