quelle per la gestione dei tempi e degli errori.
-\section{La configurazione del sistema}
-\label{sec:sys_config}
-
-In questa sezione esamineremo le macro e le funzioni che permettono di
-conoscere e settare i parametri di configurazione del sistema, di ricavarme
-limiti e caratteristiche, e di controllare i filesystem disponibili, montarli
-e rimuoverli da programma.
+\section{La lettura delle caratteristiche del sistema}
+\label{sec:sys_characteristics}
+
+In questa sezione tratteremo le varie modalità con cui un programma può
+ottenere informazioni riguardo alle capacità del sistema. Ogni sistema infatti
+è contraddistinto da un gran numero di limiti e costanti che lo caratterizzano
+(i valori massimi e minimi delle variabili, o la lunghezza dei nomi dei file,
+per esempio), e che possono dipendere da fattori molteplici, come
+l'architettura hardware, l'implementazione del kernel e delle librerie, le
+opzioni di configurazione.
+
+La definizione di queste caratteristiche ed il tentativo di provvedere dei
+meccanismi generali che i programmi potessero usare per ricavarle è uno degli
+aspetti più complessi e controversi coi cui i vari standard si sono dovuti
+confrontare, spesso con risultati spesso tutt'altro che chiari. Proveremo
+comunque a dare una descrizione dei principali metodi previsti dai vari
+standard per ricavare sia le caratteristiche specifiche del sistema, che
+quelle dei file.
\subsection{Limiti e parametri di sistema}
\label{sec:sys_limits}
-In qualunque sistema sono presenti un gran numero di parametri e costanti il
-cui valore può essere definito dall'architettura dell'hardware,
-dall'implementazione del sistema, dalle opzioni con cui si sono compilati il
-kernel e le librerie o anche configurabili dall'amministratore all'avvio del
-sistema o durente le sue attività.
-
-Chiaramente per scrivere programmi portabili occorre poter determinare opzioni
-disponibili e caratteristiche del sistema (come i valori massimi e minimi dei
-vari tipi di variabili, o la presenza del supporto del supporto per
-l'operazione che interessa). Inoltre alcuni di questi limiti devono poter
-essere determinabili anche in corso di esecuzione del programma, per non dover
-ricompilare tutti i programmi quando si usa una nuova versione del kernel o si
-cambia una delle configurazioni del sistema. Per tutto questo sono necessari
-due tipi di funzionalità:
+Quando si devono determinare le le caratteristiche generali del sistema ci si
+trova di fronte a diverse possibilità; alcune di queste infatti possono
+dipendere dall'architettura dell'hardware, o dal sistema operativo, altre
+invece possono dipendere dalle opzioni con cui si è costruito il sistema (ad
+esempio da come si è compilato il kernel), o dalla configurazione del
+medesimo; per questo motivo in generale sono necessari due tipi diversi di
+funzionalità:
\begin{itemize*}
\item la possibilità di determinare limiti ed opzioni al momento della
compilazione.
La prima funzionalità si può ottenere includendo gli opportuni header file,
mentre per la seconda sono ovviamante necessarie delle funzioni; la situazione
è complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti
-sono fissi in una implementazione mentre possono variare in un altra.
-Quando i limiti sono fissi vengono definiti come macro nel file
-\file{limits.h}, se invece possono variare, il loro valore sarà ottenibile
-tramite la funzione \func{sysconf}.
-
-Lo standard ANSI C definisce dei limiti che sono tutti fissi e pertanto
-disponibili al momanto della compilazione; un elenco è riportato in
-\tabref{tab:sys_ansic_macro}, come ripreso da \file{limits.h}; come si vede
-per la maggior parte attengono alle dimensioni dei tipi dei dati interi, le
-informazioni analoghe per i dati in virgola mobile sono definite a parte e
-accessibili includendo \file{float.h}. Un'altra costante prevista dallo
-standard (l'unica che può non essere fissa e che pertanto non è definita in
-\file{limits.h}) è \macro{FOPEN\_MAX}, essa deve essere definita in
-\file{stdio.h} ed avere un valore minimo di 8.
+sono fissi in una 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 nel file \file{limits.h}, se invece
+possono variare, il loro valore sarà ottenibile tramite la funzione
+\func{sysconf}.
+
+Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo
+saranno sempre disponibili al momento della compilazione; un elenco, ripreso
+da \file{limits.h}, è riportato in \tabref{tab:sys_ansic_macro}; come si vede
+per la maggior parte di 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 \file{float.h}). Lo standard prevede anche un'altra
+costante, \macro{FOPEN\_MAX}, che può non essere fissa e che pertanto non è
+definita in \file{limits.h}, essa deve essere definita in \file{stdio.h} ed
+avere un valore minimo di 8.
\begin{table}[htb]
\centering
\label{tab:sys_isoc90_macro}
\end{table}
-Lo standard POSIX.1 definisce 33 diversi limiti o costanti, 15 delle quali,
-riportate in \secref{tab:sys_posix1_base}, devono essere sempre dichiarate,
-in quanto definiscono dei valori minimi che qualunque implementazione che sia
-conforme allo standard deve avere; molti di questi valori sono di scarsa
-utilità, essendo troppo ristretti ed ampiamente superati in tutte le
-implementazioni dello standard.
+Ovviamente le dimensioni dei dati sono solo una piccola parte delle
+caratteristiche del sistema; mancano completamente tutte quelle che dipendono
+dalla implementazione dello stesso; questo per i sistemi unix-like è stato
+definito in gran parte dallo standard POSIX.1 (che tratta anche i limiti delle
+caratteristiche dei file che vedremo in \secref{sec:sys_file_limits}).
+
+
+
+
+Lo standard POSIX.1 definisce 33 diversi limiti o costanti, 13 delle quali
+devono essere sempre dichiarate, in quanto definiscono dei valori minimi che
+qualunque implementazione che sia conforme allo standard deve avere. I loro
+valori sono stati riportati in \secref{tab:sys_posix1_base}.
\begin{table}[htb]
\centering
\func{exec}.\\
\macro{\_POSIX\_CHILD\_MAX} &6 & numero massimo di processi contemporanei
che un utente può eseguire.\\
- \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\
- \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input
- canonica del terminale\\
- \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale\\
- \macro{\_POSIX\_NGROUPS\_MAX}&0 & numero di gruppi supplementari per
- processo.\\
\macro{\_POSIX\_OPEN\_MAX} &16 & numero massimo di file che un processo
può mantenere aperti in contemporanea.\\
- \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
- \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
- pipe\\
- \macro{\_POSIX\_SSIZE\_MAX}&32767& valore massimo del tipo
- \type{ssize\_t}.\\
\macro{\_POSIX\_STREAM\_MAX}&8 & massimo numero di stream aperti per
processo in contemporanea.\\
\macro{\_POSIX\_TZNAME\_MAX}& & dimensione massima del nome di una
\texttt{timezone} (vedi ).\\
+ \macro{\_POSIX\_NGROUPS\_MAX}&0 & numero di gruppi supplementari per
+ processo (vedi
+ \secref{sec:proc_access_id}).\\
+ \macro{\_POSIX\_SSIZE\_MAX}&32767& valore massimo del tipo
+ \type{ssize\_t}.\\
+ \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
+ \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
+ \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
+ pipe\\
+ \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\
+ \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input
+ canonica del terminale\\
+ \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ del terminale\\
+ \hline
\hline
\end{tabular}
\caption{Costanti fisse, definite in \file{limits.h}, richieste
\label{tab:sys_posix1_base}
\end{table}
-Oltre a questi valori lo standard ne definisce altri a riguardo
+In genere questi valori sono di scarsa utilità, la loro unica utilità è quella
+di indicare un limite superiore che assicura la portabilità senza necessità di
+ulteriori controlli. Tuttavia molti di essi sono troppo ristretti, ed
+ampiamente superati in tutti i sistemi POSIX in uso oggigiorno.
+
+
+Per questo lo standard prevede anche che ogni implementazione definisca delle
+macro coi valori effettivi dei limiti generali del sistema, riportate in
+\ntab.
+
+
\begin{table}[htb]
\begin{tabular}[c]{|l|r|p{8cm}|}
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
- \hline
- \hline
\macro{\_POSIX\_AIO\_LISTIO\_MAX}& 2& \\
\macro{\_POSIX\_AIO\_MAX}& 1& \\
\macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
\macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
\macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
\macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
- \macro{\_POSIX\_NAME\_MAX}& 14& \\
- \macro{\_POSIX\_PATH\_MAX}& 256& \\
- \macro{\_POSIX\_PIPE\_BUF}& 512& \\
- \macro{\_POSIX\_SSIZE\_MAX}& 32767& \\
- \macro{\_POSIX\_STREAM\_MAX}&8 & \\
- \macro{\_POSIX\_TZNAME\_MAX}& 6& \\
- \hline
+ \hline
+ \hline
\end{tabular}
\caption{Macro definite in \file{limits.h} in conformità allo standard
POSIX.1.}
\end{prototype}
La funzione prende come argomento un intero che specifica quale dei limiti si
-vuole conoscere; uno specchietto contentente tutti quelli disponibili in
-Linux, e la corrispondente macro di \func{limits.h}, è riportato in \ntab.
+vuole conoscere; uno specchietto contentente i principali valori disponibili
+in Linux (l'elenco completo è contenuto in \file{bits/confname}, una lista più
+esaustiva si può trovare nel manuale delle \acr{glibc}), e la corrispondente
+macro di sistema, è riportato in \ntab.
\begin{table}[htb]
\centering
\texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}&
Il numero massimo di processi contemporanei che un utente può
eseguire.\\
- \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
- Il numero di \textit{clock tick} al secondo, cioè la frequenza delle
- interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\
+ \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
+ Il numero massimo di file che un processo può mantenere aperti in
+ contemporanea.\\
\texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
Il massimo numero di stream che un processo può mantenere aperti in
contemporanea. Questo liminte previsto anche dallo standard ANSI C, che
specifica la macro {FOPEN\_MAX}.\\
\texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\
- \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
- Il numero massimo di file che un processo può mantenere aperti in
- contemporanea.\\
+ \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
+ Massimo numero di gruppi supplementari che può avere un processo (vedi
+ \secref{sec:proc_access_id}).\\
+ \texttt{\_SC\_SSIZE\_MAX}&\macro{SSIZE\_MAX}&
+ valore massimo del tipo di dato \type{ssize\_t}.\\
+ \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
+ Il numero di \textit{clock tick} al secondo, cioè la frequenza delle
+ interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\
\texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
Indica se è supportato il \textit{job conotrol} (vedi
\secref{sec:sess_xxx}) in stile POSIX.\\
-\subsection{Opzioni e configurazione del sistema}
-\label{sec:sys_sys_config}
+\subsection{I limiti dei file}
+\label{sec:sys_file_limits}
+
+La funzione \func{statfs} ...
+La funzione \func{pathconf} ...
+
+
+
+
+\section{Opzioni e configurazione del sistema}
+\label{sec:sys_config}
+
+\subsection{La funzione \func{sysctl}}
+\label{sec:sys_sysctl}
+
-La funzione \func{sysctl} ...
La funzione \func{statfs} ...
-La funzione \func{pathconf} ...
-
-
\section{Limitazione ed uso delle risorse}