A meta` del casino ...
[gapil.git] / system.tex
index 145b1a0d92fccb130c11a8e14f5c1523cd87bd1b..8ec0f3be166a68c7eb97d757d3654dda41d430d1 100644 (file)
@@ -8,32 +8,36 @@ stesso, quelle per il controllo dell'uso delle risorse da parte dei processi,
 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.
@@ -43,20 +47,23 @@ due tipi di funzionalit
 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
@@ -119,12 +126,19 @@ A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
   \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
@@ -139,25 +153,27 @@ implementazioni dello standard.
                                        \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
@@ -165,7 +181,17 @@ implementazioni dello standard.
   \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]
@@ -174,21 +200,14 @@ Oltre a questi valori lo standard ne definisce altri a riguardo
   \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.}
@@ -221,8 +240,10 @@ il valore attraverso la funzione \func{sysconf}, il cui prototipo 
 \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
@@ -238,18 +259,23 @@ Linux, e la corrispondente macro di \func{limits.h}, 
       \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.\\
@@ -268,10 +294,22 @@ Linux, e la corrispondente macro di \func{limits.h}, 
 
 
 
-\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} ...
 
 
 
@@ -280,9 +318,6 @@ La funzione \func{sysctl} ...
 
 La funzione \func{statfs} ...
 
-La funzione \func{pathconf} ...
-
-
 
 
 \section{Limitazione ed uso delle risorse}