Ancora revisione capitolo funzionalità di sistema
[gapil.git] / system.tex
index 820bf41a3d2bb1bb6660468a6da89fba6d091f4e..27f1f386ee767487c7580c436962dae495f2ac74 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
 %% 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",
 %% 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.
 
 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
 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}
 
 \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*}
 
 \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
 
 \begin{table}[htb]
   \centering
@@ -151,7 +152,7 @@ sez.~\ref{sec:sys_file_limits}.
 \begin{table}[htb]
   \centering
   \footnotesize
 \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
     \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{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
     \hline
     \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
     \hline
@@ -247,7 +248,7 @@ valori ottenuti da \func{sysconf}.
 \begin{table}[htb]
   \centering
   \footnotesize
 \begin{table}[htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{8cm}|}
+  \begin{tabular}[c]{|l|p{9cm}|}
     \hline
     \textbf{Macro}&\textbf{Significato}\\
     \hline
     \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
 \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
 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
 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
 
 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*}
 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*}
 \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
 
 \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
 
 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
 
 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
 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
 
 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|)}
 
 
 \index{file!filesystem~\texttt  {/proc}!definizione|)}
 
-
-
 \section{La gestione del sistema}
 \label{sec:sys_management}
 
 \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
 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
 
 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
 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
 
 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
 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
 %  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
 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
 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
 
 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
 
 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} 
 
 \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
 
 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
 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
 \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.
   (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}
 
 \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
 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
     \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
     \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. \\
     \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.
 
 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: 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/
-
-%\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}
 
 
 \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
 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
 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
 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}
 
   \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.
   \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
 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
 
 \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
   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
 
 \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}.
 
   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
 \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
 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,\\
 
 \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.} 
 }
 
 \fdesc{Legge e imposta i limiti di una risorsa.} 
 }
 
@@ -1842,7 +1841,7 @@ precedenti.  Il suo prototipo è:
 }
 \end{funcproto}
 
 }
 \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
 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. 
 
 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}
 
 \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 è
 
 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}
 
 \begin{funcproto}{
 \fhead{stdlib.h}
@@ -2006,7 +2007,7 @@ prototipo è:
 \end{funcproto}
 
 La funzione attiva il salvataggio dei dati sul file indicato dal
 \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
 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}}
 
   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
 
 \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
 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}
 
 \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
 \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
 
 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
 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
 
 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:
   \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:
@@ -2530,9 +2537,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
 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
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2715,7 +2723,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
 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
 
 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
@@ -3269,7 +3277,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:  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
 
 %%% Local Variables: 
 %%% mode: latex