Fatto un po' di ordine nel casino delle macro sui limiti.
[gapil.git] / system.tex
1 \chapter{La gestione del sistema, delle risorse, e degli errori}
2 \label{cha:system}
3
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.
9
10
11 \section{La lettura delle caratteristiche del sistema}
12 \label{sec:sys_characteristics}
13
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.
20
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
27 quelle dei file.
28
29
30 \subsection{Limiti e parametri di sistema}
31 \label{sec:sys_limits}
32
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à:
41 \begin{itemize*}
42 \item la possibilità di determinare limiti ed opzioni al momento della
43   compilazione.
44 \item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
45 \end{itemize*}
46
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}).
56
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.
67
68 \begin{table}[htb]
69   \centering
70   \footnotesize
71   \begin{tabular}[c]{|l|r|l|}
72     \hline
73     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
74     \hline
75     \hline
76     \macro{MB\_LEN\_MAX}&       16  & massima dimensione di un 
77                                       carattere multibyte\\
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}\\
93     \hline                
94   \end{tabular}
95   \caption{Macro definite in \file{limits.h} in conformità allo standard
96     ANSI C.}
97   \label{tab:sys_ansic_macro}
98 \end{table}
99
100 \footnotetext[1]{il valore può essere 0 o \macro{SCHAR\_MIN} a seconda che il
101   sistema usi caratteri con segno o meno.} 
102
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.}
105
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}.
109
110 \begin{table}[htb]
111   \centering
112   \footnotesize
113   \begin{tabular}[c]{|l|r|l|}
114     \hline
115     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
116     \hline
117     \hline
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}\\
122     \hline                
123   \end{tabular}
124   \caption{Macro definite in \file{limits.h} in conformità allo standard
125     ISO C90.}
126   \label{tab:sys_isoc90_macro}
127 \end{table}
128
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}.
134
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}).
141
142 \begin{table}[htb]
143   \centering
144   \footnotesize
145   \begin{tabular}[c]{|l|r|p{8cm}|}
146     \hline
147     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
148     \hline
149     \hline
150     \macro{ARG\_MAX} &131072& dimensione massima degli argomenti
151                               passati ad una funzione della famiglia
152                               \func{exec}.\\ 
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}.\\
164     \hline
165     \hline
166   \end{tabular}
167   \caption{Macro .}
168   \label{tab:sys_generic_macro}
169 \end{table}
170
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}. In realtà in Linux queste sono comunque
175 definite e spesso indicano un limite generico, che può però essere superato
176 dal valore restituito da \func{sysconf}.
177
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}.
183
184 \begin{table}[htb]
185   \centering
186   \footnotesize
187   \begin{tabular}[c]{|l|r|p{8cm}|}
188     \hline
189     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
190     \hline
191     \hline
192     \macro{\_POSIX\_ARG\_MAX}    & 4096& dimensione massima degli argomenti
193                                          passati ad una funzione della famiglia
194                                          \func{exec}.\\ 
195     \macro{\_POSIX\_CHILD\_MAX}  &    6& numero massimo di processi
196                                          contemporanei che un utente può 
197                                          eseguire.\\
198     \macro{\_POSIX\_OPEN\_MAX}   &   16& numero massimo di file che un processo
199                                          può mantenere aperti in 
200                                          contemporanea.\\
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
206                                          processo (vedi 
207                                          \secref{sec:proc_access_id}).\\
208     \macro{\_POSIX\_SSIZE\_MAX}  &32767& valore massimo del tipo 
209                                          \type{ssize\_t}.\\
210     \macro{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
211     \macro{\_POSIX\_AIO\_MAX}    &    1& \\
212     \hline                
213     \hline                
214   \end{tabular}
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}
218 \end{table}
219
220 In genere questi valori sono di scarsa utilità, 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. 
224
225 Oltre ai precedenti valori, previsti obbligatoriamente, lo standard POSIX
226
227 \begin{table}[htb]
228   \centering
229   \footnotesize
230   \begin{tabular}[c]{|l|r|p{8cm}|}
231     \hline
232     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
233     \hline
234     \hline
235     \macro{\_POSIX\_MQ\_OPEN\_MAX}&  8& \\
236     \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
237     \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
238     \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
239     \hline
240   \end{tabular}
241   \caption{Macro definite in \file{limits.h} in conformità allo standard
242     POSIX.1.}
243   \label{tab:sys_posix1_other}
244 \end{table}
245
246 Oltre a questi
247
248
249
250 \subsection{La funzione \func{sysconf}}
251 \label{sec:sys_sysconf}
252
253 Come accennato in \secref{sec:sys_limits} quando uno dei limiti o delle
254 caratteristiche del sistema può variare, per evitare di dover ricompilare un
255 programma tutte le volte che si cambiano le opzioni con cui è compilato il
256 kernel, o alcuni dei parametri modificabili a run time, è necessario ottenerne
257 il valore attraverso la funzione \func{sysconf}, il cui prototipo è:
258 \begin{prototype}{unistd.h}{long sysconf(int name)}
259   Restituisce il valore del parametro di sistema \param{name}.
260   
261   \bodydesc{La funzione restituisce indietro il valore del parametro
262     richiesto, o 1 se si tratta di un'opzione disponibile, 0 se l'opzione non
263     è disponibile e -1 in caso di errore (ma \var{errno} non viene settata).}
264 \end{prototype}
265
266 La funzione prende come argomento un intero che specifica quale dei limiti si
267 vuole conoscere; uno specchietto contenente i principali valori disponibili
268 in Linux (l'elenco completo è contenuto in \file{bits/confname}, una lista più
269 esaustiva si può trovare nel manuale delle \acr{glibc}), e la corrispondente
270 macro di sistema, è riportato in \tabref{tab:sys_sysconf_par}.
271
272 \begin{table}[htb]
273   \centering
274   \footnotesize
275     \begin{tabular}[c]{|l|l|p{9cm}|}
276       \hline
277       \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
278       \hline
279       \hline
280       \texttt{\_SC\_ARG\_MAX} &\macro{ARG\_MAX}&
281       La dimensione massima degli argomenti passati ad una funzione
282       della famiglia \func{exec}.\\
283       \texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}&
284       Il numero massimo di processi contemporanei che un utente può
285       eseguire.\\
286       \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
287       Il numero massimo di file che un processo può mantenere aperti in
288       contemporanea.\\
289       \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
290       Il massimo numero di stream che un processo può mantenere aperti in
291       contemporanea. Questo limite previsto anche dallo standard ANSI C, che
292       specifica la macro {FOPEN\_MAX}.\\
293       \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
294       La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\
295       \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
296       Massimo numero di gruppi supplementari che può avere un processo (vedi
297       \secref{sec:proc_access_id}).\\ 
298       \texttt{\_SC\_SSIZE\_MAX}&\macro{SSIZE\_MAX}& 
299       valore massimo del tipo di dato \type{ssize\_t}.\\
300       \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
301       Il numero di \textit{clock tick} al secondo, cioè la frequenza delle
302       interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\
303       \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
304       Indica se è supportato il \textit{job control} (vedi
305       \secref{sec:sess_xxx}) in stile POSIX.\\
306       \texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
307       Indica se il sistema supporta i \textit{saved id} (vedi
308       \secref{sec:proc_access_id}).\\ 
309       \texttt{\_SC\_VERSION}& \macro{\_POSIX\_VERSION} &
310       Indica il mese e l'anno di approvazione della revisione dello standard
311       POSIX.1 a cui il sistema fa riferimento, nel formato YYYYMML, la
312       revisione più recente è 199009L, che indica il Settembre 1990.\\
313      \hline
314     \end{tabular}
315   \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
316   \label{tab:sys_sysconf_par}
317 \end{table}
318
319 In generale ogni valore per cui è definita una macro, sia dagli standard ANSI
320 C e ISO C90, che da POSIX.1 e POSIX.2, può essere ottenuto attraverso una
321 chiamata a \func{sysconf}, ed il valore di \param{name} si ottiene appendendo
322 un \code{\_SC\_} per o primi due o sostituendolo a \code{\_POSIX\_} per gli
323 altri due. Lo stesso dicasi per le macro relative alle caratteristiche dei
324 file.
325
326
327 \subsection{I limiti dei file}
328 \label{sec:sys_file_limits}
329
330 Come per le caratteristiche generali del sistema anche per i file esistono una
331 serie di limiti (come la lunghezza del nome del file o il numero massimo di
332 link) che dipendono sia dall'implementazione che dal filesystem in uso; anche
333 in questo caso lo standard prevede alcune macro che ne specificano il valore,
334 riportate in \tabref{tab:sys_file_macro}.
335
336 \begin{table}[htb]
337   \centering
338   \footnotesize
339   \begin{tabular}[c]{|l|r|p{8cm}|}
340     \hline
341     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
342     \hline
343     \hline                
344     \macro{NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
345     \macro{PATH\_MAX}& 256  & lunghezza in byte di pathname.\\
346     \macro{PIPE\_BUF}& 512  & byte scrivibili atomicamente in una pipe\\
347     \macro{LINK\_MAX}   &8  & numero massimo di link a un file\\
348     \macro{MAX\_CANON}&255  & spazio disponibile nella coda di input
349                               canonica del terminale\\
350     \macro{MAX\_INPUT}&255  & spazio disponibile nella coda di input 
351                               del terminale\\
352     \hline                
353   \end{tabular}
354   \caption{Macro per i limiti sulle caratteristiche dei file.}
355   \label{tab:sys_file_macro}
356 \end{table}
357
358 Come per i limiti di sistema POSIX.1 detta una serie di valori minimi per
359 queste caratteristiche, che ogni sistema che vuole essere conforme deve
360 rispettare; le relative macro sono riportate in \tabref{tab:sys_posix1_file},
361 e vale lo stesso discorso fatto per le analoghe di
362 \tabref{tab:sys_posix1_general}.
363
364 \begin{table}[htb]
365   \centering
366   \footnotesize
367   \begin{tabular}[c]{|l|r|p{8cm}|}
368     \hline
369     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
370     \hline
371     \hline
372     \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
373     \macro{\_POSIX\_LINK\_MAX}   &8  & numero massimo di link a un file\\
374     \macro{\_POSIX\_MAX\_CANON}&255  & spazio disponibile nella coda di input
375                                        canonica del terminale\\
376     \macro{\_POSIX\_MAX\_INPUT}&255  & spazio disponibile nella coda di input 
377                                        del terminale\\
378     \macro{\_POSIX\_NAME\_MAX}&  14  & lunghezza in byte di un nome di file. \\
379     \macro{\_POSIX\_PATH\_MAX}& 256  & lunghezza in byte di pathname.\\
380     \macro{\_POSIX\_PIPE\_BUF}& 512  & byte scrivibili atomicamente in una
381                                        pipe\\
382     \macro{\_POSIX\_MQ\_OPEN\_MAX}&  8& \\
383     \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
384     \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
385     \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
386     \hline
387   \end{tabular}
388   \caption{Macro dei valori minimi delle caratteristiche dei file per la
389     conformità allo standard POSIX.1.}
390   \label{tab:sys_posix1_file}
391 \end{table}
392
393
394 \subsection{La funzione \func{pathconf}}
395 \label{sec:sys_pathconf}
396
397
398
399 \section{Opzioni e configurazione del sistema}
400 \label{sec:sys_config}
401
402 \subsection{La funzione \func{sysctl}}
403 \label{sec:sys_sysctl}
404
405
406 \subsection{La configurazione dei filesystem}
407 \label{sec:sys_file_config}
408
409 \subsection{La funzione \func{statfs}}
410 \label{sec:sys_file_stafs}
411
412
413
414 \section{Limitazione ed uso delle risorse}
415 \label{sec:sys_res_limits}
416
417 In questa sezione esamineremo le funzioni che permettono di esaminare e
418 controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
419 utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
420 sul loro utilizzo.
421
422
423
424 \subsection{L'uso delle risorse}
425 \label{sec:sys_resource_use}
426
427
428 \subsection{Limiti sulle risorse}
429 \label{sec:sys_resource_limit}
430
431
432 \subsection{Le risorse di memoria}
433 \label{sec:sys_memory_res}
434
435
436 \subsection{Le risorse di processore}
437 \label{sec:sys_cpu_load}
438
439
440
441 \begin{figure}[!htb]
442   \footnotesize
443   \centering
444   \begin{minipage}[c]{15cm}
445     \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
446 struct rusage {
447      struct timeval ru_utime; /* user time used */
448      struct timeval ru_stime; /* system time used */
449      long ru_maxrss;          /* maximum resident set size */
450      long ru_ixrss;           /* integral shared memory size */
451      long ru_idrss;           /* integral unshared data size */
452      long ru_isrss;           /* integral unshared stack size */
453      long ru_minflt;          /* page reclaims */
454      long ru_majflt;          /* page faults */
455      long ru_nswap;           /* swaps */
456      long ru_inblock;         /* block input operations */
457      long ru_oublock;         /* block output operations */
458      long ru_msgsnd;          /* messages sent */
459      long ru_msgrcv;          /* messages received */
460      long ru_nsignals;   ;    /* signals received */
461      long ru_nvcsw;           /* voluntary context switches */
462      long ru_nivcsw;          /* involuntary context switches */
463 };
464     \end{lstlisting}
465   \end{minipage} 
466   \normalsize 
467   \caption{La struttura \var{rusage} per la lettura delle informazioni dei 
468     delle risorse usate da un processo.}
469   \label{fig:sys_rusage_struct}
470 \end{figure}
471
472
473
474
475 \var{tms\_utime}, \var{tms\_stime}, \var{tms\_cutime}, \var{tms\_uetime}
476
477
478
479 \section{La gestione dei tempi del sistema}
480 \label{sec:sys_time}
481
482 In questa sezione tratteremo le varie funzioni per la gestione delle
483 date e del tempo in un sistema unix-like, e quelle per convertire i vari
484 tempi nelle differenti rappresentazioni che vengono utilizzate.
485
486
487 \subsection{La misura del tempo in unix}
488 \label{sec:sys_unix_time}
489
490 Storicamente i sistemi unix-like hanno sempre mantenuto due distinti
491 valori per i tempi all'interno del sistema, essi sono rispettivamente
492 chiamati \textit{calendar time} e \textit{process time}, secondo le
493 definizioni:
494 \begin{itemize}
495 \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
496   primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
497   usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
498     Epoch}. Questo tempo viene anche chiamato anche GMT (Greenwich Mean Time)
499   dato che l'UTC corrisponde all'ora locale di Greenwich.  È il tempo su cui
500   viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per
501   indicare le date di modifica dei file o quelle di avvio dei processi. Per
502   memorizzare questo tempo è stato riservato il tipo primitivo \type{time\_t}.
503 \item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato
504   in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate
505   dal timer di sistema, e che per Linux avvengono ogni centesimo di
506   secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni
507     millesimo di secondo}. Il dato primitivo usato per questo tempo è
508   \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di
509   operazione del timer, e corrisponde dunque al numero di tick al secondo.  Lo
510   standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK});
511   questo valore può comunque essere ottenuto con \func{sysconf} (vedi
512   \secref{sec:sys_limits}).
513 \end{itemize}
514
515 In genere si usa il \textit{calendar time} per tenere le date dei file e le
516 informazioni analoghe che riguardano i tempi di ``orologio'', usati ad esempio
517 per i demoni che compiono lavori amministrativi ad ore definite, come
518 \cmd{cron}. Di solito questo vene convertito automaticamente dal valore in UTC
519 al tempo locale, utilizzando le opportune informazioni di localizzazione
520 (specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
521 mantenuto dal sistema e non corrisponde all'orologio hardware del calcolatore.
522
523 Il \textit{process time} di solito si esprime in secondi e viene usato appunto
524 per tenere conto dei tempi di esecuzione dei processi. Per ciascun processo il
525 kernel tiene tre di questi tempi: 
526 \begin{itemize*}
527 \item \textit{clock time}
528 \item \textit{user time}
529 \item \textit{system time}
530 \end{itemize*}
531 il primo è il tempo ``reale'' (viene anche chiamato \textit{wall clock time})
532 dall'avvio del processo, e misura il tempo trascorso fino alla sua
533 conclusione; chiaramente un tale tempo dipende anche dal carico del sistema e
534 da quanti altri processi stavano girando nello stesso periodo. Il secondo
535 tempo è quello che la CPU ha speso nell'esecuzione delle istruzioni del
536 processo in user space. Il terzo è il tempo impiegato dal kernel per eseguire
537 delle system call per conto del processo medesimo (tipo quello usato per
538 eseguire una \func{write} su un file). In genere la somma di user e system
539 time viene chiamato \textit{CPU time}. 
540
541
542
543
544
545 \section{La gestione degli errori}
546 \label{sec:sys_errors}
547
548 La gestione degli errori è in genere una materia complessa. Inoltre il modello
549 utilizzato dai sistema unix-like è basato sull'architettura a processi, e
550 presenta una serie di problemi nel caso lo si debba usare con i thread.
551 Esamineremo in questa sezione le sue caratteristiche principali.
552
553
554 \subsection{La variabile \var{errno}}
555 \label{sec:sys_errno}
556
557 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
558 riportare condizioni di errore, ed è una buona norma di programmazione
559 controllare sempre che le funzioni chiamate si siano concluse correttamente.
560
561 In genere le funzioni di libreria usano un valore speciale per indicare che
562 c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la
563 costante \macro{EOF} (a seconda della funzione); ma questo valore segnala solo
564 che c'è stato un errore, non il tipo di errore. 
565
566 Per riportare il tipo di errore il sistema usa la variabile globale
567 \var{errno}\footnote{L'uso di una variabile globale può comportare alcuni
568   problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
569   anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
570   può anche usare una macro, e questo è infatti il modo usato da Linux per
571   renderla locale ai singoli thread.}, definita nell'header \file{errno.h}; la
572 variabile è in genere definita come \type{volatile} dato che può essere
573 cambiata in modo asincrono da un segnale (per una descrizione dei segnali si
574 veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto
575 bene salva e ripristina il valore della variabile, di questo non è necessario
576 preoccuparsi nella programmazione normale.
577
578 I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
579 nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
580 costanti numeriche che identificano i vari errori; essi iniziano tutti per
581 \macro{E} e si possono considerare come nomi riservati. In seguito faremo
582 sempre riferimento a tali valori, quando descriveremo i possibili errori
583 restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
584 codice relativo ad un valore numerico con l'opzione \cmd{-l}.
585
586 Il valore di \var{errno} viene sempre settato a zero all'avvio di un
587 programma, gran parte delle funzioni di libreria settano \var{errno} ad un
588 valore diverso da zero in caso di errore. Il valore è invece indefinito in
589 caso di successo, perché anche se una funzione ha successo, può chiamarne
590 altre al suo interno che falliscono, modificando così \var{errno}.
591
592 Pertanto un valore non nullo di \var{errno} non è sintomo di errore (potrebbe
593 essere il risultato di un errore precedente) e non lo si può usare per
594 determinare quando o se una chiamata a funzione è fallita.  La procedura da
595 seguire è sempre quella di controllare \var{errno} immediatamente dopo aver
596 verificato il fallimento della funzione attraverso il suo codice di ritorno.
597
598
599 \subsection{Le funzioni \func{strerror} e \func{perror}}
600 \label{sec:sys_strerror}
601
602 Benché gli errori siano identificati univocamente dal valore numerico di
603 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
604 riportare in opportuni messaggi le condizioni di errore verificatesi.  La
605 prima funzione che si può usare per ricavare i messaggi di errore è
606 \func{strerror}, il cui prototipo è:
607 \begin{prototype}{string.h}{char *strerror(int errnum)} 
608   Ritorna una stringa (statica) che descrive l'errore il cui codice è passato
609   come parametro.
610 \end{prototype}
611
612 In generale \func{strerror} viene usata passando \var{errno} come parametro;
613 nel caso si specifichi un codice sbagliato verrà restituito un messaggio di
614 errore sconosciuto. La funzione utilizza una stringa statica che non deve
615 essere modificata dal programma e che è utilizzabile solo fino ad una chiamata
616 successiva a \func{strerror}; nel caso si usino i thread è
617 provvista\footnote{questa funzione è una estensione GNU, non fa parte dello
618   standard POSIX} una versione apposita:
619 \begin{prototype}{string.h}
620 {char *strerror\_r(int errnum, char *buff, size\_t size)} 
621   Analoga a \func{strerror} ma ritorna il messaggio in un buffer
622   specificato da \param{buff} di lunghezza massima (compreso il terminatore)
623   \param{size}.
624 \end{prototype}
625 \noindent
626 che utilizza un buffer che il singolo thread deve allocare, per evitare i
627 problemi connessi alla condivisione del buffer statico. Infine, per completare
628 la caratterizzazione dell'errore, si può usare anche la variabile
629 globale\footnote{anche questa è una estensione GNU}
630 \var{program\_invocation\_short\_name} che riporta il nome del programma
631 attualmente in esecuzione.
632
633 Una seconda funzione usata per riportare i codici di errore in maniera
634 automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
635 \func{perror}, il cui prototipo è:
636 \begin{prototype}{stdio.h}{void perror (const char *message)} 
637   Stampa il messaggio di errore relativo al valore corrente di \var{errno}
638   sullo standard error; preceduto dalla stringa \var{message}.
639 \end{prototype}
640 i messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati
641 in \capref{cha:errors}), e, usando il valore corrente di \var{errno}, si
642 riferiscono all'ultimo errore avvenuto. La stringa specificata con
643 \var{message} viene stampato prime del messaggio d'errore, seguita dai due
644 punti e da uno spazio, il messaggio è terminato con un a capo.
645
646 Il messaggio può essere riportato anche usando altre variabili globali
647 dichiarate in \file{errno.h}:
648 \begin{verbatim}
649    const char *sys_errlist[];
650    int sys_nerr;
651 \end{verbatim}
652 la prima contiene i puntatori alle stringhe di errore indicizzati da
653 \var{errno}; la seconda esprime il valore più alto per un codice di errore,
654 l'utilizzo di questa stringa è sostanzialmente equivalente a quello di
655 \func{strerror}.
656
657 In \nfig\ è riportata la sezione attinente del codice del programma
658 \cmd{errcode}, che può essere usato per stampare i messaggi di errore e le
659 costanti usate per identificare i singoli errori; il sorgente completo del
660 programma è allegato nel file \file{ErrCode.c} e contiene pure la gestione
661 delle opzioni e tutte le definizioni necessarie ad associare il valore
662 numerico alla costante simbolica. In particolare si è riportata la sezione che
663 converte la stringa passata come parametro in un intero (\texttt{\small
664   1--2}), controllando con i valori di ritorno di \func{strtol} che la
665 conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi stampa,
666 a seconda dell'opzione scelta il messaggio di errore (\texttt{\small 11--14})
667 o la macro (\texttt{\small 15--17}) associate a quel codice.
668
669 \begin{figure}[!htb]
670   \footnotesize
671   \begin{lstlisting}{}
672     /* convert string to number */
673     err = strtol(argv[optind], NULL, 10);
674     /* testing error condition on conversion */
675     if (err==LONG_MIN) {
676         perror("Underflow on error code");
677         return 1;
678     } else if (err==LONG_MIN) {
679         perror("Overflow on error code");
680         return 1;
681     }
682     /* conversion is fine */
683     if (message) {
684         printf("Error message for %d is %s\n", err, strerror(err));
685     }
686     if (label) {
687         printf("Error label for %d is %s\n", err, err_code[err]);
688     }
689   \end{lstlisting}
690   \caption{Codice per la stampa del messaggio di errore standard.}
691   \label{fig:sys_err_mess}
692 \end{figure}
693
694
695 \section{La gestione di utenti e gruppi}
696 \label{sec:sys_user_group}
697
698
699 %%% Local Variables: 
700 %%% mode: latex
701 %%% TeX-master: "gapil"
702 %%% End: