+E si noti come la funzione in questo caso richieda un parametro 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,
+\func{fpathconf}, opera su un file descriptor invece che su un 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 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}
+
+Una altra funzione che si può utilizzare per raccogliere informazioni sia
+riguardo al sistema che al computer su cui esso sta girando è \func{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} viene settata a \macro{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 \file{sys/utsname.h} come:
+\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+struct utsname {
+ char sysname[_UTSNAME_LENGTH];
+ char nodename[_UTSNAME_LENGTH];
+ char release[_UTSNAME_LENGTH];
+ char version[_UTSNAME_LENGTH];
+ char machine[_UTSNAME_LENGTH];
+#ifdef _GNU_SOURCE
+ char domainname[_UTSNAME_DOMAIN_LENGTH];
+#endif
+};
+\end{lstlisting}
+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).
+
+
+\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 settaggio, 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.
+
+
+\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
+\label{sec:sys_sysctl}
+
+La funzione che permette la lettura ed il settaggio dei parametri del sistema
+è \func{sysctl}; è una funzione derivata da BSD4.4, ma l'implementazione è
+specifica di Linux; il suo prototipo è:
+\begin{functions}
+\headdecl{unistd.h}
+\headdecl{linux/unistd.h}
+\headdecl{linux/sysctl.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} viene settato ai valori:
+ \begin{errlist}
+ \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei
+ componenti nel cammino specificato per il parametro, o non ha il permesso
+ di accesso al parametro nella modalità scelta.
+ \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome
+ \param{name}.
+ \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
+ \param{oldval} è non nullo.
+ \item[\macro{EINVAL}] o si è specificato un valore non valido per il
+ parametro che si vuole settare o lo spazio provvisto per il ritorno di un
+ valore non è delle giuste dimensioni.
+ \item[\macro{ENOMEM}] talvolta viene usato più correttamente questo errore
+ quando non si è specificato sufficiente spazio per ricevere il valore di un
+ parametro.
+ \end{errlist}
+}
+\end{functions}
+
+I parametri a cui la funzione permettere di accedere sono organizzati in
+maniera gerarchica all'interno un albero; 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 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 chee può essere un intero, una stringa o anche una struttura
+complessa, per questo motivo il valori vengono passati come puntatori
+\type{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 settare 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 \file{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*}