1 \chapter{La gestione del sistema, delle risorse, e degli errori}
4 In questo capitolo tratteremo varie interfacce che attengono agli aspetti più
5 generali del sistema, come quelle per la gestione di parametri e
6 configurazione, quelle per la lettura dei limiti e delle caratteristiche dello
7 stesso, quelle per il controllo dell'uso delle risorse da parte dei processi,
8 quelle per la gestione dei tempi e degli errori.
11 \section{La lettura delle caratteristiche del sistema}
12 \label{sec:sys_characteristics}
14 In questa sezione tratteremo le varie modalità con cui un programma può
15 ottenere informazioni riguardo alle capacità del sistema. Ogni sistema infatti
16 è contraddistinto da un gran numero di limiti e costanti che lo
17 caratterizzano, e che possono dipendere da fattori molteplici, come
18 l'architettura hardware, l'implementazione del kernel e delle librerie, le
19 opzioni di configurazione.
21 La definizione di queste caratteristiche ed il tentativo di provvedere dei
22 meccanismi generali che i programmi potessero usare per ricavarle è uno degli
23 aspetti più complessi e controversi coi cui i vari standard si sono dovuti
24 confrontare, spesso con risultati spesso tutt'altro che chiari. Proveremo
25 comunque a dare una descrizione dei principali metodi previsti dai vari
26 standard per ricavare sia le caratteristiche specifiche del sistema, che
30 \subsection{Limiti e parametri di sistema}
31 \label{sec:sys_limits}
33 Quando si devono determinare le le caratteristiche generali del sistema ci si
34 trova di fronte a diverse possibilità; alcune di queste infatti possono
35 dipendere dall'architettura dell'hardware (come le dimensioni dei tipi
36 interi), o dal sistema operativo (come la presenza o meno dei \textit{saved
37 id}) , altre invece possono dipendere dalle opzioni con cui si è costruito
38 il sistema (ad esempio da come si è compilato il kernel), o dalla
39 configurazione del medesimo; per questo motivo in generale sono necessari due
40 tipi diversi di funzionalità:
42 \item la possibilità di determinare limiti ed opzioni al momento della
44 \item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
47 La prima funzionalità si può ottenere includendo gli opportuni header file,
48 mentre per la seconda sono ovviamente necessarie delle funzioni; la situazione
49 è complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti
50 sono fissi in una implementazione mentre possono variare in un altra. Tutto
51 questo crea una ambiguità che non è sempre possibile risolvere in maniera
52 chiara; in generale quello che succede è che quando i limiti del sistema sono
53 fissi essi vengono definiti come macro nel file \file{limits.h}, se invece
54 possono variare, il loro valore sarà ottenibile tramite la funzione
55 \func{sysconf} (che esamineremo in \secref{sec:sys_sysconf}).
57 Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo
58 saranno sempre disponibili al momento della compilazione; un elenco, ripreso
59 da \file{limits.h}, è riportato in \tabref{tab:sys_ansic_macro}. Come si può
60 vedere per la maggior parte questi limiti attengono alle dimensioni dei dati
61 interi, che sono in genere fissati dall'architettura hardware (le analoghe
62 informazioni per i dati in virgola mobile sono definite a parte, ed
63 accessibili includendo \file{float.h}). Lo standard prevede anche un'altra
64 costante, \macro{FOPEN\_MAX}, che può non essere fissa e che pertanto non è
65 definita in \file{limits.h}; essa deve essere definita in \file{stdio.h} ed
66 avere un valore minimo di 8.
71 \begin{tabular}[c]{|l|r|l|}
73 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
76 \macro{MB\_LEN\_MAX}& 16 & massima dimensione di un
78 \macro{CHAR\_BIT} & 8 & bit di \type{char}\\
79 \macro{UCHAR\_MAX}& 255 & massimo di \type{unsigned char}\\
80 \macro{SCHAR\_MIN}& -128 & minimo di \type{signed char}\\
81 \macro{SCHAR\_MAX}& 127 & massimo di \type{signed char}\\
82 \macro{CHAR\_MIN} &\footnotemark& minimo di \type{char}\\
83 \macro{CHAR\_MAX} &\footnotemark& massimo di \type{char}\\
84 \macro{SHRT\_MIN} & -32768 & minimo di \type{short}\\
85 \macro{SHRT\_MAX} & 32767 & massimo di \type{short}\\
86 \macro{USHRT\_MAX}& 65535 & massimo di \type{unsigned short}\\
87 \macro{INT\_MAX} & 2147483647 & minimo di \type{int}\\
88 \macro{INT\_MIN} &-2147483648 & minimo di \type{int}\\
89 \macro{UINT\_MAX} & 4294967295 & massimo di \type{unsigned int}\\
90 \macro{LONG\_MAX} & 2147483647 & massimo di \type{long}\\
91 \macro{LONG\_MIN} &-2147483648 & minimo di \type{long}\\
92 \macro{ULONG\_MAX}& 4294967295 & massimo di \type{unsigned long}\\
95 \caption{Macro definite in \file{limits.h} in conformità allo standard
97 \label{tab:sys_ansic_macro}
100 \footnotetext[1]{il valore può essere 0 o \macro{SCHAR\_MIN} a seconda che il
101 sistema usi caratteri con segno o meno.}
103 \footnotetext[2]{il valore può essere \macro{UCHAR\_MAX} o \macro{SCHAR\_MAX}
104 a seconda che il sistema usi caratteri con segno o meno.}
106 A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
107 \type{long long} introdotto con il nuovo standard, i relativi valori sono in
108 \tabref{tab:sys_isoc90_macro}.
113 \begin{tabular}[c]{|l|r|l|}
115 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
118 \macro{LLONG\_MAX}& 9223372036854775807& massimo di \type{long long}\\
119 \macro{LLONG\_MIN}&-9223372036854775808& minimo di \type{long long}\\
120 \macro{ULLONG\_MAX}&18446744073709551615&
121 massimo di \type{unsigned long long}\\
124 \caption{Macro definite in \file{limits.h} in conformità allo standard
126 \label{tab:sys_isoc90_macro}
129 Ovviamente le dimensioni dei vari tipi di dati sono solo una piccola parte
130 delle caratteristiche del sistema; mancano completamente tutte quelle che
131 dipendono dalla implementazione dello stesso; questo per i sistemi unix-like è
132 stato definito in gran parte dallo standard POSIX.1, che tratta anche i limiti
133 delle caratteristiche dei file che vedremo in \secref{sec:sys_file_limits}.
135 Purtroppo la sezione dello standard che tratta questi argomenti è una delle
136 meno chiare\footnote{tanto che Stevens, in \cite{APUE}, la porta come esempio
137 di ``standardese''.}, ad esempio lo standard prevede che ci siano 13 macro
138 che descrivono le caratteristiche del sistema (7 per le caratteristiche
139 generiche, riportate in \tabref{tab:sys_generic_macro}, e 6 per le
140 caratteristiche dei file, riportate in \tabref{tab:sys_file_macro}).
145 \begin{tabular}[c]{|l|r|p{8cm}|}
147 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
150 \macro{ARG\_MAX} &131072& dimensione massima degli argomenti
151 passati ad una funzione della famiglia
153 \macro{CHILD\_MAX} & 999& numero massimo di processi contemporanei
154 che un utente può eseguire.\\
155 \macro{OPEN\_MAX} & 256& numero massimo di file che un processo
156 può mantenere aperti in contemporanea.\\
157 \macro{STREAM\_MAX}& 8& massimo numero di stream aperti per
158 processo in contemporanea.\\
159 \macro{TZNAME\_MAX}& 6& dimensione massima del nome di una
160 \texttt{timezone} (vedi ).\\
161 \macro{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
162 processo (vedi \secref{sec:proc_access_id}).\\
163 \macro{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
168 \label{tab:sys_generic_macro}
171 Lo standard prevede che queste macro devono essere definite in \file{limits.h}
172 quando i valori a cui fanno riferimento sono fissi, e altrimenti devono essere
173 lasciate indefinite, ed i loro valori dei limiti devono essere accessibili
174 solo attraverso \func{sysconf}. Si tenga presente poi che alcuni di questi
175 limiti possono assumere valori molto elevati (come \macro{CHILD\_MAX}), e non
176 è pertanto il caso di utilizzarli per allocare staticamente della memoria.
178 A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di
179 altre macro (che iniziano sempre con \code{\_POSIX\_}) che definiscono i
180 valori minimi le stesse caratteristiche devono avere, perché una
181 implementazione possa dichiararsi conforme allo standard; detti valori sono
182 riportati in \tabref{tab:sys_posix1_base}.
187 \begin{tabular}[c]{|l|r|p{8cm}|}
189 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
192 \macro{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
193 passati ad una funzione della famiglia
195 \macro{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
196 contemporanei che un utente può
198 \macro{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
199 può mantenere aperti in
201 \macro{\_POSIX\_STREAM\_MAX} & 8& massimo numero di stream aperti per
202 processo in contemporanea.\\
203 \macro{\_POSIX\_TZNAME\_MAX} & & dimensione massima del nome di una
204 \texttt{timezone} (vedi ).\\
205 \macro{\_POSIX\_NGROUPS\_MAX}& 0& numero di gruppi supplementari per
207 \secref{sec:proc_access_id}).\\
208 \macro{\_POSIX\_SSIZE\_MAX} &32767& valore massimo del tipo
210 \macro{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
211 \macro{\_POSIX\_AIO\_MAX} & 1& \\
215 \caption{Macro dei valori minimi delle caratteristiche generali del sistema
216 per la conformità allo standard POSIX.1.}
217 \label{tab:sys_posix1_general}
220 In genere questi valori non servono a molto, la loro unica utilità è quella
221 di indicare un limite superiore che assicura la portabilità senza necessità di
222 ulteriori controlli. Tuttavia molti di essi sono troppo ristretti, ed
223 ampiamente superati in tutti i sistemi POSIX in uso oggigiorno. Per questo è
224 sempre meglio usare i valori provvisti da \func{sysconf}.
229 \begin{tabular}[c]{|l|p{8cm}|}
231 \textbf{Macro}&\textbf{Significato}\\
234 \macro{\_POSIX\_JOB\_CONTROL}& il sistema supporta il
235 \textit{job control} (vedi
236 \secref{sec:sess_xxx}).\\
237 \macro{\_POSIX\_SAVED\_IDS} & il sistema supporta i \textit{saved id}
238 (vedi \secref{sec:proc_access_id}).
239 per il controllo di accesso dei processi\\
240 \macro{\_POSIX\_VERSION} & fornisce la versione dello standard POSIX.1
241 supportata nel formato YYYYMML (ad esempio
245 \caption{Alcune macro definite in \file{limits.h} in conformità allo standard
247 \label{tab:sys_posix1_other}
250 Oltre ai precedenti valori (e a quelli elencati in
251 \tabref{tab:sys_posix1_file}), che devono essere obbligatoriamente definiti,
252 lo standard POSIX.1 ne prevede parecchi altri; in Linux la lista completa si
253 può ricavare dall'header file \file{bits/posix1\_lim.h} (da non usare mai
254 direttamente, è incluso automaticamente all'interno di \file{limits.h}); di
255 questi vale la pena menzionare quelli di uso più comune, riportati in
256 \tabref{tab:sys_posix1_other}, che permettono di ricavare alcune
257 caratteristiche del sistema (come il supporto del \textit{job control} o dei
260 Oltre allo standard POSIX.1, anche lo standard POSIX.2 definisce una serie di
261 altre macro. Siccome queste sono principalmente attinenti a limiti relativi
262 alle applicazioni di sistema presenti (come quelli su alcuni parametri delle
263 espressioni regolari o del comando \cmd{bc}), non li tratteremo
264 esplicitamente, se ne trova una menzione completa nell'header file
265 \file{bits/posix2\_lim.h}, e alcuni di loro sono descritti nella man page di
266 \func{sysconf} e nel manuale delle \acr{glibc}.
269 \subsection{La funzione \func{sysconf}}
270 \label{sec:sys_sysconf}
272 Come accennato in \secref{sec:sys_limits} quando uno dei limiti o delle
273 caratteristiche del sistema può variare, è necessario ottenerne il valore
274 attraverso la funzione \func{sysconf}, per non dover essere costretti a
275 ricompilare un programma tutte le volte che si cambiano le opzioni con cui è
276 compilato il kernel, o alcuni dei parametri modificabili a run time. Il suo
278 \begin{prototype}{unistd.h}{long sysconf(int name)}
279 Restituisce il valore del parametro di sistema \param{name}.
281 \bodydesc{La funzione restituisce indietro il valore del parametro
282 richiesto, o 1 se si tratta di un'opzione disponibile, 0 se l'opzione non
283 è disponibile e -1 in caso di errore (ma \var{errno} non viene settata).}
286 La funzione prende come argomento un intero che specifica quale dei limiti si
287 vuole conoscere; uno specchietto contenente i principali valori disponibili in
288 Linux è riportato in \tabref{tab:sys_sysconf_par}; l'elenco completo è
289 contenuto in \file{bits/confname}, ed una lista più esaustiva, con le relative
290 spiegazioni, si può trovare nel manuale delle \acr{glibc}.
295 \begin{tabular}[c]{|l|l|p{9cm}|}
297 \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
300 \texttt{\_SC\_ARG\_MAX} &\macro{ARG\_MAX}&
301 La dimensione massima degli argomenti passati ad una funzione
302 della famiglia \func{exec}.\\
303 \texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}&
304 Il numero massimo di processi contemporanei che un utente può
306 \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
307 Il numero massimo di file che un processo può mantenere aperti in
309 \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
310 Il massimo numero di stream che un processo può mantenere aperti in
311 contemporanea. Questo limite previsto anche dallo standard ANSI C, che
312 specifica la macro {FOPEN\_MAX}.\\
313 \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
314 La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\
315 \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
316 Massimo numero di gruppi supplementari che può avere un processo (vedi
317 \secref{sec:proc_access_id}).\\
318 \texttt{\_SC\_SSIZE\_MAX}&\macro{SSIZE\_MAX}&
319 valore massimo del tipo di dato \type{ssize\_t}.\\
320 \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
321 Il numero di \textit{clock tick} al secondo, cioè la frequenza delle
322 interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\
323 \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
324 Indica se è supportato il \textit{job control} (vedi
325 \secref{sec:sess_xxx}) in stile POSIX.\\
326 \texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
327 Indica se il sistema supporta i \textit{saved id} (vedi
328 \secref{sec:proc_access_id}).\\
329 \texttt{\_SC\_VERSION}& \macro{\_POSIX\_VERSION} &
330 Indica il mese e l'anno di approvazione della revisione dello standard
331 POSIX.1 a cui il sistema fa riferimento, nel formato YYYYMML, la
332 revisione più recente è 199009L, che indica il Settembre 1990.\\
335 \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
336 \label{tab:sys_sysconf_par}
339 In generale ogni limite o caratteristica del sistema per cui è definita una
340 macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può
341 essere ottenuto attraverso una chiamata a \func{sysconf}. Il valore si otterrà
342 speficando come valore del parametro \param{name} il nome ottenuto aggiungendo
343 \code{\_SC\_} ai nomi delle macro definite dai primi due, o sostituendolo a
344 \code{\_POSIX\_} per le macro definite dagli gli altri due.
346 In generale si dovrebbe fare uso di \func{sysconf} solo quando la relativa
347 macro non è definita, quindi con un codice analogo al seguente:
348 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
354 int val = sysconf(_SC_CHILD_MAX);
356 perror("fatal error");
362 ma in realtà in Linux queste macro sono comunque definite e indicando un
363 limite generico, per cui è sempre meglio usare i valori restituiti da
367 \subsection{I limiti dei file}
368 \label{sec:sys_file_limits}
370 Come per le caratteristiche generali del sistema anche per i file esistono una
371 serie di limiti (come la lunghezza del nome del file o il numero massimo di
372 link) che dipendono sia dall'implementazione che dal filesystem in uso; anche
373 in questo caso lo standard prevede alcune macro che ne specificano il valore,
374 riportate in \tabref{tab:sys_file_macro}.
379 \begin{tabular}[c]{|l|r|p{8cm}|}
381 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
384 \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
385 \macro{PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
386 \macro{PIPE\_BUF}& 512 & byte scrivibili atomicamente in una pipe\\
387 \macro{LINK\_MAX} &8 & numero massimo di link a un file\\
388 \macro{MAX\_CANON}&255 & spazio disponibile nella coda di input
389 canonica del terminale\\
390 \macro{MAX\_INPUT}&255 & spazio disponibile nella coda di input
394 \caption{Macro per i limiti sulle caratteristiche dei file.}
395 \label{tab:sys_file_macro}
398 Come per i limiti di sistema POSIX.1 detta una serie di valori minimi per
399 queste caratteristiche, che ogni sistema che vuole essere conforme deve
400 rispettare; le relative macro sono riportate in \tabref{tab:sys_posix1_file},
401 e per esse vale lo stesso discorso fatto per le analoghe di
402 \tabref{tab:sys_posix1_general}.
407 \begin{tabular}[c]{|l|r|p{8cm}|}
409 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
412 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
413 \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\
414 \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input
415 canonica del terminale\\
416 \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
418 \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
419 \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
420 \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
422 \macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
423 \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
424 \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
425 \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
428 \caption{Macro dei valori minimi delle caratteristiche dei file per la
429 conformità allo standard POSIX.1.}
430 \label{tab:sys_posix1_file}
433 Tutti questi limiti sono definiti in \file{limits.h}; come nel caso precedente
434 il loro uso è di scarsa utilità in quanto ampiamente superati in tutte le
435 implementazioni moderne.
438 \subsection{La funzione \func{pathconf}}
439 \label{sec:sys_pathconf}
441 In generale i limiti per i file sono molto più soggetti ad essere variabili
442 rispetto ai precedenti limiti generali del sistema; ad esempio parametri come
443 la lunghezza del nome del file o il numero di link possono variare da
444 filesystem a filesystem; per questo motivo questi limiti devono essere sempre
445 controllati con la funzione \func{pathconf}, il cui prototipo è:
446 \begin{prototype}{unistd.h}{long pathconf(char *path, int name)}
447 Restituisce il valore del parametro \param{name} per il file \param{path}.
449 \bodydesc{La funzione restituisce indietro il valore del parametro
450 richiesto, o -1 in caso di errore (ed \var{errno} viene settata ad uno
451 degli errori possibili relativi all'accesso a \param{path}).}
454 E si noti come la funzione in questo caso richieda un parametro che specifichi
455 a quale file si fa riferimento, dato che il valore del limite cercato può
456 variare a seconda del filesystem. Una seconda versione della funzione,
457 \func{fpathconf}, opera su un file descriptor invece che su un pathname, il
459 \begin{prototype}{unistd.h}{long fpathconf(int fd, int name)}
460 Restituisce il valore del parametro \param{name} per il file \param{fd}.
462 \bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor
463 invece di un pathname; pertanto gli errori restituiti cambiano di
466 \noindent ed il suo comportamento è identico a quello di \func{fpathconf}.
469 \subsection{La funzione \func{uname}}
470 \label{sec:sys_uname}
472 Una altra funzione che si può utilizzare per raccogliere informazioni riguardo
473 al sistema ed al computer su cui esso sta girando è \func{uname}, il suo
475 \begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)}
476 Restituisce informazioni sul sistema nella struttura \param{info}.
478 \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
479 fallimento, nel qual caso \var{errno} viene settata a \macro{EFAULT}.}
481 \noindent la struttura è anch'essa definita in \file{sys/utsname.h} come:
482 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
484 char sysname[_UTSNAME_LENGTH];
485 char nodename[_UTSNAME_LENGTH];
486 char release[_UTSNAME_LENGTH];
487 char version[_UTSNAME_LENGTH];
488 char machine[_UTSNAME_LENGTH];
490 char domainname[_UTSNAME_DOMAIN_LENGTH];
494 ed i suoi menbri indicano rispettivamente:
496 \item il nome del systema operativo;
497 \item il nome della release del kernel;
498 \item il nome della versione del kernel;
499 \item il tipo di macchina in uso;
500 \item il nome della stazione;
501 \item il nome del domino (è una estensione recente).
506 \section{Opzioni e configurazione del sistema}
507 \label{sec:sys_config}
509 In questa sezione prenderemo in esame le funzioni per leggere e settare i vari
510 parametri di configurazione del sistema.
513 \subsection{La funzione \func{sysctl}}
514 \label{sec:sys_sysctl}
516 \subsection{Il filesystem \file{/proc}}
517 \label{sec:sys_proc_files}
520 \subsection{La configurazione dei filesystem}
521 \label{sec:sys_file_config}
523 \subsection{La funzione \func{statfs}}
524 \label{sec:sys_file_stafs}
528 \section{Limitazione ed uso delle risorse}
529 \label{sec:sys_res_limits}
531 In questa sezione esamineremo le funzioni che permettono di esaminare e
532 controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
533 utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
538 \subsection{L'uso delle risorse}
539 \label{sec:sys_resource_use}
542 \subsection{Limiti sulle risorse}
543 \label{sec:sys_resource_limit}
546 \subsection{Le risorse di memoria}
547 \label{sec:sys_memory_res}
550 \subsection{Le risorse di processore}
551 \label{sec:sys_cpu_load}
558 \begin{minipage}[c]{15cm}
559 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
561 struct timeval ru_utime; /* user time used */
562 struct timeval ru_stime; /* system time used */
563 long ru_maxrss; /* maximum resident set size */
564 long ru_ixrss; /* integral shared memory size */
565 long ru_idrss; /* integral unshared data size */
566 long ru_isrss; /* integral unshared stack size */
567 long ru_minflt; /* page reclaims */
568 long ru_majflt; /* page faults */
569 long ru_nswap; /* swaps */
570 long ru_inblock; /* block input operations */
571 long ru_oublock; /* block output operations */
572 long ru_msgsnd; /* messages sent */
573 long ru_msgrcv; /* messages received */
574 long ru_nsignals; ; /* signals received */
575 long ru_nvcsw; /* voluntary context switches */
576 long ru_nivcsw; /* involuntary context switches */
581 \caption{La struttura \var{rusage} per la lettura delle informazioni dei
582 delle risorse usate da un processo.}
583 \label{fig:sys_rusage_struct}
589 \var{tms\_utime}, \var{tms\_stime}, \var{tms\_cutime}, \var{tms\_uetime}
593 \section{La gestione dei tempi del sistema}
596 In questa sezione tratteremo le varie funzioni per la gestione delle
597 date e del tempo in un sistema unix-like, e quelle per convertire i vari
598 tempi nelle differenti rappresentazioni che vengono utilizzate.
601 \subsection{La misura del tempo in unix}
602 \label{sec:sys_unix_time}
604 Storicamente i sistemi unix-like hanno sempre mantenuto due distinti
605 valori per i tempi all'interno del sistema, essi sono rispettivamente
606 chiamati \textit{calendar time} e \textit{process time}, secondo le
609 \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
610 primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
611 usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
612 Epoch}. Questo tempo viene anche chiamato anche GMT (Greenwich Mean Time)
613 dato che l'UTC corrisponde all'ora locale di Greenwich. È il tempo su cui
614 viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per
615 indicare le date di modifica dei file o quelle di avvio dei processi. Per
616 memorizzare questo tempo è stato riservato il tipo primitivo \type{time\_t}.
617 \item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato
618 in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate
619 dal timer di sistema, e che per Linux avvengono ogni centesimo di
620 secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni
621 millesimo di secondo}. Il dato primitivo usato per questo tempo è
622 \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di
623 operazione del timer, e corrisponde dunque al numero di tick al secondo. Lo
624 standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK});
625 questo valore può comunque essere ottenuto con \func{sysconf} (vedi
626 \secref{sec:sys_limits}).
629 In genere si usa il \textit{calendar time} per tenere le date dei file e le
630 informazioni analoghe che riguardano i tempi di ``orologio'', usati ad esempio
631 per i demoni che compiono lavori amministrativi ad ore definite, come
632 \cmd{cron}. Di solito questo vene convertito automaticamente dal valore in UTC
633 al tempo locale, utilizzando le opportune informazioni di localizzazione
634 (specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
635 mantenuto dal sistema e non corrisponde all'orologio hardware del calcolatore.
637 Il \textit{process time} di solito si esprime in secondi e viene usato appunto
638 per tenere conto dei tempi di esecuzione dei processi. Per ciascun processo il
639 kernel tiene tre di questi tempi:
641 \item \textit{clock time}
642 \item \textit{user time}
643 \item \textit{system time}
645 il primo è il tempo ``reale'' (viene anche chiamato \textit{wall clock time})
646 dall'avvio del processo, e misura il tempo trascorso fino alla sua
647 conclusione; chiaramente un tale tempo dipende anche dal carico del sistema e
648 da quanti altri processi stavano girando nello stesso periodo. Il secondo
649 tempo è quello che la CPU ha speso nell'esecuzione delle istruzioni del
650 processo in user space. Il terzo è il tempo impiegato dal kernel per eseguire
651 delle system call per conto del processo medesimo (tipo quello usato per
652 eseguire una \func{write} su un file). In genere la somma di user e system
653 time viene chiamato \textit{CPU time}.
659 \section{La gestione degli errori}
660 \label{sec:sys_errors}
662 La gestione degli errori è in genere una materia complessa. Inoltre il modello
663 utilizzato dai sistema unix-like è basato sull'architettura a processi, e
664 presenta una serie di problemi nel caso lo si debba usare con i thread.
665 Esamineremo in questa sezione le sue caratteristiche principali.
668 \subsection{La variabile \var{errno}}
669 \label{sec:sys_errno}
671 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
672 riportare condizioni di errore, ed è una buona norma di programmazione
673 controllare sempre che le funzioni chiamate si siano concluse correttamente.
675 In genere le funzioni di libreria usano un valore speciale per indicare che
676 c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la
677 costante \macro{EOF} (a seconda della funzione); ma questo valore segnala solo
678 che c'è stato un errore, non il tipo di errore.
680 Per riportare il tipo di errore il sistema usa la variabile globale
681 \var{errno}\footnote{L'uso di una variabile globale può comportare alcuni
682 problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
683 anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
684 può anche usare una macro, e questo è infatti il modo usato da Linux per
685 renderla locale ai singoli thread.}, definita nell'header \file{errno.h}; la
686 variabile è in genere definita come \type{volatile} dato che può essere
687 cambiata in modo asincrono da un segnale (per una descrizione dei segnali si
688 veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto
689 bene salva e ripristina il valore della variabile, di questo non è necessario
690 preoccuparsi nella programmazione normale.
692 I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
693 nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
694 costanti numeriche che identificano i vari errori; essi iniziano tutti per
695 \macro{E} e si possono considerare come nomi riservati. In seguito faremo
696 sempre riferimento a tali valori, quando descriveremo i possibili errori
697 restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
698 codice relativo ad un valore numerico con l'opzione \cmd{-l}.
700 Il valore di \var{errno} viene sempre settato a zero all'avvio di un
701 programma, gran parte delle funzioni di libreria settano \var{errno} ad un
702 valore diverso da zero in caso di errore. Il valore è invece indefinito in
703 caso di successo, perché anche se una funzione ha successo, può chiamarne
704 altre al suo interno che falliscono, modificando così \var{errno}.
706 Pertanto un valore non nullo di \var{errno} non è sintomo di errore (potrebbe
707 essere il risultato di un errore precedente) e non lo si può usare per
708 determinare quando o se una chiamata a funzione è fallita. La procedura da
709 seguire è sempre quella di controllare \var{errno} immediatamente dopo aver
710 verificato il fallimento della funzione attraverso il suo codice di ritorno.
713 \subsection{Le funzioni \func{strerror} e \func{perror}}
714 \label{sec:sys_strerror}
716 Benché gli errori siano identificati univocamente dal valore numerico di
717 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
718 riportare in opportuni messaggi le condizioni di errore verificatesi. La
719 prima funzione che si può usare per ricavare i messaggi di errore è
720 \func{strerror}, il cui prototipo è:
721 \begin{prototype}{string.h}{char *strerror(int errnum)}
722 Ritorna una stringa (statica) che descrive l'errore il cui codice è passato
726 In generale \func{strerror} viene usata passando \var{errno} come parametro;
727 nel caso si specifichi un codice sbagliato verrà restituito un messaggio di
728 errore sconosciuto. La funzione utilizza una stringa statica che non deve
729 essere modificata dal programma e che è utilizzabile solo fino ad una chiamata
730 successiva a \func{strerror}; nel caso si usino i thread è
731 provvista\footnote{questa funzione è una estensione GNU, non fa parte dello
732 standard POSIX} una versione apposita:
733 \begin{prototype}{string.h}
734 {char *strerror\_r(int errnum, char *buff, size\_t size)}
735 Analoga a \func{strerror} ma ritorna il messaggio in un buffer
736 specificato da \param{buff} di lunghezza massima (compreso il terminatore)
740 che utilizza un buffer che il singolo thread deve allocare, per evitare i
741 problemi connessi alla condivisione del buffer statico. Infine, per completare
742 la caratterizzazione dell'errore, si può usare anche la variabile
743 globale\footnote{anche questa è una estensione GNU}
744 \var{program\_invocation\_short\_name} che riporta il nome del programma
745 attualmente in esecuzione.
747 Una seconda funzione usata per riportare i codici di errore in maniera
748 automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
749 \func{perror}, il cui prototipo è:
750 \begin{prototype}{stdio.h}{void perror (const char *message)}
751 Stampa il messaggio di errore relativo al valore corrente di \var{errno}
752 sullo standard error; preceduto dalla stringa \var{message}.
754 i messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati
755 in \capref{cha:errors}), e, usando il valore corrente di \var{errno}, si
756 riferiscono all'ultimo errore avvenuto. La stringa specificata con
757 \var{message} viene stampato prime del messaggio d'errore, seguita dai due
758 punti e da uno spazio, il messaggio è terminato con un a capo.
760 Il messaggio può essere riportato anche usando altre variabili globali
761 dichiarate in \file{errno.h}:
763 const char *sys_errlist[];
766 la prima contiene i puntatori alle stringhe di errore indicizzati da
767 \var{errno}; la seconda esprime il valore più alto per un codice di errore,
768 l'utilizzo di questa stringa è sostanzialmente equivalente a quello di
771 In \nfig\ è riportata la sezione attinente del codice del programma
772 \cmd{errcode}, che può essere usato per stampare i messaggi di errore e le
773 costanti usate per identificare i singoli errori; il sorgente completo del
774 programma è allegato nel file \file{ErrCode.c} e contiene pure la gestione
775 delle opzioni e tutte le definizioni necessarie ad associare il valore
776 numerico alla costante simbolica. In particolare si è riportata la sezione che
777 converte la stringa passata come parametro in un intero (\texttt{\small
778 1--2}), controllando con i valori di ritorno di \func{strtol} che la
779 conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi stampa,
780 a seconda dell'opzione scelta il messaggio di errore (\texttt{\small 11--14})
781 o la macro (\texttt{\small 15--17}) associate a quel codice.
786 /* convert string to number */
787 err = strtol(argv[optind], NULL, 10);
788 /* testing error condition on conversion */
790 perror("Underflow on error code");
792 } else if (err==LONG_MIN) {
793 perror("Overflow on error code");
796 /* conversion is fine */
798 printf("Error message for %d is %s\n", err, strerror(err));
801 printf("Error label for %d is %s\n", err, err_code[err]);
804 \caption{Codice per la stampa del messaggio di errore standard.}
805 \label{fig:sys_err_mess}
809 \section{La gestione di utenti e gruppi}
810 \label{sec:sys_user_group}
815 %%% TeX-master: "gapil"