+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 valore si otterrà
+specificando come valore dell'argomento \param{name} il nome ottenuto
+aggiungendo \code{\_SC\_} ai nomi delle macro definite dai primi due, o
+sostituendolo a \code{\_POSIX\_} per le macro definite dagli gli altri due.
+
+In generale si dovrebbe fare uso di \func{sysconf} solo quando la relativa
+macro non è definita, quindi con un codice analogo al seguente:
+\includecodesnip{listati/get_child_max.c}
+ma in realtà in Linux queste macro sono comunque definite, indicando però un
+limite generico. Per questo motivo è sempre meglio usare i valori restituiti
+da \func{sysconf}.
+
+
+\subsection{I limiti 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_design}).\\
+ \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ del terminale (vedi
+ sez.~\ref{sec:term_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.
+
+
+\subsection{La funzione \func{pathconf}}
+\label{sec:sys_pathconf}
+
+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 questi limiti devono essere sempre controllati
+con la funzione \funcd{pathconf}, il cui prototipo è:
+\begin{prototype}{unistd.h}{long pathconf(char *path, int name)}
+ Restituisce il valore del parametro \param{name} per il file \param{path}.
+
+ \bodydesc{La funzione restituisce indietro il valore del parametro
+ richiesto, o -1 in caso di errore (ed \var{errno} viene impostata ad uno
+ degli errori possibili relativi all'accesso a \param{path}).}
+\end{prototype}
+
+E si noti come la funzione in questo caso richieda un argomento che specifichi
+a quale file si fa riferimento, dato che il valore del limite cercato può
+variare a seconda del filesystem. Una seconda versione della funzione,
+\funcd{fpathconf}, opera su un file descriptor invece che su un
+\textit{pathname}. Il suo prototipo è:
+\begin{prototype}{unistd.h}{long fpathconf(int fd, int name)}
+ Restituisce il valore del parametro \param{name} per il file \param{fd}.
+
+ \bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor
+ invece di un \textit{pathname}; pertanto gli errori restituiti cambiano di
+ conseguenza.}
+\end{prototype}
+\noindent ed il suo comportamento è identico a quello di \func{pathconf}.
+
+
+\subsection{La funzione \func{uname}}
+\label{sec:sys_uname}
+
+Un'altra funzione che si può utilizzare per raccogliere informazioni sia
+riguardo al sistema che al computer su cui esso sta girando è \funcd{uname};
+il suo prototipo è:
+\begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)}
+ Restituisce informazioni sul sistema nella struttura \param{info}.
+
+ \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
+ fallimento, nel qual caso \var{errno} assumerà il valore \errval{EFAULT}.}
+\end{prototype}
+
+La funzione, che viene usata dal comando \cmd{uname}, restituisce le
+informazioni richieste nella struttura \param{info}; anche questa struttura è
+definita in \headfile{sys/utsname.h}, secondo quanto mostrato in
+fig.~\ref{fig:sys_utsname}, e le informazioni memorizzate nei suoi membri
+indicano rispettivamente:
+\begin{itemize*}
+\item il nome del sistema operativo;
+\item il nome della release del kernel;
+\item il nome della versione del kernel;
+\item il tipo di macchina in uso;
+\item il nome della stazione;
+\item il nome del domino.
+\end{itemize*}
+l'ultima informazione è stata aggiunta di recente e non è prevista dallo
+standard POSIX, essa è accessibile, come mostrato in
+fig.~\ref{fig:sys_utsname}, solo definendo \macro{\_GNU\_SOURCE}.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{\textwidth}
+ \includestruct{listati/ustname.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{utsname}.}
+ \label{fig:sys_utsname}
+\end{figure}
+
+In generale si tenga presente che le dimensioni delle stringhe di una
+struttura \struct{utsname} non è specificata, e che esse sono sempre terminate
+con NUL; il manuale delle \acr{glibc} indica due diverse dimensioni,
+\const{\_UTSNAME\_LENGTH} per i campi standard e
+\const{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
+altri sistemi usano nomi diversi come \const{SYS\_NMLN} o \const{\_SYS\_NMLN}
+o \const{UTSLEN} che possono avere valori diversi.\footnote{nel caso di Linux
+ \func{uname} corrisponde in realtà a 3 system call diverse, le prime due
+ usano rispettivamente delle lunghezze delle stringhe 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.}
+
+
+\section{Opzioni e configurazione del sistema}
+\label{sec:sys_config}
+
+Come abbiamo accennato nella sezione precedente, non tutti i limiti che
+caratterizzano il sistema sono fissi, o perlomeno non lo sono in tutte le
+implementazioni. Finora abbiamo visto come si può fare per leggerli, ci manca
+di esaminare il meccanismo che permette, quando questi possono variare durante
+l'esecuzione del sistema, di modificarli.
+
+Inoltre, al di la di quelli che possono essere limiti caratteristici previsti
+da uno standard, ogni sistema può avere una sua serie di altri parametri di
+configurazione, che, non essendo mai fissi e variando da sistema a sistema,
+non sono stati inclusi nella standardizzazione della sezione precedente. Per
+questi occorre, oltre al meccanismo di impostazione, pure un meccanismo di
+lettura. Affronteremo questi argomenti in questa sezione, insieme alle
+funzioni che si usano per il controllo di altre caratteristiche generali del
+sistema, come quelle per la gestione dei filesystem e di utenti e gruppi.
+
+% TODO ristrutturare ?
+
+\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
+\label{sec:sys_sysctl}
+
+La funzione che permette la lettura ed l'impostazione dei parametri del
+sistema è \funcd{sysctl}; è una funzione derivata da BSD4.4, ma
+l'implementazione è specifica di Linux; il suo prototipo è:
+\begin{functions}
+\headdecl{unistd.h}
+\funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void
+ *newval, size\_t newlen)}
+
+Legge o scrive uno dei parametri di sistema.
+
+\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+ errore, nel qual caso \var{errno} assumerà uno dei valori:
+ \begin{errlist}
+ \item[\errcode{EPERM}] non si ha il permesso di accedere ad uno dei
+ componenti nel cammino specificato per il parametro, o di accedere al
+ parametro nella modalità scelta.
+ \item[\errcode{ENOTDIR}] non esiste un parametro corrispondente al nome
+ \param{name}.
+% \item[\errcode{EFAULT}] si è specificato \param{oldlenp} zero quando
+% \param{oldval} è non nullo.
+ \item[\errcode{EINVAL}] o si è specificato un valore non valido per il
+ parametro che si vuole impostare o lo spazio provvisto per il ritorno di un
+ valore non è delle giuste dimensioni.
+ \item[\errcode{ENOMEM}] talvolta viene usato più correttamente questo errore
+ quando non si è specificato sufficiente spazio per ricevere il valore di un
+ parametro.
+ \end{errlist}
+ ed inoltre \errval{EFAULT}.
+}
+\end{functions}
+
+I parametri a cui la funzione permettere di accedere sono organizzati in
+maniera gerarchica all'interno di un albero;\footnote{si tenga presente che
+ includendo solo \headfile{unistd.h}, saranno definiti solo i parametri
+ generici; dato che ce ne sono molti specifici dell'implementazione, nel caso
+ di Linux occorrerà includere anche i file \file{linux/unistd.h} e
+ \file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un
+cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene
+per la risoluzione di un \textit{pathname} (da cui l'uso alternativo del
+filesystem \file{/proc}, che vedremo dopo).
+
+Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che
+arriva ad identificare un parametro specifico è passato alla funzione
+attraverso l'array \param{name}, di lunghezza \param{nlen}, che contiene la
+sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un
+formato specifico che può essere un intero, una stringa o anche una struttura
+complessa, per questo motivo i valori vengono passati come puntatori
+\ctyp{void}.
+
+L'indirizzo a cui il valore corrente del parametro deve essere letto è
+specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da
+\param{oldlenp} (passato come puntatore per avere indietro la dimensione
+effettiva di quanto letto); il valore che si vuole impostare nel sistema è
+passato in \param{newval} e la sua dimensione in \param{newlen}.
+
+Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il
+valore letto restituito dalla funzione è quello precedente alla scrittura.
+
+I parametri accessibili attraverso questa funzione sono moltissimi, e possono
+essere trovati in \headfile{sysctl.h}, essi inoltre dipendono anche dallo
+stato corrente del kernel (ad esempio dai moduli che sono stati caricati nel
+sistema) e in genere i loro nomi possono variare da una versione di kernel
+all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl}
+quando esistono modalità alternative per ottenere le stesse informazioni.
+Alcuni esempi di parametri ottenibili 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}