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.
12 \section{La lettura delle caratteristiche del sistema}
13 \label{sec:sys_characteristics}
15 In questa sezione tratteremo le varie modalità con cui un programma può
16 ottenere informazioni riguardo alle capacità del sistema. Ogni sistema infatti
17 è contraddistinto da un gran numero di limiti e costanti che lo
18 caratterizzano, e che possono dipendere da fattori molteplici, come
19 l'architettura hardware, l'implementazione del kernel e delle librerie, le
20 opzioni di configurazione.
22 La definizione di queste caratteristiche ed il tentativo di provvedere dei
23 meccanismi generali che i programmi potessero usare per ricavarle è uno degli
24 aspetti più complessi e controversi coi cui i vari standard si sono dovuti
25 confrontare, spesso con risultati spesso tutt'altro che chiari. Proveremo
26 comunque a dare una descrizione dei principali metodi previsti dai vari
27 standard per ricavare sia le caratteristiche specifiche del sistema, che
31 \subsection{Limiti e parametri di sistema}
32 \label{sec:sys_limits}
34 Quando si devono determinare le le caratteristiche generali del sistema ci si
35 trova di fronte a diverse possibilità; alcune di queste infatti possono
36 dipendere dall'architettura dell'hardware (come le dimensioni dei tipi
37 interi), o dal sistema operativo (come la presenza o meno dei \textit{saved
38 id}), altre invece possono dipendere dalle opzioni con cui si è costruito
39 il sistema (ad esempio da come si è compilato il kernel), o dalla
40 configurazione del medesimo; per questo motivo in generale sono necessari due
41 tipi diversi di funzionalità:
43 \item la possibilità di determinare limiti ed opzioni al momento della
45 \item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
48 La prima funzionalità si può ottenere includendo gli opportuni header file che
49 contengono le costanti necessarie definite come macro di preprocessore, per la
50 seconda invece sono ovviamente necessarie delle funzioni. La situazione è
51 complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti
52 sono fissi in un'implementazione mentre possono variare in un altra. Tutto
53 questo crea una ambiguità che non è sempre possibile risolvere in maniera
54 chiara; in generale quello che succede è che quando i limiti del sistema sono
55 fissi essi vengono definiti come macro di preprocessore nel file
56 \file{limits.h}, se invece possono variare, il loro valore sarà ottenibile
57 tramite la funzione \func{sysconf} (che esamineremo in
58 \secref{sec:sys_sysconf}).
60 Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo
61 saranno sempre disponibili al momento della compilazione; un elenco, ripreso
62 da \file{limits.h}, è riportato in \tabref{tab:sys_ansic_macro}. Come si può
63 vedere per la maggior parte questi limiti attengono alle dimensioni dei dati
64 interi, che sono in genere fissati dall'architettura hardware (le analoghe
65 informazioni per i dati in virgola mobile sono definite a parte, ed
66 accessibili includendo \file{float.h}). Lo standard prevede anche un'altra
67 costante, \macro{FOPEN\_MAX}, che può non essere fissa e che pertanto non è
68 definita in \file{limits.h}; essa deve essere definita in \file{stdio.h} ed
69 avere un valore minimo di 8.
74 \begin{tabular}[c]{|l|r|l|}
76 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
79 \macro{MB\_LEN\_MAX}& 16 & massima dimensione di un
81 \macro{CHAR\_BIT} & 8 & bit di \type{char}\\
82 \macro{UCHAR\_MAX}& 255 & massimo di \type{unsigned char}\\
83 \macro{SCHAR\_MIN}& -128 & minimo di \type{signed char}\\
84 \macro{SCHAR\_MAX}& 127 & massimo di \type{signed char}\\
85 \macro{CHAR\_MIN} &\footnotemark& minimo di \type{char}\\
86 \macro{CHAR\_MAX} &\footnotemark& massimo di \type{char}\\
87 \macro{SHRT\_MIN} & -32768 & minimo di \type{short}\\
88 \macro{SHRT\_MAX} & 32767 & massimo di \type{short}\\
89 \macro{USHRT\_MAX}& 65535 & massimo di \type{unsigned short}\\
90 \macro{INT\_MAX} & 2147483647 & minimo di \type{int}\\
91 \macro{INT\_MIN} &-2147483648 & minimo di \type{int}\\
92 \macro{UINT\_MAX} & 4294967295 & massimo di \type{unsigned int}\\
93 \macro{LONG\_MAX} & 2147483647 & massimo di \type{long}\\
94 \macro{LONG\_MIN} &-2147483648 & minimo di \type{long}\\
95 \macro{ULONG\_MAX}& 4294967295 & massimo di \type{unsigned long}\\
98 \caption{Costanti definite in \file{limits.h} in conformità allo standard
100 \label{tab:sys_ansic_macro}
103 \footnotetext[1]{il valore può essere 0 o \macro{SCHAR\_MIN} a seconda che il
104 sistema usi caratteri con segno o meno.}
106 \footnotetext[2]{il valore può essere \macro{UCHAR\_MAX} o \macro{SCHAR\_MAX}
107 a seconda che il sistema usi caratteri con segno o meno.}
109 A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
110 \type{long long} introdotto con il nuovo standard, i relativi valori sono in
111 \tabref{tab:sys_isoc90_macro}.
116 \begin{tabular}[c]{|l|r|l|}
118 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
121 \macro{LLONG\_MAX}& 9223372036854775807& massimo di \type{long long}\\
122 \macro{LLONG\_MIN}&-9223372036854775808& minimo di \type{long long}\\
123 \macro{ULLONG\_MAX}&18446744073709551615&
124 massimo di \type{unsigned long long}\\
127 \caption{Macro definite in \file{limits.h} in conformità allo standard
129 \label{tab:sys_isoc90_macro}
132 Ovviamente le dimensioni dei vari tipi di dati sono solo una piccola parte
133 delle caratteristiche del sistema; mancano completamente tutte quelle che
134 dipendono dalla implementazione dello stesso. Queste, per i sistemi unix-like,
135 sono state definite in gran parte dallo standard POSIX.1, che tratta anche i
136 limiti relativi alle caratteristiche dei file che vedremo in
137 \secref{sec:sys_file_limits}.
139 Purtroppo la sezione dello standard che tratta questi argomenti è una delle
140 meno chiare\footnote{tanto che Stevens, in \cite{APUE}, la porta come esempio
141 di ``standardese''.}. Lo standard prevede che ci siano 13 macro che
142 descrivono le caratteristiche del sistema (7 per le caratteristiche generiche,
143 riportate in \tabref{tab:sys_generic_macro}, e 6 per le caratteristiche dei
144 file, riportate in \tabref{tab:sys_file_macro}).
149 \begin{tabular}[c]{|l|r|p{8cm}|}
151 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
154 \macro{ARG\_MAX} &131072& dimensione massima degli argomenti
155 passati ad una funzione della famiglia
157 \macro{CHILD\_MAX} & 999& numero massimo di processi contemporanei
158 che un utente può eseguire.\\
159 \macro{OPEN\_MAX} & 256& numero massimo di file che un processo
160 può mantenere aperti in contemporanea.\\
161 \macro{STREAM\_MAX}& 8& massimo numero di stream aperti per
162 processo in contemporanea.\\
163 \macro{TZNAME\_MAX}& 6& dimensione massima del nome di una
164 \texttt{timezone} (vedi ).\\
165 \macro{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
166 processo (vedi \secref{sec:proc_access_id}).\\
167 \macro{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
171 \caption{Costanti per i limiti del sistema.}
172 \label{tab:sys_generic_macro}
175 Lo standard dice che queste macro devono essere definite in \file{limits.h}
176 quando i valori a cui fanno riferimento sono fissi, e altrimenti devono essere
177 lasciate indefinite, ed i loro valori dei limiti devono essere accessibili
178 solo attraverso \func{sysconf}. In realtà queste vengono sempre definite ad
179 un valore generico. Si tenga presente poi che alcuni di questi limiti possono
180 assumere valori molto elevati (come \macro{CHILD\_MAX}), e non è pertanto il
181 caso di utilizzarli per allocare staticamente della memoria.
183 A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di
184 altre costanti (il cui nome inizia sempre con \code{\_POSIX\_}) che
185 definiscono i valori minimi le stesse caratteristiche devono avere, perché una
186 implementazione possa dichiararsi conforme allo standard; detti valori sono
187 riportati in \tabref{tab:sys_posix1_general}.
192 \begin{tabular}[c]{|l|r|p{8cm}|}
194 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
197 \macro{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
198 passati ad una funzione della famiglia
200 \macro{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
201 contemporanei che un utente può
203 \macro{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
204 può mantenere aperti in
206 \macro{\_POSIX\_STREAM\_MAX} & 8& massimo numero di stream aperti per
207 processo in contemporanea.\\
208 \macro{\_POSIX\_TZNAME\_MAX} & & dimensione massima del nome di una
209 \texttt{timezone} (vedi ).\\
210 \macro{\_POSIX\_NGROUPS\_MAX}& 0& numero di gruppi supplementari per
212 \secref{sec:proc_access_id}).\\
213 \macro{\_POSIX\_SSIZE\_MAX} &32767& valore massimo del tipo
215 \macro{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
216 \macro{\_POSIX\_AIO\_MAX} & 1& \\
220 \caption{Macro dei valori minimi delle caratteristiche generali del sistema
221 per la conformità allo standard POSIX.1.}
222 \label{tab:sys_posix1_general}
225 In genere questi valori non servono a molto, la loro unica utilità è quella di
226 indicare un limite superiore che assicura la portabilità senza necessità di
227 ulteriori controlli. Tuttavia molti di essi sono ampiamente superati in tutti
228 i sistemi POSIX in uso oggigiorno. Per questo è sempre meglio utilizzare i
229 valori ottenuti da \func{sysconf}.
234 \begin{tabular}[c]{|l|p{8cm}|}
236 \textbf{Macro}&\textbf{Significato}\\
239 \macro{\_POSIX\_JOB\_CONTROL}& il sistema supporta il
240 \textit{job control} (vedi
241 \secref{sec:sess_xxx}).\\
242 \macro{\_POSIX\_SAVED\_IDS} & il sistema supporta i \textit{saved id}
243 (vedi \secref{sec:proc_access_id}).
244 per il controllo di accesso dei processi\\
245 \macro{\_POSIX\_VERSION} & fornisce la versione dello standard POSIX.1
246 supportata nel formato YYYYMML (ad esempio
250 \caption{Alcune macro definite in \file{limits.h} in conformità allo standard
252 \label{tab:sys_posix1_other}
255 Oltre ai precedenti valori (e a quelli relativi ai file elencati in
256 \tabref{tab:sys_posix1_file}), che devono essere obbligatoriamente definiti,
257 lo standard POSIX.1 ne prevede parecchi altri. La lista completa si trova
258 dall'header file \file{bits/posix1\_lim.h} (da non usare mai direttamente, è
259 incluso automaticamente all'interno di \file{limits.h}). Di questi vale la
260 pena menzionare alcune macro di uso comune, (riportate in
261 \tabref{tab:sys_posix1_other}), che non indicano un valore specifico, ma
262 denotano la presenza di alcune funzionalità nel sistema (come il supporto del
263 \textit{job control} o dei \textit{saved id}).
265 Oltre allo standard POSIX.1, anche lo standard POSIX.2 definisce una serie di
266 altre costanti. Siccome queste sono principalmente attinenti a limiti relativi
267 alle applicazioni di sistema presenti (come quelli su alcuni parametri delle
268 espressioni regolari o del comando \cmd{bc}), non li tratteremo
269 esplicitamente, se ne trova una menzione completa nell'header file
270 \file{bits/posix2\_lim.h}, e alcuni di loro sono descritti nella man page di
271 \func{sysconf} e nel manuale delle \acr{glibc}.
274 \subsection{La funzione \func{sysconf}}
275 \label{sec:sys_sysconf}
277 Come accennato in \secref{sec:sys_limits} quando uno dei limiti o delle
278 caratteristiche del sistema può variare, è necessario ottenerne il valore
279 attraverso la funzione \func{sysconf}, per non dover essere costretti a
280 ricompilare un programma tutte le volte che si cambiano le opzioni con cui è
281 compilato il kernel, o alcuni dei parametri modificabili a run time. Il
282 prototipo di questa funzione è:
283 \begin{prototype}{unistd.h}{long sysconf(int name)}
284 Restituisce il valore del parametro di sistema \param{name}.
286 \bodydesc{La funzione restituisce indietro il valore del parametro
287 richiesto, o 1 se si tratta di un'opzione disponibile, 0 se l'opzione non
288 è disponibile e -1 in caso di errore (ma \var{errno} non viene settata).}
291 La funzione prende come argomento un intero che specifica quale dei limiti si
292 vuole conoscere; uno specchietto contenente i principali valori disponibili in
293 Linux è riportato in \tabref{tab:sys_sysconf_par}; l'elenco completo è
294 contenuto in \file{bits/confname.h}, ed una lista più esaustiva, con le
295 relative spiegazioni, si può trovare nel manuale delle \acr{glibc}.
300 \begin{tabular}[c]{|l|l|p{9cm}|}
302 \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
305 \texttt{\_SC\_ARG\_MAX} &\macro{ARG\_MAX}&
306 La dimensione massima degli argomenti passati ad una funzione
307 della famiglia \func{exec}.\\
308 \texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}&
309 Il numero massimo di processi contemporanei che un utente può
311 \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
312 Il numero massimo di file che un processo può mantenere aperti in
314 \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
315 Il massimo numero di stream che un processo può mantenere aperti in
316 contemporanea. Questo limite previsto anche dallo standard ANSI C, che
317 specifica la macro {FOPEN\_MAX}.\\
318 \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
319 La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\
320 \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
321 Massimo numero di gruppi supplementari che può avere un processo (vedi
322 \secref{sec:proc_access_id}).\\
323 \texttt{\_SC\_SSIZE\_MAX}&\macro{SSIZE\_MAX}&
324 valore massimo del tipo di dato \type{ssize\_t}.\\
325 \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
326 Il numero di \textit{clock tick} al secondo, cioè la frequenza delle
327 interruzioni del timer di sistema (vedi \secref{sec:proc_priority}).\\
328 \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
329 Indica se è supportato il \textit{job control} (vedi
330 \secref{sec:sess_xxx}) in stile POSIX.\\
331 \texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
332 Indica se il sistema supporta i \textit{saved id} (vedi
333 \secref{sec:proc_access_id}).\\
334 \texttt{\_SC\_VERSION}& \macro{\_POSIX\_VERSION} &
335 Indica il mese e l'anno di approvazione della revisione dello standard
336 POSIX.1 a cui il sistema fa riferimento, nel formato YYYYMML, la
337 revisione più recente è 199009L, che indica il Settembre 1990.\\
340 \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
341 \label{tab:sys_sysconf_par}
344 In generale ogni limite o caratteristica del sistema per cui è definita una
345 macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può
346 essere ottenuto attraverso una chiamata a \func{sysconf}. Il valore si otterrà
347 specificando come valore del parametro \param{name} il nome ottenuto
348 aggiungendo \code{\_SC\_} ai nomi delle macro definite dai primi due, o
349 sostituendolo a \code{\_POSIX\_} per le macro definite dagli gli altri due.
351 In generale si dovrebbe fare uso di \func{sysconf} solo quando la relativa
352 macro non è definita, quindi con un codice analogo al seguente:
354 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
360 int val = sysconf(_SC_CHILD_MAX);
362 perror("fatal error");
369 ma in realtà in Linux queste macro sono comunque definite e indicando un
370 limite generico, per cui è sempre meglio usare i valori restituiti da
374 \subsection{I limiti dei file}
375 \label{sec:sys_file_limits}
377 Come per le caratteristiche generali del sistema anche per i file esistono una
378 serie di limiti (come la lunghezza del nome del file o il numero massimo di
379 link) che dipendono sia dall'implementazione che dal filesystem in uso; anche
380 in questo caso lo standard prevede alcune macro che ne specificano il valore,
381 riportate in \tabref{tab:sys_file_macro}.
386 \begin{tabular}[c]{|l|r|p{8cm}|}
388 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
391 \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
392 \macro{PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
393 \macro{PIPE\_BUF}& 512 & byte scrivibili atomicamente in una pipe\\
394 \macro{LINK\_MAX} &8 & numero massimo di link a un file\\
395 \macro{MAX\_CANON}&255 & spazio disponibile nella coda di input
396 canonica del terminale\\
397 \macro{MAX\_INPUT}&255 & spazio disponibile nella coda di input
401 \caption{Macro per i limiti sulle caratteristiche dei file.}
402 \label{tab:sys_file_macro}
405 Come per i limiti di sistema POSIX.1 detta una serie di valori minimi per
406 queste caratteristiche, che ogni sistema che vuole essere conforme deve
407 rispettare; le relative macro sono riportate in \tabref{tab:sys_posix1_file},
408 e per esse vale lo stesso discorso fatto per le analoghe di
409 \tabref{tab:sys_posix1_general}.
414 \begin{tabular}[c]{|l|r|p{8cm}|}
416 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
419 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
420 \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\
421 \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input
422 canonica del terminale\\
423 \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
425 \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
426 \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
427 \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
429 % \macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
430 % \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
431 % \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
432 % \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
435 \caption{Macro dei valori minimi delle caratteristiche dei file per la
436 conformità allo standard POSIX.1.}
437 \label{tab:sys_posix1_file}
440 Tutti questi limiti sono definiti in \file{limits.h}; come nel caso precedente
441 il loro uso è di scarsa utilità in quanto ampiamente superati in tutte le
442 implementazioni moderne.
445 \subsection{La funzione \func{pathconf}}
446 \label{sec:sys_pathconf}
448 In generale i limiti per i file sono molto più soggetti ad essere variabili
449 rispetto ai precedenti limiti generali del sistema; ad esempio parametri come
450 la lunghezza del nome del file o il numero di link possono variare da
451 filesystem a filesystem; per questo motivo questi limiti devono essere sempre
452 controllati con la funzione \func{pathconf}, il cui prototipo è:
453 \begin{prototype}{unistd.h}{long pathconf(char *path, int name)}
454 Restituisce il valore del parametro \param{name} per il file \param{path}.
456 \bodydesc{La funzione restituisce indietro il valore del parametro
457 richiesto, o -1 in caso di errore (ed \var{errno} viene settata ad uno
458 degli errori possibili relativi all'accesso a \param{path}).}
461 E si noti come la funzione in questo caso richieda un parametro che specifichi
462 a quale file si fa riferimento, dato che il valore del limite cercato può
463 variare a seconda del filesystem. Una seconda versione della funzione,
464 \func{fpathconf}, opera su un file descriptor invece che su un pathname, il
466 \begin{prototype}{unistd.h}{long fpathconf(int fd, int name)}
467 Restituisce il valore del parametro \param{name} per il file \param{fd}.
469 \bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor
470 invece di un pathname; pertanto gli errori restituiti cambiano di
473 \noindent ed il suo comportamento è identico a quello di \func{pathconf}.
476 \subsection{La funzione \func{uname}}
477 \label{sec:sys_uname}
479 Un'altra funzione che si può utilizzare per raccogliere informazioni sia
480 riguardo al sistema che al computer su cui esso sta girando è \func{uname}, il
482 \begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)}
483 Restituisce informazioni sul sistema nella struttura \param{info}.
485 \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
486 fallimento, nel qual caso \var{errno} viene settata a \macro{EFAULT}.}
489 La funzione, che viene usata dal comando \cmd{uname}, restituisce le
490 informazioni richieste nella struttura \param{info}; anche questa struttura è
491 definita in \file{sys/utsname.h} come:
492 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
494 char sysname[_UTSNAME_LENGTH];
495 char nodename[_UTSNAME_LENGTH];
496 char release[_UTSNAME_LENGTH];
497 char version[_UTSNAME_LENGTH];
498 char machine[_UTSNAME_LENGTH];
500 char domainname[_UTSNAME_DOMAIN_LENGTH];
504 e le informazioni memorizzate nei suoi membri indicano rispettivamente:
506 \item il nome del sistema operativo;
507 \item il nome della release del kernel;
508 \item il nome della versione del kernel;
509 \item il tipo di macchina in uso;
510 \item il nome della stazione;
511 \item il nome del domino.
513 (l'ultima informazione è stata aggiunta di recente e non è prevista dallo
517 \section{Opzioni e configurazione del sistema}
518 \label{sec:sys_config}
520 Come abbiamo accennato nella sezione precedente, non tutti i limiti che
521 caratterizzano il sistema sono fissi, o perlomeno non lo sono in tutte le
522 implementazioni. Finora abbiamo visto come si può fare per leggerli, ci manca
523 di esaminare il meccanismo che permette, quando questi possono variare durante
524 l'esecuzione del sistema, di modificarli.
526 Inoltre, al di la di quelli che possono essere limiti caratteristici previsti
527 da uno standard, ogni sistema può avere una sua serie di altri parametri di
528 configurazione, che, non essendo mai fissi e variando da sistema a sistema,
529 non sono stati inclusi nella standardizzazione della sezione precedente. Per
530 questi occorre, oltre al meccanismo di settaggio, pure un meccanismo di
533 Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si
534 usano per il controllo di altre caratteristiche generali del sistema, come
535 quelle per la gestione dei filesystem e di utenti e gruppi.
538 \subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
539 \label{sec:sys_sysctl}
541 La funzione che permette la lettura ed il settaggio dei parametri del sistema
542 è \func{sysctl}; è una funzione derivata da BSD4.4, ma l'implementazione è
543 specifica di Linux; il suo prototipo è:
546 \headdecl{linux/unistd.h}
547 \headdecl{linux/sysctl.h}
548 \funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void
549 *newval, size\_t newlen)}
551 Legge o scrive uno dei parametri di sistema.
553 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
554 errore, nel qual caso \var{errno} viene settato ai valori:
556 \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei
557 componenti nel cammino specificato per il parametro, o non ha il permesso
558 di accesso al parametro nella modalità scelta.
559 \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome
561 \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
562 \param{oldval} è non nullo.
563 \item[\macro{EINVAL}] o si è specificato un valore non valido per il
564 parametro che si vuole settare o lo spazio provvisto per il ritorno di un
565 valore non è delle giuste dimensioni.
566 \item[\macro{ENOMEM}] talvolta viene usato più correttamente questo errore
567 quando non si è specificato sufficiente spazio per ricevere il valore di un
573 I parametri a cui la funzione permettere di accedere sono organizzati in
574 maniera gerarchica all'interno un albero; per accedere ad uno di essi occorre
575 specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga
576 a come avviene per la risoluzione di un pathname (da cui l'uso alternativo del
577 filesystem \file{/proc} che vedremo dopo).
579 Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che
580 arriva ad identificare un parametro specifico è passato alla funzione
581 attraverso l'array \param{name}, di lunghezza \param{nlen}, che contiene la
582 sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un
583 formato specifico chee può essere un intero, una stringa o anche una struttura
584 complessa, per questo motivo il valori vengono passati come puntatori
587 L'indirizzo a cui il valore corrente del parametro deve essere letto è
588 specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da
589 \param{oldlenp} (passato come puntatore per avere indietro la dimensione
590 effettiva di quanto letto); il valore che si vuole settare nel sistema è
591 passato in \param{newval} e la sua dimensione in \param{newlen}.
593 Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il
594 valore letto restituito dalla funzione è quello precedente alla scrittura.
596 I parametri accessibili attraverso questa funzione sono moltissimi, e possono
597 essere trovati in \file{sysctl.h}, essi inoltre dipendono anche dallo stato
598 corrente del kernel (ad esempio dai moduli che sono stati caricati nel
599 sistema) e in genere i loro nomi possono variare da una versione di kernel
600 all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl}
601 quando esistono modalità alternative per ottenere le stesse informazioni.
602 Alcuni esempi di parametri ottenibili sono:
604 \item il nome di dominio
605 \item i parametri del meccanismo di \textit{paging}.
606 \item il filesystem montato come radice
607 \item la data di compilazione del kernel
608 \item i parametri dello stack TCP
609 \item il numero massimo di file aperti
612 Come accennato in Linux si ha una modalità alternativa per accedere alle
613 stesse informazioni di \func{sysctl} attraverso l'uso del filesystem
614 \file{/proc}. Questo è un filesystem virtuale, generato direttamente dal
615 kernel, che non fa riferimento a nessun dispositivo fisico, ma presenta in
616 forma di file alcune delle strutture interne del kernel stesso.
618 In particolare l'albero dei valori di \func{sysctl} viene presentato in forma
619 di file nella directory \file{/proc/sys}, cosicché è possibile accedervi
620 specificando un pathname e leggendo e scrivendo sul file corrispondente al
621 parametro scelto. Il kernel si occupa di generare al volo il contenuto ed i
622 nomi dei file corrispondenti, e questo ha il grande vantaggio di rendere
623 accessibili i vari parametri a qualunque comando di shell e di permettere la
624 navigazione dell'albero dei valori.
626 Alcune delle corrispondenze con i valori di \func{sysctl} sono riportate nei
627 commenti in \file{linux/sysctl.h}, la informazione disponibile in
628 \file{/proc/sys} è riportata inoltre nella documentazione inclusa nei sorgenti
629 del kernel, nella directory \file{Documentation/sysctl}.
632 \subsection{La gestione delle proprietà dei filesystem}
633 \label{sec:sys_file_config}
635 Come accennato in \secref{sec:file_organization} per poter accedere ai file
636 occorre prima rendere disponibile al sistema il filesystem su cui essi sono
637 memorizzati; l'operazione di attivazione del filesystem è chiamata
638 \textsl{montaggio}, per far questo in Linux\footnote{la funzione è specifica
639 di Linux e non è portabile.} si usa la funzione \func{mount} il cui prototipo
641 \begin{prototype}{sys/mount.h}
642 {mount(const char *source, const char *target, const char *filesystemtype,
643 unsigned long mountflags, const void *data)}
645 Monta il filesystem di tipo \param{filesystemtype} contenuto in \param{source}
646 sulla directory \param{target}.
648 \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
649 fallimento, nel qual caso gli errori comuni a tutti i filesystem che possono
650 essere restituiti in \var{errno} sono:
652 \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
653 \item[\macro{ENODEV}] \param{filesystemtype} non esiste o non è configurato
655 \item[\macro{ENOTBLK}] non si è usato un \textit{block device} per
656 \param{source} quando era richiesto.
657 \item[\macro{EBUSY}] \param{source} è già montato, o non può essere
658 rimontato in read-only perché ci sono ancora file aperti in scrittura, o
659 \param{target} è ancora in uso.
660 \item[\macro{EINVAL}] il device \param{source} presenta un
661 \textit{superblock} non valido, o si è cercato di rimontare un filesystem
662 non ancora montato, o di montarlo senza che \param{target} sia un
663 \type{mount point} o di spostarlo quando \param{target} non è un
664 \type{mount point} o è \file{/}.
665 \item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti
666 del pathname, o si è cercato di montare un filesystem disponibile in sola
667 lettura senza averlo specificato o il device \param{source} è su un
668 filesystem montato con l'opzione \macro{MS\_NODEV}.
669 \item[\macro{ENXIO}] il \textit{major number} del device \param{source} è
671 \item[\macro{EMFILE}] la tabella dei device \textit{dummy} è piena.
673 ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM},
674 \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
677 La funzione monta sulla directory \param{target}, detta \textit{mount point},
678 il filesystem contenuto in \param{source}. In generale un filesystem è
679 contenuto su un disco, e l'operazione di montaggio corrisponde a rendere
680 visibile al sistema il contenuto del suddetto disco, identificato attraverso
681 il file di dispositivo ad esso associato.
683 Ma la struttura del virtual filesystem vista in \secref{sec:file_vfs} è molto
684 più flessibile e può essere usata anche per oggetti diversi da un disco. Ad
685 esempio usando il \textit{loop device} si può montare un file qualunque (come
686 l'immagine di un CD-ROM o di un floppy) che contiene un filesystem, inoltre
687 alcuni filesystem, come \file{proc} o \file{devfs} sono del tutto virtuali, i
688 loro dati sono generati al volo ad ogni lettura, e passati al kernel ad ogni
691 Il tipo di filesystem è specificato da \param{filesystemtype}, che deve essere
692 una delle stringhe riportate in \file{/proc/filesystems}, che contiene
693 l'elenco dei filesystem supportati dal kernel; nel caso si sia indicato uno
694 dei filesystem virtuali, il contenuto di \param{source} viene ignorato.
696 Dopo l'esecuzione della funzione il contenuto del filesystem viene resto
697 disponibile nella directory specificata come \textit{mount point}, il
698 precedente contenuto di detta directory viene mascherato dal contenuto della
699 directory radice del filesystem montato.
701 Dal kernel 2.4.x inoltre è divenuto possibile sia spostare atomicamente un
702 \textit{mount point} da una directory ad un'altra, che montare in diversi
703 \textit{mount point} lo stesso filesystem, che montare più filesystem sullo
704 stesso \textit{mount point} (nel qual caso vale quanto appena detto, e solo il
705 contenuto dell'ultimo filesystem montato sarà visibile).
707 Ciascun filesystem è dotato di caratteristiche specifiche che possono essere
708 attivate o meno, alcune di queste sono generali (anche se non è detto siano
709 disponibili in ogni filesystem), e vengono specificate come opzioni di
710 montaggio con l'argomento \param{mountflags}.
712 In Linux \param{mountflags} deve essere un intero a 32 bit i cui 16 più
713 significativi sono un \textit{magic number}\footnote{cioè un numero speciale
714 usato come identificativo, che nel caso è \code{0xC0ED}; si può usare la
715 costante \macro{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
716 riservata al \textit{magic number}.} mentre i 16 meno significativi sono
717 usati per specificare le opzioni; essi sono usati come maschera binaria e
718 vanno settati con un OR aritmetico della costante \macro{MS\_MGC\_VAL} con i
719 valori riportati in \ntab.
723 \begin{tabular}[c]{|l|r|l|}
725 \textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
728 \macro{MS\_RDONLY} & 1 & monta in sola lettura\\
729 \macro{MS\_NOSUID} & 2 & ignora i bit \acr{suid} e \acr{sgid}\\
730 \macro{MS\_NODEV} & 4 & impedisce l'accesso ai file di dispositivo\\
731 \macro{MS\_NOEXEC} & 8 & impedisce di eseguire programmi \\
732 \macro{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona \\
733 \macro{MS\_REMOUNT} & 32 & rimonta il filesystem cambiando i flag\\
734 \macro{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking} (vedi
735 \secref{sec:file_mand_locking})\\
736 \macro{S\_WRITE} & 128 & scrive normalmente \\
737 \macro{S\_APPEND} & 256 & consente la scrittura solo in \textit{append
738 mode} (vedi \secref{sec:file_sharing})\\
739 \macro{S\_IMMUTABLE} & 512 & impedisce che si possano modificare i file \\
740 \macro{MS\_NOATIME} &1024 & non aggiorna gli \textit{access time} (vedi
741 \secref{sec:file_file_times})\\
742 \macro{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
744 \macro{MS\_BIND} &4096 & monta il filesystem altrove\\
745 \macro{MS\_MOVE} &8192 & sposta atomicamente il punto di montaggio \\
748 \caption{Tabella dei codici dei flag di montaggio di un filesystem.}
749 \label{tab:sys_mount_flags}
752 Per il settaggio delle caratteristiche particolari di ciascun filesystem si
753 usa invece l'argomento \param{data} che serve per passare le ulteriori
754 informazioni necessarie, che ovviamente variano da filesystem a filesystem.
756 La funzione \func{mount} può essere utilizzata anche per effettuare il
757 \textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo
758 alcune delle caratteristiche di funzionamento (ad esempio passare da sola
759 lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei
760 bit di \param{mountflags}, \macro{MS\_REMOUNT}, che se settato specifica che
761 deve essere effettuato il rimontaggio del filesystem (con le opzioni
762 specificate dagli altri bit), anche in questo caso il valore di \param{source}
766 Una volta che non si voglia più utilizzare un certo filesystem è possibile
767 \textsl{smontarlo} usando la funzione \func{umount}, il cui prototipo è:
768 \begin{prototype}{sys/mount.h}{umount(const char *target)}
770 Smonta il filesystem montato sulla directory \param{target}.
772 \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
773 fallimento, nel qual caso \var{errno} viene settata a:
775 \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
776 \item[\macro{EBUSY}] \param{target} è la directory di lavoro di qualche
777 processo, o contiene dei file aperti, o un altro mount point.
779 ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM},
780 \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
782 \noindent la funzione prende il nome della directory su cui il filesystem è
783 montato e non il file o il dispositivo che è stato montato,\footnote{questo è
784 vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate
785 separate e la funzione poteva essere usata anche specificando il file di
786 dispositivo.} in quanto con il kernel 2.4.x è possibile montare lo stesso
787 dispositivo in più punti. Nel caso più di un filesystem sia stato montato
788 sullo stesso \textit{mount point} viene smontato quello che è stato montato
791 Si tenga presente che la funzione fallisce quando il filesystem è
792 \textsl{occupato}, questo avviene quando ci sono ancora file aperti sul
793 filesystem, se questo contiene la directory di lavoro corrente di un qualunque
794 processo o il mount point di un altro filesystem; in questo caso l'errore
795 restituito è \macro{EBUSY}.
797 Linux provvede inoltre una seconda funzione, \func{umount2}, che in alcuni
798 casi permette di forzare lo smontaggio di un filesystem, anche quando questo
799 risulti occupato; il suo prototipo è:
800 \begin{prototype}{sys/mount.h}{umount2(const char *target, int flags)}
802 La funzione è identica a \func{umount} per comportamento e codici di errore,
803 ma con \param{flags} si può specificare se forzare lo smontaggio.
806 Il valore di \param{flags} è una maschera binaria, e al momento l'unico valore
807 definito è il bit \macro{MNT\_FORCE}; gli altri bit devono essere nulli.
808 Specificando \macro{MNT\_FORCE} la funzione cercherà di liberare il filesystem
809 anche se è occupato per via di una delle condizioni descritte in precedenza. A
810 seconda del tipo di filesystem alcune (o tutte) possono essere superate,
811 evitando l'errore di \macro{EBUSY}. In tutti i casi prima dello smontaggio
812 viene eseguita una sincronizzazione dei dati.
814 Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD,
815 ma con una struttura diversa.} utili per ottenere in maniera diretta
816 informazioni riguardo al filesystem su cui si trova un certo file, sono
817 \func{statfs} e \func{fstatfs}, i cui prototipi sono:
819 \headdecl{sys/vfs.h} \funcdecl{int statfs(const char *path, struct statfs
820 *buf)} \funcdecl{int fstatfs(int fd, struct statfs *buf)} Restituisce in
821 \param{buf} le informazioni relative al filesystem su cui è posto il file
824 \bodydesc{Li funzioni restituiscono 0 in caso di successo e -1 in caso di
825 errore, nel qual caso \var{errno} viene settato ai valori:
827 \item[\macro{ENOSYS}] il filesystem su cui si trova il file specificato non
828 supporta la funzione.
830 e \macro{EFAULT} ed \macro{EIO} per entrambe, \macro{EBADF} per
831 \func{fstatfs}, \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
832 \macro{EACCES}, \macro{ELOOP} per \func{statfs}.}
835 Queste funzioni permettono di ottenere una serie di informazioni generali
836 riguardo al filesystem su cui si trova il file specificato; queste vengono
837 restituite una struttura \param{buf} definita come:
838 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
840 long f_type; /* tipo di filesystem */
841 long f_bsize; /* dimensione ottimale dei blocchi di I/O */
842 long f_blocks; /* blocchi totali nel filesystem */
843 long f_bfree; /* blocchi liberi nel filesystem */
844 long f_bavail; /* blocchi liberi agli utenti normali */
845 long f_files; /* inodes totali nel filesystem */
846 long f_ffree; /* inodes liberi nel filesystem */
847 fsid_t f_fsid; /* filesystem id */
848 long f_namelen; /* lunghezza massima dei nomi dei file */
849 long f_spare[6]; /* riservati per uso futuro */
852 ed i campi che sono indefiniti per il filesystem in esame sono settati a zero.
853 I valori del campo \var{f\_type} sono definiti per i vari filesystem nei
854 relativi file di header dei sorgenti del kernel da costanti del tipo
855 \macro{XXX\_SUPER\_MAGIC}, dove \macro{XXX} in genere è il nome del filesystem
858 Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
859 file standard \file{/etc/fstab} e \file{/etc/mtab}, che convenzionalmente sono
860 usati in quasi tutti i sistemi unix per mantenere rispettivamente le
861 informazioni riguardo ai filesystem da montare e a quelli correntemente
862 montati. Le funzioni servono a leggere il contenuto di questi file in
863 opportune strutture \var{struct fstab} e \var{struct mntent}, e, per
864 \file{/etc/mtab} per inserire e rimuovere le voci presenti nel file.
866 In generale si dovrebbero usare queste funzioni (in particolar modo quelle
867 relative a \file{/etc/mtab}), quando si debba scrivere un programma che
868 effettua il montaggio di un filesystem; in realtà in questi casi è molto più
869 semplice invocare direttamente il programma \cmd{mount}, per cui ne
870 tralasceremo la trattazione, rimandando al manuale delle \acr{glibc}
871 \cite{glibc} per la documentazione completa.
874 \subsection{La gestione di utenti e gruppi}
875 \label{sec:sys_user_group}
877 L'ultimo argomento di questa sezione è quello che riguarda le funzioni
878 utilizzate per gestire utenti e gruppi all'interno del sistema.
879 Tradizionalmente l'informazione per la gestione di utenti e gruppi veniva
880 tenuta tutta nei due file di testo \file{/etc/passwd} ed \file{/etc/group};
881 oggi la maggior parte delle distribuzioni di Linux usa la libreria PAM (sigla
882 che sta \textit{Pluggable Authentication Method}) che permette di separare
883 completamente i meccanismi di gestione degli utenti (autenticazione,
884 riconoscimeto, ecc.) dal
888 Lo standard POSIX.1 definisce una serie di funzioni
892 \section{Limitazione ed uso delle risorse}
893 \label{sec:sys_res_limits}
895 In questa sezione esamineremo le funzioni che permettono di esaminare e
896 controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
897 utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
902 \subsection{L'uso delle risorse}
903 \label{sec:sys_resource_use}
908 \subsection{Limiti sulle risorse}
909 \label{sec:sys_resource_limit}
912 \subsection{Le risorse di memoria}
913 \label{sec:sys_memory_res}
916 \subsection{Le risorse di processore}
917 \label{sec:sys_cpu_load}
924 \begin{minipage}[c]{15cm}
925 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
927 struct timeval ru_utime; /* user time used */
928 struct timeval ru_stime; /* system time used */
929 long ru_maxrss; /* maximum resident set size */
930 long ru_ixrss; /* integral shared memory size */
931 long ru_idrss; /* integral unshared data size */
932 long ru_isrss; /* integral unshared stack size */
933 long ru_minflt; /* page reclaims */
934 long ru_majflt; /* page faults */
935 long ru_nswap; /* swaps */
936 long ru_inblock; /* block input operations */
937 long ru_oublock; /* block output operations */
938 long ru_msgsnd; /* messages sent */
939 long ru_msgrcv; /* messages received */
940 long ru_nsignals; ; /* signals received */
941 long ru_nvcsw; /* voluntary context switches */
942 long ru_nivcsw; /* involuntary context switches */
947 \caption{La struttura \var{rusage} per la lettura delle informazioni dei
948 delle risorse usate da un processo.}
949 \label{fig:sys_rusage_struct}
955 \var{tms\_utime}, \var{tms\_stime}, \var{tms\_cutime}, \var{tms\_uetime}
959 \section{La gestione dei tempi del sistema}
962 In questa sezione tratteremo le varie funzioni per la gestione delle
963 date e del tempo in un sistema unix-like, e quelle per convertire i vari
964 tempi nelle differenti rappresentazioni che vengono utilizzate.
967 \subsection{La misura del tempo in Unix}
968 \label{sec:sys_unix_time}
970 Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di
971 dati per la misure dei tempi all'interno del sistema: essi sono
972 rispettivamente chiamati \textit{calendar time} e \textit{process time},
973 secondo le definizioni:
975 \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
976 primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
977 usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
978 Epoch}. Questo tempo viene anche chiamato anche GMT (Greenwich Mean Time)
979 dato che l'UTC corrisponde all'ora locale di Greenwich. È il tempo su cui
980 viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per
981 indicare le date di modifica dei file o quelle di avvio dei processi. Per
982 memorizzare questo tempo è stato riservato il tipo primitivo \type{time\_t}.
983 \item \textit{process time}: detto anche tempo di processore. Viene misurato
984 in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate
985 dal timer di sistema, e che per Linux avvengono ogni centesimo di
986 secondo.\footnote{eccetto per la piattaforma alpha dove avvengono ogni
987 millesimo di secondo.} Il dato primitivo usato per questo tempo è
988 \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di
989 operazione del timer, e corrisponde dunque al numero di tick al secondo. Lo
990 standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK});
991 questo valore può comunque essere ottenuto con \func{sysconf} (vedi
992 \secref{sec:sys_limits}).
995 In genere si usa il \textit{calendar time} per esprimere le date dei file e le
996 informazioni analoghe che riguardano i cosiddetti \textsl{tempi di orologio},
997 che vengono usati ad esempio per i demoni che compiono lavori amministrativi
998 ad ore definite, come \cmd{cron}.
1000 Di solito questo tempo viene convertito automaticamente dal valore in UTC al
1001 tempo locale, utilizzando le opportune informazioni di localizzazione
1002 (specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
1003 mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
1004 dall'orologio hardware del calcolatore.
1006 Anche il \textit{process time} di solito si esprime in secondi, ma provvede una
1007 precisione ovviamente superiore al \textit{calendar time} (la cui granularità
1008 minima è il secondo) e viene usato per tenere conto dei tempi di esecuzione
1009 dei processi. Per ciascun processo il kernel calcola tre tempi diversi:
1010 \begin{description*}
1011 \item[\textit{clock time}]: il tempo \textsl{reale} (viene chiamato anche
1012 \textit{wall clock time}) passato dall'avvio del processo. Chiaramente tale
1013 tempo dipende anche dal carico del sistema e da quanti altri processi
1014 stavano girando nello stesso periodo.
1015 \item[\textit{user time}]: il tempo che la CPU ha impiegato nell'esecuzione
1016 delle istruzioni del processo in user space.
1017 \item[\textit{system time}]: il tempo che la CPU ha impiegato nel kernel per
1018 eseguire delle system call per conto del processo.
1021 In genere la somma di \textit{user time} e \textit{system time} indica il
1022 tempo di processore totale in cui il sistema è stato effettivamente impegnato
1023 nell'eseguire un certo processo e viene chiamato \textit{CPU time}.
1028 \section{La gestione degli errori}
1029 \label{sec:sys_errors}
1031 La gestione degli errori è in genere una materia complessa. Inoltre il modello
1032 utilizzato dai sistema unix-like è basato sull'architettura a processi, e
1033 presenta una serie di problemi nel caso lo si debba usare con i thread.
1034 Esamineremo in questa sezione le sue caratteristiche principali.
1037 \subsection{La variabile \var{errno}}
1038 \label{sec:sys_errno}
1040 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
1041 riportare condizioni di errore, ed è una buona norma di programmazione
1042 controllare sempre che le funzioni chiamate si siano concluse correttamente.
1044 In genere le funzioni di libreria usano un valore speciale per indicare che
1045 c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la
1046 costante \macro{EOF} (a seconda della funzione); ma questo valore segnala solo
1047 che c'è stato un errore, non il tipo di errore.
1049 Per riportare il tipo di errore il sistema usa la variabile globale
1050 \var{errno},\footnote{L'uso di una variabile globale può comportare alcuni
1051 problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
1052 anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
1053 può anche usare una macro, e questo è infatti il modo usato da Linux per
1054 renderla locale ai singoli thread.} definita nell'header \file{errno.h}; la
1055 variabile è in genere definita come \type{volatile} dato che può essere
1056 cambiata in modo asincrono da un segnale (si veda \ref{sec:sig_sigchld} per un
1057 esempio, ricordando quanto trattato in \ref{sec:proc_race_cond}), ma dato che
1058 un manipolatore di segnale scritto bene salva e ripristina il valore della
1059 variabile, di questo non è necessario preoccuparsi nella programmazione
1062 I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
1063 nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
1064 costanti numeriche che identificano i vari errori; essi iniziano tutti per
1065 \macro{E} e si possono considerare come nomi riservati. In seguito faremo
1066 sempre riferimento a tali valori, quando descriveremo i possibili errori
1067 restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
1068 codice relativo ad un valore numerico con l'opzione \cmd{-l}.
1070 Il valore di \var{errno} viene sempre settato a zero all'avvio di un
1071 programma, gran parte delle funzioni di libreria settano \var{errno} ad un
1072 valore diverso da zero in caso di errore. Il valore è invece indefinito in
1073 caso di successo, perché anche se una funzione ha successo, può chiamarne
1074 altre al suo interno che falliscono, modificando così \var{errno}.
1076 Pertanto un valore non nullo di \var{errno} non è sintomo di errore (potrebbe
1077 essere il risultato di un errore precedente) e non lo si può usare per
1078 determinare quando o se una chiamata a funzione è fallita. La procedura da
1079 seguire è sempre quella di controllare \var{errno} immediatamente dopo aver
1080 verificato il fallimento della funzione attraverso il suo codice di ritorno.
1083 \subsection{Le funzioni \func{strerror} e \func{perror}}
1084 \label{sec:sys_strerror}
1086 Benché gli errori siano identificati univocamente dal valore numerico di
1087 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
1088 riportare in opportuni messaggi le condizioni di errore verificatesi. La
1089 prima funzione che si può usare per ricavare i messaggi di errore è
1090 \func{strerror}, il cui prototipo è:
1091 \begin{prototype}{string.h}{char *strerror(int errnum)}
1092 Ritorna una stringa (statica) che descrive l'errore il cui codice è passato
1096 In generale \func{strerror} viene usata passando \var{errno} come parametro;
1097 nel caso si specifichi un codice sbagliato verrà restituito un messaggio di
1098 errore sconosciuto. La funzione utilizza una stringa statica che non deve
1099 essere modificata dal programma e che è utilizzabile solo fino ad una chiamata
1100 successiva a \func{strerror}; nel caso si usino i thread è
1101 provvista\footnote{questa funzione è una estensione GNU, non fa parte dello
1102 standard POSIX.} una versione apposita:
1103 \begin{prototype}{string.h}
1104 {char *strerror\_r(int errnum, char *buff, size\_t size)}
1105 Analoga a \func{strerror} ma ritorna il messaggio in un buffer
1106 specificato da \param{buff} di lunghezza massima (compreso il terminatore)
1110 che utilizza un buffer che il singolo thread deve allocare, per evitare i
1111 problemi connessi alla condivisione del buffer statico. Infine, per completare
1112 la caratterizzazione dell'errore, si può usare anche la variabile
1113 globale\footnote{anche questa è un'estensione GNU.}
1114 \var{program\_invocation\_short\_name} che riporta il nome del programma
1115 attualmente in esecuzione.
1117 Una seconda funzione usata per riportare i codici di errore in maniera
1118 automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
1119 \func{perror}, il cui prototipo è:
1120 \begin{prototype}{stdio.h}{void perror (const char *message)}
1121 Stampa il messaggio di errore relativo al valore corrente di \var{errno}
1122 sullo standard error; preceduto dalla stringa \var{message}.
1124 i messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati
1125 in \capref{cha:errors}), e, usando il valore corrente di \var{errno}, si
1126 riferiscono all'ultimo errore avvenuto. La stringa specificata con
1127 \var{message} viene stampato prime del messaggio d'errore, seguita dai due
1128 punti e da uno spazio, il messaggio è terminato con un a capo.
1130 Il messaggio può essere riportato anche usando altre variabili globali
1131 dichiarate in \file{errno.h}:
1133 const char *sys_errlist[];
1136 la prima contiene i puntatori alle stringhe di errore indicizzati da
1137 \var{errno}; la seconda esprime il valore più alto per un codice di errore,
1138 l'utilizzo di questa stringa è sostanzialmente equivalente a quello di
1141 In \nfig\ è riportata la sezione attinente del codice del programma
1142 \cmd{errcode}, che può essere usato per stampare i messaggi di errore e le
1143 costanti usate per identificare i singoli errori; il sorgente completo del
1144 programma è allegato nel file \file{ErrCode.c} e contiene pure la gestione
1145 delle opzioni e tutte le definizioni necessarie ad associare il valore
1146 numerico alla costante simbolica. In particolare si è riportata la sezione che
1147 converte la stringa passata come parametro in un intero (\texttt{\small
1148 1--2}), controllando con i valori di ritorno di \func{strtol} che la
1149 conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi stampa,
1150 a seconda dell'opzione scelta il messaggio di errore (\texttt{\small 11--14})
1151 o la macro (\texttt{\small 15--17}) associate a quel codice.
1153 \begin{figure}[!htb]
1155 \begin{lstlisting}{}
1156 /* convert string to number */
1157 err = strtol(argv[optind], NULL, 10);
1158 /* testing error condition on conversion */
1159 if (err==LONG_MIN) {
1160 perror("Underflow on error code");
1162 } else if (err==LONG_MIN) {
1163 perror("Overflow on error code");
1166 /* conversion is fine */
1168 printf("Error message for %d is %s\n", err, strerror(err));
1171 printf("Error label for %d is %s\n", err, err_code[err]);
1174 \caption{Codice per la stampa del messaggio di errore standard.}
1175 \label{fig:sys_err_mess}
1180 %%% Local Variables:
1182 %%% TeX-master: "gapil"