+\footnotetext[2]{il valore può essere \const{UCHAR\_MAX} o \const{SCHAR\_MAX}
+ a seconda che il sistema usi caratteri con segno o meno.}
+
+Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo
+saranno sempre disponibili al momento della compilazione. Un elenco, ripreso
+da \headfile{limits.h}, è riportato in tab.~\ref{tab:sys_ansic_macro}. Come si
+può vedere per la maggior parte questi limiti attengono alle dimensioni dei
+dati interi, che sono in genere fissati dall'architettura hardware, le
+analoghe informazioni per i dati in virgola mobile sono definite a parte, ed
+accessibili includendo \headfile{float.h}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|l|}
+ \hline
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \const{LLONG\_MAX}& 9223372036854775807& Massimo di \ctyp{long long}.\\
+ \const{LLONG\_MIN}&-9223372036854775808& Minimo di \ctyp{long long}.\\
+ \const{ULLONG\_MAX}&18446744073709551615&
+ Massimo di \ctyp{unsigned long long}.\\
+ \hline
+ \end{tabular}
+ \caption{Macro definite in \headfile{limits.h} in conformità allo standard
+ ISO C90.}
+ \label{tab:sys_isoc90_macro}
+\end{table}
+
+Lo standard prevede anche un'altra costante, \const{FOPEN\_MAX}, che può non
+essere fissa e che pertanto non è definita in \headfile{limits.h}, essa deve
+essere definita in \headfile{stdio.h} ed avere un valore minimo di 8. A questi
+valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo \ctyp{long
+ long} introdotto con il nuovo standard, i relativi valori sono in
+tab.~\ref{tab:sys_isoc90_macro}.
+
+Ovviamente le dimensioni dei vari tipi di dati sono solo una piccola parte
+delle caratteristiche del sistema; mancano completamente tutte quelle che
+dipendono dalla implementazione dello stesso. Queste, per i sistemi unix-like,
+sono state definite in gran parte dallo standard POSIX.1, che tratta anche i
+limiti relativi alle caratteristiche dei file che vedremo in
+sez.~\ref{sec:sys_file_limits}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{8cm}|}
+ \hline
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \const{ARG\_MAX} &131072& Dimensione massima degli argomenti
+ passati ad una funzione della famiglia
+ \func{exec}.\\
+ \const{CHILD\_MAX} & 999& Numero massimo di processi contemporanei
+ che un utente può eseguire.\\
+ \const{OPEN\_MAX} & 256& Numero massimo di file che un processo
+ può mantenere aperti in contemporanea.\\
+ \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
+ processo in contemporanea.\\
+ \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
+ \itindex{timezone} \textit{timezone} (vedi
+ sez.~\ref{sec:sys_time_base})).\\
+ \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
+ processo (vedi sez.~\ref{sec:proc_access_id}).\\
+ \const{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\
+ \hline
+ \end{tabular}
+ \caption{Costanti per i limiti del sistema.}
+ \label{tab:sys_generic_macro}
+\end{table}
+
+Purtroppo la sezione dello standard che tratta questi argomenti è una delle
+meno chiare, tanto che Stevens, in \cite{APUE}, la porta come esempio di
+``\textsl{standardese}''. Lo standard prevede che ci siano 13 macro che
+descrivono le caratteristiche del sistema: 7 per le caratteristiche generiche,
+riportate in tab.~\ref{tab:sys_generic_macro}, e 6 per le caratteristiche dei
+file, riportate in tab.~\ref{tab:sys_file_macro}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{8cm}|}
+ \hline
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \const{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti
+ passati ad una funzione della famiglia
+ \func{exec}.\\
+ \const{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi
+ contemporanei che un utente può
+ eseguire.\\
+ \const{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo
+ può mantenere aperti in
+ contemporanea.\\
+ \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
+ processo in contemporanea.\\
+ \const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una
+ \itindex{timezone} \textit{timezone}
+ (vedi sez.~\ref{sec:sys_date}). \\
+ \const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali
+ \textit{real-time} (vedi
+ sez.~\ref{sec:sig_real_time}).\\
+ \const{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per
+ processo (vedi
+ sez.~\ref{sec:proc_access_id}).\\
+ \const{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo
+ \type{ssize\_t}.\\
+ % \const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
+ % \const{\_POSIX\_AIO\_MAX} & 1& \\
+ \hline
+ \end{tabular}
+ \caption{Macro dei valori minimi di alcune caratteristiche generali del
+ sistema per la conformità allo standard POSIX.1.}
+ \label{tab:sys_posix1_general}
+\end{table}
+
+Lo standard dice che queste macro devono essere definite in
+\headfile{limits.h} quando i valori a cui fanno riferimento sono fissi, e
+altrimenti devono essere lasciate indefinite, ed i loro valori dei limiti
+devono essere accessibili solo attraverso \func{sysconf}. In realtà queste
+vengono sempre definite ad un valore generico. Si tenga presente poi che
+alcuni di questi limiti possono assumere valori molto elevati (come
+\const{CHILD\_MAX}), e non è pertanto il caso di utilizzarli per allocare
+staticamente della memoria.
+
+A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di
+altre costanti (il cui nome inizia sempre con \code{\_POSIX\_}) che
+definiscono i valori minimi le stesse caratteristiche devono avere, perché una
+implementazione possa dichiararsi conforme allo standard, alcuni dei questi
+valori sono riportati in tab.~\ref{tab:sys_posix1_general}.
+
+In genere questi valori non servono a molto, la loro unica utilità è quella di
+indicare un limite superiore che assicura la portabilità senza necessità di
+ulteriori controlli. Tuttavia molti di essi sono ampiamente superati in tutti
+i sistemi POSIX in uso oggigiorno. Per questo è sempre meglio utilizzare i
+valori ottenuti da \func{sysconf}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{8cm}|}
+ \hline
+ \textbf{Macro}&\textbf{Significato}\\
+ \hline
+ \hline
+ \macro{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il
+ \textit{job control} (vedi
+ sez.~\ref{sec:sess_job_control}).\\
+ \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del
+ gruppo \textit{saved} (vedi
+ sez.~\ref{sec:proc_access_id})
+ per il controllo di accesso dei processi.\\
+ \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1
+ supportata nel formato YYYYMML (ad esempio
+ 199009L).\\
+ \hline
+ \end{tabular}
+ \caption{Alcune macro definite in \headfile{limits.h} in conformità allo
+ standard POSIX.1.}
+ \label{tab:sys_posix1_other}
+\end{table}
+
+Oltre ai precedenti valori e a quelli relativi ai file elencati in
+tab.~\ref{tab:sys_posix1_file},, che devono essere obbligatoriamente definiti,
+lo standard POSIX.1 ne prevede molti altri. La lista completa si trova
+dall'header file \file{bits/posix1\_lim.h}, da non usare mai direttamente (è
+incluso automaticamente all'interno di \headfile{limits.h}). Di questi vale la
+pena menzionarne alcune macro di uso comune, riportate in
+tab.~\ref{tab:sys_posix1_other}, che non indicano un valore specifico, ma
+denotano la presenza di alcune funzionalità nel sistema, come il supporto del
+\textit{job control} o degli identificatori del gruppo \textit{saved}.
+
+Oltre allo standard POSIX.1, anche lo standard POSIX.2 definisce una serie di
+altre costanti. Siccome queste sono principalmente attinenti a limiti relativi
+alle applicazioni di sistema presenti, come quelli su alcuni parametri delle
+espressioni regolari o del comando \cmd{bc}, non li tratteremo esplicitamente,
+se ne trova una menzione completa nell'header file \file{bits/posix2\_lim.h},
+e alcuni di loro sono descritti nella pagina di manuale di \func{sysconf} e
+nel manuale delle \acr{glibc}.
+
+Quando uno dei limiti o delle caratteristiche del sistema può variare, per non
+dover essere costretti a ricompilare un programma tutte le volte che si
+cambiano le opzioni con cui è compilato il kernel, o alcuni dei parametri
+modificabili al momento dell'esecuzione, è necessario ottenerne il valore
+attraverso la funzione \funcd{sysconf}, cui prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{long sysconf(int name)}
+\fdesc{Restituisce il valore di un parametro di sistema.}
+}
+
+{La funzione ritorna in caso di successo il valore del parametro richiesto, o
+ 1 se si tratta di un'opzione disponibile, 0 se l'opzione non è disponibile e
+ $-1$ per un errore, nel qual caso però \var{errno} non viene impostata.}
+\end{funcproto}
+
+La funzione prende come argomento un intero che specifica quale dei limiti si
+vuole conoscere. Uno specchietto contenente i principali valori disponibili in
+Linux è riportato in tab.~\ref{tab:sys_sysconf_par}, l'elenco completo è
+contenuto in \file{bits/confname.h}, ed una lista più esaustiva, con le
+relative spiegazioni, si può trovare nel manuale delle \acr{glibc}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|p{8cm}|}
+ \hline
+ \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
+ \hline
+ \hline
+ \texttt{\_SC\_ARG\_MAX} & \const{ARG\_MAX}&
+ La dimensione massima degli argomenti passati
+ ad una funzione della famiglia \func{exec}.\\
+ \texttt{\_SC\_CHILD\_MAX} & \const{CHILD\_MAX}&
+ Il numero massimo di processi contemporanei
+ che un utente può eseguire.\\
+ \texttt{\_SC\_OPEN\_MAX} & \const{OPEN\_MAX}&
+ Il numero massimo di file che un processo può
+ mantenere aperti in contemporanea.\\
+ \texttt{\_SC\_STREAM\_MAX}& \const{STREAM\_MAX}&
+ Il massimo numero di stream che un processo
+ può mantenere aperti in contemporanea. Questo
+ limite previsto anche dallo standard ANSI C,
+ che specifica la macro {FOPEN\_MAX}.\\
+ \texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}&
+ La dimensione massima di un nome di una
+ \itindex{timezone} \texttt{timezone} (vedi
+ sez.~\ref{sec:sys_date}).\\
+ \texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}&
+ Massimo numero di gruppi supplementari che
+ può avere un processo (vedi
+ sez.~\ref{sec:proc_access_id}).\\
+ \texttt{\_SC\_SSIZE\_MAX} & \const{SSIZE\_MAX}&
+ Valore massimo del tipo di dato
+ \type{ssize\_t}.\\
+ \texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} &
+ Il numero di \itindex{clock~tick}
+ \textit{clock tick} al secondo,
+ cioè l'unità di misura del
+ \itindex{process~time} \textit{process
+ time} (vedi
+ sez.~\ref{sec:sys_unix_time}).\\
+ \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
+ Indica se è supportato il \textit{job
+ control} (vedi
+ sez.~\ref{sec:sess_job_control}) in stile
+ POSIX.\\
+ \texttt{\_SC\_SAVED\_IDS} & \macro{\_POSIX\_SAVED\_IDS}&
+ Indica se il sistema supporta i
+ \textit{saved id} (vedi
+ sez.~\ref{sec:proc_access_id}).\\
+ \texttt{\_SC\_VERSION} & \const{\_POSIX\_VERSION} &
+ Indica il mese e l'anno di approvazione
+ della revisione dello standard POSIX.1 a cui
+ il sistema fa riferimento, nel formato
+ YYYYMML, la revisione più recente è 199009L,
+ che indica il Settembre 1990.\\
+ \hline
+ \end{tabular}
+ \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
+ \label{tab:sys_sysconf_par}
+\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
+tab.~\ref{tab:sys_posix1_general}).
+
+In linea teorica si dovrebbe fare uso di \func{sysconf} solo quando la
+relativa costante di sistema non è definita, quindi con un codice analogo al
+seguente:
+\includecodesnip{listati/get_child_max.c}
+ma in realtà con Linux queste costanti sono comunque definite, indicando però
+un limite generico che non è detto sia corretto; per questo motivo è sempre
+meglio usare i valori restituiti da \func{sysconf}.
+
+
+\subsection{Limiti e caratteristiche dei file}
+\label{sec:sys_file_limits}
+
+Come per le caratteristiche generali del sistema anche per i file esistono una
+serie di limiti (come la lunghezza del nome del file o il numero massimo di
+link) che dipendono sia dall'implementazione che dal filesystem in uso. Anche
+in questo caso lo standard prevede alcune macro che ne specificano il valore,
+riportate in tab.~\ref{tab:sys_file_macro}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|l|}
+ \hline
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\
+ \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\
+ \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\
+ \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe
+ (vedi sez.~\ref{sec:ipc_pipes}).\\
+ \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
+ canonico (vedi sez.~\ref{sec:term_io_design}).\\
+ \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ del terminale (vedi
+ sez.~\ref{sec:term_io_design}).\\
+ \hline
+ \end{tabular}
+ \caption{Costanti per i limiti sulle caratteristiche dei file.}
+ \label{tab:sys_file_macro}
+\end{table}
+
+Come per i limiti di sistema, lo standard POSIX.1 detta una serie di valori
+minimi anche per queste caratteristiche, che ogni sistema che vuole essere
+conforme deve rispettare. Le relative macro sono riportate in
+tab.~\ref{tab:sys_posix1_file} e per esse vale lo stesso discorso fatto per le
+analoghe di tab.~\ref{tab:sys_posix1_general}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|l|}
+ \hline
+ \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\
+ \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\
+ \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
+ \textit{pathname}.\\
+ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
+ pipe.\\
+ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
+ terminale in modo canonico.\\
+ \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ del terminale.\\
+% \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
+% \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
+% \const{\_POSIX\_FD\_SETSIZE}& 16 & \\
+% \const{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
+ \hline
+ \end{tabular}
+ \caption{Costanti dei valori minimi delle caratteristiche dei file per la
+ conformità allo standard POSIX.1.}
+ \label{tab:sys_posix1_file}
+\end{table}
+
+Tutti questi limiti sono definiti in \headfile{limits.h}; come nel caso
+precedente il loro uso è di scarsa utilità in quanto ampiamente superati in
+tutte le implementazioni moderne. In generale i limiti per i file sono molto
+più soggetti ad essere variabili rispetto ai limiti generali del sistema; ad
+esempio parametri come la lunghezza del nome del file o il numero di link
+possono variare da filesystem a filesystem.
+
+Per questo motivo quando si ha a che fare con limiti relativi ai file questi
+devono essere sempre controllati con la funzione \funcd{pathconf}, il cui
+prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{long pathconf(char *path, int name)}
+\fdesc{Restituisce il valore di un parametro dei file.}
+}
+
+{La funzione ritorna il valore del parametro richiesto in caso di successo e
+ $-1$ per un errore, nel qual caso \var{errno} viene impostata ad uno degli
+ errori possibili relativi all'accesso a \param{path}.}
+\end{funcproto}
+
+La funzione richiede che si specifichi il limite che si vuole controllare con
+l'argomento \param{name}, per il quale si deve usare la relativa costante
+identificativa, il cui nome si ottiene da quelle descritte in
+tab.~\ref{tab:sys_file_macro} e tab.~\ref{tab:sys_posix1_file} con la stessa
+convenzione già vista con \func{sysconf}, ma un questo caso con l'uso del
+suffisso ``\texttt{\_PC\_}''.
+
+In questo caso la funzione richiede anche un secondo argomento \param{path}
+che specifichi a quale file si fa riferimento, dato che il valore del limite
+cercato può variare a seconda del filesystem su cui si trova il file. Una
+seconda versione della funzione, \funcd{fpathconf}, opera su un file
+descriptor invece che su un \textit{pathname}, il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{long fpathconf(int fd, int name)}
+\fdesc{Restituisce il valore di un parametro dei file.}
+}
+
+{È identica a \func{pathconf} solo che utilizza un file descriptor invece di
+ un \textit{pathname}; pertanto gli errori restituiti in \var{errno} cambiano
+ di conseguenza.}
+\end{funcproto}
+\noindent ed il suo comportamento è identico a quello di \func{pathconf} a
+parte quello di richiedere l'indicazione di un file descriptor
+nell'argomento \param{fd}.
+
+
+
+\subsection{I parametri del kernel ed il filesystem \texttt{/proc}}
+\label{sec:sys_sysctl}
+
+Tradizionalmente la funzione che permette la lettura ed l'impostazione dei
+parametri del sistema è \funcm{sysctl}. Si tratta di una funzione derivata da
+BSD4.4 ed introdotta su Linux a partire dal kernel 1.3.57, ma oggi il suo uso
+è totalmente deprecato. Una \textit{system call} \funcm{\_sysctl} continua ad
+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.
+
+Lo scopo di \funcm{sysctl} era quello di fornire ai programmi una modalità per
+modificare i parametri di sistema. Questi erano organizzati in maniera
+gerarchica all'interno di un albero e per accedere a ciascuno di essi
+occorreva specificare un percorso attraverso i vari nodi dell'albero, in
+maniera analoga a come avviene per la risoluzione di un \textit{pathname}.
+
+I parametri accessibili e modificabili attraverso questa funzione sono
+moltissimi, dipendendo anche dallo stato corrente del kernel, ad esempio dai
+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
+\end{itemize*}
+
+
+
+\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.
+
+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.
+
+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
+partire dalla directory \file{/proc/sys}, cosicché è possibile accedere al
+valore di un parametro del kernel tramite il \textit{pathname} ad un file
+sotto \file{/proc/sys} semplicemente leggendone il contenuto, così come si può
+modificare un parametro scrivendo sul file ad esso corrispondente.
+
+Il kernel si occupa di generare al volo il contenuto ed i nomi dei file
+corrispondenti ai vari parametri che sono presenti, e questo ha il grande
+vantaggio di rendere accessibili gli stessi ad un qualunque comando di shell e
+di permettere la navigazione dell'albero in modo da riconoscere quali
+parametri sono presenti senza dover cercare un valore all'interno di una
+pagina di manuale.
+
+Inizialmente l'uso del filesystem \file{/proc} serviva soltanto a replicare
+l'accesso, con altrettante corrispondenze ai file presenti in
+\file{/proc/sys}, ai parametri impostabili tradizionalmente con \func{sysctl},
+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.
+
+Nonostante la semplificazione nella gestione ottenuta con l'uso di
+\file{/proc/sys} resta il problema generale di conoscere il significato di
+ciascuno degli innumerevoli parametri che vi si trovano. Purtroppo la
+documentazione degli stessi spesso risulta incompleta e non aggiornata, ma
+buona parte di quelli può importanti sono descritti dalla documentazione
+inclusa nei sorgenti del kernel, nella directory \file{Documentation/sysctl}.
+
+Ma oltre alle informazioni che sostituiscono quelle ottenibili dalla ormai
+deprecata \func{sysctl} dentro \file{/proc} sono disponibili moltissime altre
+informazioni, fra cui ad esempio anche quelle fornite dalla funzione di
+sistema \funcd{uname},\footnote{con Linux ci sono in realtà 3 \textit{system
+ call} diverse per le dimensioni delle stringhe restituite, le prime due
+ usano rispettivamente delle lunghezze di 9 e 65 byte, la terza usa anch'essa
+ 65 byte, ma restituisce anche l'ultimo campo, \var{domainname}, con una
+ lunghezza di 257 byte, la \acr{glibc} provvede a mascherare questi dettagli
+ usando la versione più recente disponibile.} il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/utsname.h}
+\fdecl{int uname(struct utsname *info)}
+\fdesc{Restituisce informazioni generali sul sistema.}
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} può assumere solo il valore \errval{EFAULT}.}
+\end{funcproto}
+
+La funzione, che viene usata dal comando \cmd{uname}, restituisce una serie di
+informazioni relative al sistema nelle stringhe che costituiscono i campi
+della struttura \struct{utsname} (la cui definizione è riportata in
+fig.~\ref{fig:sys_utsname}) che viene scritta nel buffer puntato
+dall'argomento \param{info}.
+
+\begin{figure}[!ht!b]
+ \footnotesize \centering
+ \begin{minipage}[c]{0.8\textwidth}
+ \includestruct{listati/ustname.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{utsname}.}
+ \label{fig:sys_utsname}
+\end{figure}
+
+Si noti come in fig.~\ref{fig:sys_utsname} le dimensioni delle stringhe di
+\struct{utsname} non sono specificate. Il manuale delle \acr{glibc} indica
+due costanti per queste dimensioni, \const{\_UTSNAME\_LENGTH} per i campi
+standard e \const{\_UTSNAME\_DOMAIN\_LENGTH} per quello relativo al nome di
+dominio, altri sistemi usano nomi diversi come \const{SYS\_NMLN} o
+\const{\_SYS\_NMLN} o \const{UTSLEN} che possono avere valori diversi. Dato
+che il buffer per \struct{utsname} deve essere preallocato l'unico modo per
+farlo in maniera sicura è allora usare come dimensione il valore ottenuto con
+\code{sizeof(utsname)}.
+
+Le informazioni vengono restituite in ciascuno dei singoli campi di
+\struct{utsname} in forma di stringhe terminate dal carattere NUL. In
+particolare dette informazioni sono:
+\begin{itemize*}
+\item il nome del sistema operativo;
+\item il nome della macchine (l'\textit{hostname});
+\item il nome della release del kernel;
+\item il nome della versione del kernel;
+\item il tipo di hardware della macchina;
+\item il nome del domino (il \textit{domainname});
+\end{itemize*}
+ma l'ultima di queste informazioni è stata aggiunta di recente e non è
+prevista dallo standard POSIX, per questo essa è accessibile, come mostrato in
+fig.~\ref{fig:sys_utsname}, solo se si è definita la macro
+\macro{\_GNU\_SOURCE}.
+
+Come accennato queste stesse informazioni, anche se a differenza di
+\func{sysctl} la funzione continua ad essere mantenuta, si possono ottenere
+direttamente tramite il filesystem \file{/proc}, esse infatti sono mantenute
+rispettivamente nei file \sysctlrelfile{kernel}{ostype},
+\sysctlrelfile{kernel}{hostname}, \sysctlrelfile{kernel}{osrelease},
+\sysctlrelfile{kernel}{version} e \sysctlrelfile{kernel}{domainname} che si
+trovano sotto la directory \file{/proc/sys/kernel/}.
+
+\index{file!filesystem~\texttt {/proc}!definizione|)}
+
+
+
+\section{La gestione del sistema}
+\label{sec:sys_management}
+
+In questa sezione prenderemo in esame le interfacce di programmazione messe a
+disposizione per affrontare una serie di tematiche attinenti la gestione
+generale del sistema come quelle relative alla gestione di utenti e gruppi, al
+trattamento delle informazioni relative ai collegamenti al sistema, alle
+modalità per effettuare lo spegnimento o il riavvio di una macchina.
+
+
+\subsection{La gestione delle informazioni su utenti e gruppi}
+\label{sec:sys_user_group}
+
+Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
+(password, corrispondenze fra nomi simbolici e \ids{UID} numerici, home
+directory, ecc.) venivano registrate all'interno dei due file di testo
+\conffile{/etc/passwd} ed \conffile{/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.
+
+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
+prevede anche i due file \conffile{/etc/shadow} e \conffile{/etc/gshadow}, in
+cui sono state spostate le informazioni di autenticazione (ed inserite alcune
+estensioni di gestione avanzata) per toglierle dagli altri file che devono
+poter essere letti da qualunque processo per poter effettuare l'associazione
+fra username e \ids{UID}.
+
+Col tempo però questa impostazione ha incominciato a mostrare dei limiti. Da
+una parte il meccanismo classico di autenticazione è stato ampliato, ed oggi
+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.
+
+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
+\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} che
+tratteremo brevemente più avanti (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.
+% Per questo non tratteremo
+% affatto l'interfaccia di PAM, ma approfondiremo invece il sistema del
+% \textit{Name Service Switch}, un meccanismo messo a disposizione dalle
+% \acr{glibc} per modularizzare l'accesso a tutti i servizi in cui sia
+% necessario trovare una corrispondenza fra un nome ed un numero (od altra
+% informazione) ad esso associato, come appunto, quella fra uno username ed un
+% \ids{UID} o fra un \ids{GID} ed il nome del gruppo corrispondente.
+Le prime funzioni che vedremo sono quelle previste dallo standard POSIX.1;
+queste sono del tutto generiche e si appoggiano direttamente al \textit{Name
+ Service Switch}, per cui sono in grado di ricevere informazioni qualunque
+sia il supporto su cui esse vengono mantenute. Per leggere le informazioni
+relative ad un utente si possono usare due funzioni, \funcd{getpwuid} e
+\funcd{getpwnam}, i cui prototipi sono:
+
+\begin{funcproto}{
+\fhead{pwd.h}
+\fhead{sys/types.h}
+\fdecl{struct passwd *getpwuid(uid\_t uid)}
+\fdecl{struct passwd *getpwnam(const char *name)}
+\fdesc{Restituiscono le informazioni relative all'utente specificato.}
+}
+
+{Le funzioni ritornano il puntatore alla struttura contenente le informazioni
+ in caso di successo e \val{NULL} nel caso non sia stato trovato nessun
+ utente corrispondente a quanto specificato, nel qual caso \var{errno}
+ assumerà il valore riportato dalle funzioni di sistema sottostanti.}
+\end{funcproto}
+
+Le due funzioni forniscono le informazioni memorizzate nel registro degli
+utenti (che nelle versioni più recenti per la parte di credenziali di
+autenticazione vengono ottenute attraverso PAM) relative all'utente
+specificato attraverso il suo \ids{UID} o il nome di login. Entrambe le
+funzioni restituiscono un puntatore ad una struttura di tipo \struct{passwd}
+la cui definizione (anch'essa eseguita in \headfile{pwd.h}) è riportata in
+fig.~\ref{fig:sys_passwd_struct}, dove è pure brevemente illustrato il
+significato dei vari campi.
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{0.8\textwidth}
+ \includestruct{listati/passwd.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{passwd} contenente le informazioni relative
+ ad un utente del sistema.}
+ \label{fig:sys_passwd_struct}
+\end{figure}
+
+La struttura usata da entrambe le funzioni è allocata staticamente, per questo
+motivo viene sovrascritta ad ogni nuova invocazione, lo stesso dicasi per la
+memoria dove sono scritte le stringhe a cui i puntatori in essa contenuti
+fanno riferimento. Ovviamente questo implica che dette funzioni non possono
+essere \index{funzioni!rientranti} rientranti; per questo motivo ne esistono
+anche due versioni alternative (denotate dalla solita estensione \code{\_r}),
+i cui prototipi sono:
+
+\begin{funcproto}{
+\fhead{pwd.h}
+\fhead{sys/types.h}
+\fdecl{struct passwd *getpwuid\_r(uid\_t uid, struct passwd *password,
+ char *buffer,\\
+\phantom{struct passwd *getpwuid\_r(}size\_t buflen, struct passwd **result)}
+\fdecl{struct passwd *getpwnam\_r(const char *name, struct passwd
+ *password, char *buffer,\\
+\phantom{struct passwd *getpwnam\_r(}size\_t buflen, struct passwd **result)}
+\fdesc{Restituiscono le informazioni relative all'utente specificato.}
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} assumerà il valore riportato dalle di sistema funzioni
+ sottostanti.}
+\end{funcproto}
+
+In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
+la memoria necessaria a contenere le informazioni. In particolare i valori
+della struttura \struct{passwd} saranno restituiti all'indirizzo
+\param{password} mentre la memoria allocata all'indirizzo \param{buffer}, per
+un massimo di \param{buflen} byte, sarà utilizzata per contenere le stringhe
+puntate dai campi di \param{password}. Infine all'indirizzo puntato da
+\param{result} viene restituito il puntatore ai dati ottenuti, cioè
+\param{buffer} nel caso l'utente esista, o \val{NULL} altrimenti. Qualora i
+dati non possano essere contenuti nei byte specificati da \param{buflen}, la
+funzione fallirà restituendo \errcode{ERANGE} (e \param{result} sarà comunque
+impostato a \val{NULL}).
+
+Sia queste versioni rientranti che precedenti gli errori eventualmente
+riportati in \var{errno} in caso di fallimento dipendono dalla sottostanti
+funzioni di sistema usate per ricavare le informazioni (si veda quanto
+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
+errore più vari a seconda dei casi.
+
+Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e
+\funcd{getgrgid} che permettono di leggere le informazioni relative ai gruppi,
+i loro prototipi sono:
+
+\begin{funcproto}{
+\fhead{grp.h}
+\fhead{sys/types.h}
+\fdecl{struct group *getgrgid(gid\_t gid)}
+\fdecl{struct group *getgrnam(const char *name)}
+\fdesc{Restituiscono le informazioni relative al gruppo specificato.}
+}
+
+{Le funzioni ritornano il puntatore alla struttura contenente le informazioni
+ in caso di successo e \val{NULL} nel caso non sia stato trovato nessun
+ utente corrispondente a quanto specificato, nel qual caso \var{errno}
+ assumerà il valore riportato dalle funzioni di sistema sottostanti.}
+\end{funcproto}
+
+Come per le precedenti per gli utenti esistono anche le analoghe versioni
+\index{funzioni!rientranti} rientranti che di nuovo utilizzano la stessa
+estensione \code{\_r}; i loro prototipi sono:
+
+\begin{funcproto}{
+\fhead{grp.h}
+\fhead{sys/types.h}
+\fdecl{int getgrgid\_r(gid\_t gid, struct group *grp, char *buf,
+ size\_t buflen,\\
+\phantom{int getgrgid\_r(}struct group **result)}
+\fdecl{int getgrnam\_r(const char *name, struct group *grp, char *buf,
+ size\_t buflen,\\
+\phantom{int getgrnam\_r(}struct group **result)}
+\fdesc{Restituiscono le informazioni relative al gruppo specificato.}
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+ caso \var{errno} assumerà il valore riportato dalle funzioni di sistema
+ sottostanti.}
+\end{funcproto}