In questo capitolo tratteremo varie interfacce che attengono agli aspetti più
generali del sistema, come quelle per la gestione di parametri e
-configurazione, quelle per la lettura dei limiti e delle carattistiche dello
+configurazione, quelle per la lettura dei limiti e delle caratteristiche dello
stesso, quelle per il controllo dell'uso delle risorse da parte dei processi,
quelle per la gestione dei tempi e degli errori.
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
+è contraddistinto da un gran numero di limiti e costanti che lo
+caratterizzano, e che possono dipendere da fattori molteplici, come
l'architettura hardware, l'implementazione del kernel e delle librerie, le
opzioni di configurazione.
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à:
+dipendere dall'architettura dell'hardware (come le dimensioni dei tipi
+interi), o dal sistema operativo (come la presenza o meno dei \textit{saved
+ id}) , 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.
\end{itemize*}
La prima funzionalità si può ottenere includendo gli opportuni header file,
-mentre per la seconda sono ovviamante necessarie delle funzioni; la situazione
+mentre per la seconda sono ovviamente 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. 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}.
+\func{sysconf} (che esamineremo in \secref{sec:sys_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
+da \file{limits.h}, è riportato in \tabref{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 \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
+definita in \file{limits.h}; essa deve essere definita in \file{stdio.h} ed
avere un valore minimo di 8.
\begin{table}[htb]
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{LLONG\_MAX}& 9223372036854775807&massimo di \type{long long}\\
- \macro{LLONG\_MIN}&-9223372036854775808&minimo di \type{long long}\\
+ \macro{LLONG\_MAX}& 9223372036854775807& massimo di \type{long long}\\
+ \macro{LLONG\_MIN}&-9223372036854775808& minimo di \type{long long}\\
\macro{ULLONG\_MAX}&18446744073709551615&
massimo di \type{unsigned long long}\\
\hline
\label{tab:sys_isoc90_macro}
\end{table}
-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}).
+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; 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}.
+Purtroppo la sezione dello standard che tratta questi argomenti è una delle
+meno chiare\footnote{tanto che Stevens, in \cite{APUE}, la porta come esempio
+ di ``standardese''.}, ad esempio lo standard prevede che ci siano 13 macro
+che descrivono le caratteristiche del sistema (7 per le caratteristiche
+generiche, riportate in \tabref{tab:sys_generic_macro}, e 6 per le
+caratteristiche dei file, riportate in \tabref{tab:sys_file_macro}).
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{8cm}|}
+ \hline
+ \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \macro{ARG\_MAX} &131072& dimensione massima degli argomenti
+ passati ad una funzione della famiglia
+ \func{exec}.\\
+ \macro{CHILD\_MAX} & 999& numero massimo di processi contemporanei
+ che un utente può eseguire.\\
+ \macro{OPEN\_MAX} & 256& numero massimo di file che un processo
+ può mantenere aperti in contemporanea.\\
+ \macro{STREAM\_MAX}& 8& massimo numero di stream aperti per
+ processo in contemporanea.\\
+ \macro{TZNAME\_MAX}& 6& dimensione massima del nome di una
+ \texttt{timezone} (vedi ).\\
+ \macro{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
+ processo (vedi \secref{sec:proc_access_id}).\\
+ \macro{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
+ \hline
+ \hline
+ \end{tabular}
+ \caption{Macro .}
+ \label{tab:sys_generic_macro}
+\end{table}
+Lo standard prevede che queste macro devono essere definite in \file{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à in Linux queste sono comunque
+definite e spesso indicano un limite generico, che può però essere superato
+dal valore restituito da \func{sysconf}.
-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}.
+A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di
+altre macro (che iniziano sempre con \code{\_POSIX\_}) che definiscono i
+valori minimi le stesse caratteristiche devono avere, perché una
+implementazione possa dichiararsi conforme allo standard; detti valori sono
+riportati in \tabref{tab:sys_posix1_base}.
\begin{table}[htb]
\centering
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{\_POSIX\_ARG\_MAX} &4096 & dimensione massima degli argomenti
- passati ad una funzione della famiglia
- \func{exec}.\\
- \macro{\_POSIX\_CHILD\_MAX} &6 & numero massimo di processi contemporanei
- che un utente può eseguire.\\
- \macro{\_POSIX\_OPEN\_MAX} &16 & numero massimo di file che un processo
- può mantenere aperti in contemporanea.\\
- \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\\
+ \macro{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
+ passati ad una funzione della famiglia
+ \func{exec}.\\
+ \macro{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
+ contemporanei che un utente può
+ eseguire.\\
+ \macro{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
+ può mantenere aperti in
+ contemporanea.\\
+ \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\_AIO\_LISTIO\_MAX}&2& \\
+ \macro{\_POSIX\_AIO\_MAX} & 1& \\
\hline
\hline
\end{tabular}
- \caption{Costanti fisse, definite in \file{limits.h}, richieste
- obbligatoriamente allo standard POSIX.1.}
- \label{tab:sys_posix1_base}
+ \caption{Macro dei valori minimi delle caratteristiche generali del sistema
+ per la conformità allo standard POSIX.1.}
+ \label{tab:sys_posix1_general}
\end{table}
In genere questi valori sono di scarsa utilità, la loro unica utilità è quella
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.
-
-
-
+Oltre ai precedenti valori, previsti obbligatoriamente, lo standard POSIX
\begin{table}[htb]
\centering
\begin{tabular}[c]{|l|r|p{8cm}|}
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
- \macro{\_POSIX\_AIO\_LISTIO\_MAX}& 2& \\
- \macro{\_POSIX\_AIO\_MAX}& 1& \\
- \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
+ \hline
+ \hline
\macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
\macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
\macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
- \hline
+ \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
\hline
\end{tabular}
\caption{Macro definite in \file{limits.h} in conformità allo standard
POSIX.1.}
- \label{tab:sys_posix1_macro}
+ \label{tab:sys_posix1_other}
\end{table}
-Lo standard ANSI C definisce dei limiti solo sulle dimensioni dei tipi dei
-dati, che sono ovviamente fissi, gli standard POSIX.1 e POSIX.2 definiscono
-molti altri limiti attinenti a varie caratteristiche del sistema (come il
-numero massimo di figli, la lunghezza di un pathname, ecc.) che possono essere
-fissi o meno: quando 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}.
+Oltre a questi
+
\subsection{La funzione \func{sysconf}}
\label{sec:sys_sysconf}
Come accennato in \secref{sec:sys_limits} quando uno dei limiti o delle
-carateristiche del sistema può variare, per evitare di dover ricompilare un
+caratteristiche del sistema può variare, per evitare di dover ricompilare un
programma tutte le volte che si cambiano le opzioni con cui è compilato il
kernel, o alcuni dei parametri modificabili a run time, è necessario ottenerne
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 i principali valori disponibili
+vuole conoscere; uno specchietto contenente 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.
+macro di sistema, è riportato in \tabref{tab:sys_sysconf_par}.
\begin{table}[htb]
\centering
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
+ contemporanea. Questo limite 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 ).\\
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
+ Indica se è supportato il \textit{job control} (vedi
\secref{sec:sess_xxx}) in stile POSIX.\\
\texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
Indica se il sistema supporta i \textit{saved id} (vedi
\label{tab:sys_sysconf_par}
\end{table}
+In generale ogni valore 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}, ed il valore di \param{name} si ottiene appendendo
+un \code{\_SC\_} per o primi due o sostituendolo a \code{\_POSIX\_} per gli
+altri due. Lo stesso dicasi per le macro relative alle caratteristiche dei
+file.
\subsection{I limiti dei file}
\label{sec:sys_file_limits}
-La funzione \func{statfs} ...
-La funzione \func{pathconf} ...
+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 \tabref{tab:sys_file_macro}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{8cm}|}
+ \hline
+ \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
+ \macro{PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
+ \macro{PIPE\_BUF}& 512 & byte scrivibili atomicamente in una pipe\\
+ \macro{LINK\_MAX} &8 & numero massimo di link a un file\\
+ \macro{MAX\_CANON}&255 & spazio disponibile nella coda di input
+ canonica del terminale\\
+ \macro{MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ del terminale\\
+ \hline
+ \end{tabular}
+ \caption{Macro per i limiti sulle caratteristiche dei file.}
+ \label{tab:sys_file_macro}
+\end{table}
+
+Come per i limiti di sistema POSIX.1 detta una serie di valori minimi per
+queste caratteristiche, che ogni sistema che vuole essere conforme deve
+rispettare; le relative macro sono riportate in \tabref{tab:sys_posix1_file},
+e vale lo stesso discorso fatto per le analoghe di
+\tabref{tab:sys_posix1_general}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{8cm}|}
+ \hline
+ \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \hline
+ \hline
+ \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \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\_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\_MQ\_OPEN\_MAX}& 8& \\
+ \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
+ \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
+ \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
+ \hline
+ \end{tabular}
+ \caption{Macro dei valori minimi delle caratteristiche dei file per la
+ conformità allo standard POSIX.1.}
+ \label{tab:sys_posix1_file}
+\end{table}
+\subsection{La funzione \func{pathconf}}
+\label{sec:sys_pathconf}
+
\section{Opzioni e configurazione del sistema}
\label{sec:sys_sysctl}
-
-
-
\subsection{La configurazione dei filesystem}
\label{sec:sys_file_config}
-La funzione \func{statfs} ...
+\subsection{La funzione \func{statfs}}
+\label{sec:sys_file_stafs}
\section{Limitazione ed uso delle risorse}
\label{sec:sys_res_limits}
-In questa sezione esamimeremo le funzioni che permettono di esaminare e
+In questa sezione esamineremo le funzioni che permettono di esaminare e
controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
sul loro utilizzo.
nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
costanti numeriche che identificano i vari errori; essi iniziano tutti per
\macro{E} e si possono considerare come nomi riservati. In seguito faremo
-sempre rifermento a tali valori, quando descriveremo i possibili errori
+sempre riferimento a tali valori, quando descriveremo i possibili errori
restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
codice relativo ad un valore numerico con l'opzione \cmd{-l}.
riportare in opportuni messaggi le condizioni di errore verificatesi. La
prima funzione che si può usare per ricavare i messaggi di errore è
\func{strerror}, il cui prototipo è:
-\begin{prototype}{string.h}{char * strerror(int errnum)}
+\begin{prototype}{string.h}{char *strerror(int errnum)}
Ritorna una stringa (statica) che descrive l'errore il cui codice è passato
come parametro.
\end{prototype}
provvista\footnote{questa funzione è una estensione GNU, non fa parte dello
standard POSIX} una versione apposita:
\begin{prototype}{string.h}
-{char * strerror\_r(int errnum, char * buff, size\_t size)}
+{char *strerror\_r(int errnum, char *buff, size\_t size)}
Analoga a \func{strerror} ma ritorna il messaggio in un buffer
specificato da \param{buff} di lunghezza massima (compreso il terminatore)
\param{size}.