3 %% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
12 \chapter{La gestione del sistema, del tempo e degli errori}
15 In questo capitolo tratteremo varie interfacce che attengono agli aspetti più
16 generali del sistema, come quelle per la gestione dei parametri e della
17 configurazione dello stesso, quelle per la lettura dei limiti e delle
18 caratteristiche, quelle per il controllo dell'uso delle risorse dei processi,
19 quelle per la gestione ed il controllo dei filesystem, degli utenti, dei tempi
23 \section{La gestione di catteristiche e parametri del sistema}
24 \label{sec:sys_characteristics}
26 In questa sezione tratteremo le varie modalità con cui un programma può
27 ottenere informazioni riguardo alle capacità del sistema, e, per quelle per
28 cui è possibile, sul come modificarle. Ogni sistema unix-like infatti è
29 contraddistinto da un gran numero di limiti e costanti che lo caratterizzano,
30 e che possono dipendere da fattori molteplici, come l'architettura hardware,
31 l'implementazione del kernel e delle librerie, le opzioni di
32 configurazione. Il kernel inoltre mette a disposizione l'accesso ad alcuni
33 parametri che possono modificarne il comportamento.
35 La definizione di queste caratteristiche ed il tentativo di provvedere dei
36 meccanismi generali che i programmi possono usare per ricavarle è uno degli
37 aspetti più complessi e controversi con cui le diverse standardizzazioni si
38 sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari.
39 Daremo comunque una descrizione dei principali metodi previsti dai vari
40 standard per ricavare sia le caratteristiche specifiche del sistema, che
41 quelle della gestione dei file e prenderemo in esame le modalità con cui è
42 possibile intervenire sui parametri del kernel.
44 \subsection{Limiti e caratteristiche del sistema}
45 \label{sec:sys_limits}
47 Quando si devono determinare le caratteristiche generali del sistema ci si
48 trova di fronte a diverse possibilità; alcune di queste infatti possono
49 dipendere dall'architettura dell'hardware (come le dimensioni dei tipi
50 interi), o dal sistema operativo (come la presenza o meno del gruppo degli
51 identificatori \textit{saved}), altre invece possono dipendere dalle opzioni
52 con cui si è costruito il sistema (ad esempio da come si è compilato il
53 kernel), o dalla configurazione del medesimo; per questo motivo in generale
54 sono necessari due tipi diversi di funzionalità:
56 \item la possibilità di determinare limiti ed opzioni al momento della
58 \item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
61 La prima funzionalità si può ottenere includendo gli opportuni header file che
62 contengono le costanti necessarie definite come macro di preprocessore, per la
63 seconda invece sono ovviamente necessarie delle funzioni. La situazione è
64 complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti
65 sono fissi in un'implementazione mentre possono variare in un altra: tutto
66 questo crea una ambiguità che non è sempre possibile risolvere in maniera
67 chiara. In generale quello che succede è che quando i limiti del sistema sono
68 fissi essi vengono definiti come macro di preprocessore nel file
69 \headfile{limits.h}, se invece possono variare, il loro valore sarà ottenibile
70 tramite la funzione \func{sysconf} (che esamineremo a breve).
75 \begin{tabular}[c]{|l|r|l|}
77 \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
80 \const{MB\_LEN\_MAX}& 16 & Massima dimensione di un
82 \const{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\
83 \const{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\
84 \const{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\
85 \const{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\
86 \const{CHAR\_MIN} & 0 o -128 & Minimo di \ctyp{char}.\footnotemark\\
87 \const{CHAR\_MAX} & 127 o 255 & Massimo di \ctyp{char}.\footnotemark\\
88 \const{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\
89 \const{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\
90 \const{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\
91 \const{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\
92 \const{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\
93 \const{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\
94 \const{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\
95 \const{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\
96 \const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\
99 \caption{Costanti definite in \headfile{limits.h} in conformità allo standard
101 \label{tab:sys_ansic_macro}
104 \footnotetext[1]{il valore può essere 0 o \const{SCHAR\_MIN} a seconda che il
105 sistema usi caratteri con segno o meno.}
107 \footnotetext[2]{il valore può essere \const{UCHAR\_MAX} o \const{SCHAR\_MAX}
108 a seconda che il sistema usi caratteri con segno o meno.}
110 Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo
111 saranno sempre disponibili al momento della compilazione. Un elenco, ripreso
112 da \headfile{limits.h}, è riportato in tab.~\ref{tab:sys_ansic_macro}. Come si
113 può vedere per la maggior parte questi limiti attengono alle dimensioni dei
114 dati interi, che sono in genere fissati dall'architettura hardware, le
115 analoghe informazioni per i dati in virgola mobile sono definite a parte, ed
116 accessibili includendo \headfile{float.h}.
121 \begin{tabular}[c]{|l|r|l|}
123 \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
126 \const{LLONG\_MAX}& 9223372036854775807& Massimo di \ctyp{long long}.\\
127 \const{LLONG\_MIN}&-9223372036854775808& Minimo di \ctyp{long long}.\\
128 \const{ULLONG\_MAX}&18446744073709551615&
129 Massimo di \ctyp{unsigned long long}.\\
132 \caption{Macro definite in \headfile{limits.h} in conformità allo standard
134 \label{tab:sys_isoc90_macro}
137 Lo standard prevede anche un'altra costante, \const{FOPEN\_MAX}, che può non
138 essere fissa e che pertanto non è definita in \headfile{limits.h}, essa deve
139 essere definita in \headfile{stdio.h} ed avere un valore minimo di 8. A questi
140 valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo \ctyp{long
141 long} introdotto con il nuovo standard, i relativi valori sono in
142 tab.~\ref{tab:sys_isoc90_macro}.
144 Ovviamente le dimensioni dei vari tipi di dati sono solo una piccola parte
145 delle caratteristiche del sistema; mancano completamente tutte quelle che
146 dipendono dalla implementazione dello stesso. Queste, per i sistemi unix-like,
147 sono state definite in gran parte dallo standard POSIX.1, che tratta anche i
148 limiti relativi alle caratteristiche dei file che vedremo in
149 sez.~\ref{sec:sys_file_limits}.
154 \begin{tabular}[c]{|l|r|p{8cm}|}
156 \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
159 \const{ARG\_MAX} &131072& Dimensione massima degli argomenti
160 passati ad una funzione della famiglia
162 \const{CHILD\_MAX} & 999& Numero massimo di processi contemporanei
163 che un utente può eseguire.\\
164 \const{OPEN\_MAX} & 256& Numero massimo di file che un processo
165 può mantenere aperti in contemporanea.\\
166 \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
167 processo in contemporanea.\\
168 \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
169 \texttt{timezone} (vedi
170 sez.~\ref{sec:sys_time_base})).\\
171 \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
172 processo (vedi sez.~\ref{sec:proc_access_id}).\\
173 \const{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\
176 \caption{Costanti per i limiti del sistema.}
177 \label{tab:sys_generic_macro}
180 Purtroppo la sezione dello standard che tratta questi argomenti è una delle
181 meno chiare, tanto che Stevens, in \cite{APUE}, la porta come esempio di
182 ``\textsl{standardese}''. Lo standard prevede che ci siano 13 macro che
183 descrivono le caratteristiche del sistema: 7 per le caratteristiche generiche,
184 riportate in tab.~\ref{tab:sys_generic_macro}, e 6 per le caratteristiche dei
185 file, riportate in tab.~\ref{tab:sys_file_macro}.
190 \begin{tabular}[c]{|l|r|p{8cm}|}
192 \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
195 \const{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti
196 passati ad una funzione della famiglia
198 \const{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi
199 contemporanei che un utente può
201 \const{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo
202 può mantenere aperti in
204 \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
205 processo in contemporanea.\\
206 \const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una
207 \textit{timezone} (vedi
208 sez.~\ref{sec:sys_date}). \\
209 \const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali
210 \textit{real-time} (vedi
211 sez.~\ref{sec:sig_real_time}).\\
212 \const{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per
214 sez.~\ref{sec:proc_access_id}).\\
215 \const{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo
217 % \const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
218 % \const{\_POSIX\_AIO\_MAX} & 1& \\
221 \caption{Macro dei valori minimi di alcune caratteristiche generali del
222 sistema per la conformità allo standard POSIX.1.}
223 \label{tab:sys_posix1_general}
226 Lo standard dice che queste macro devono essere definite in
227 \headfile{limits.h} quando i valori a cui fanno riferimento sono fissi, e
228 altrimenti devono essere lasciate indefinite, ed i loro valori dei limiti
229 devono essere accessibili solo attraverso \func{sysconf}. In realtà queste
230 vengono sempre definite ad un valore generico. Si tenga presente poi che
231 alcuni di questi limiti possono assumere valori molto elevati (come
232 \const{CHILD\_MAX}), e non è pertanto il caso di utilizzarli per allocare
233 staticamente della memoria.
235 A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di
236 altre costanti (il cui nome inizia sempre con \code{\_POSIX\_}) che
237 definiscono i valori minimi le stesse caratteristiche devono avere, perché una
238 implementazione possa dichiararsi conforme allo standard, alcuni dei questi
239 valori sono riportati in tab.~\ref{tab:sys_posix1_general}.
241 In genere questi valori non servono a molto, la loro unica utilità è quella di
242 indicare un limite superiore che assicura la portabilità senza necessità di
243 ulteriori controlli. Tuttavia molti di essi sono ampiamente superati in tutti
244 i sistemi POSIX in uso oggigiorno. Per questo è sempre meglio utilizzare i
245 valori ottenuti da \func{sysconf}.
250 \begin{tabular}[c]{|l|p{8cm}|}
252 \textbf{Macro}&\textbf{Significato}\\
255 \macro{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il
256 \textit{job control} (vedi
257 sez.~\ref{sec:sess_job_control}).\\
258 \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del
259 gruppo \textit{saved} (vedi
260 sez.~\ref{sec:proc_access_id})
261 per il controllo di accesso dei processi\\
262 \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1
263 supportata nel formato YYYYMML (ad esempio
267 \caption{Alcune macro definite in \headfile{limits.h} in conformità allo
269 \label{tab:sys_posix1_other}
272 Oltre ai precedenti valori e a quelli relativi ai file elencati in
273 tab.~\ref{tab:sys_posix1_file},, che devono essere obbligatoriamente definiti,
274 lo standard POSIX.1 ne prevede molti altri. La lista completa si trova
275 dall'header file \file{bits/posix1\_lim.h}, da non usare mai direttamente (è
276 incluso automaticamente all'interno di \headfile{limits.h}). Di questi vale la
277 pena menzionarne alcune macro di uso comune, riportate in
278 tab.~\ref{tab:sys_posix1_other}, che non indicano un valore specifico, ma
279 denotano la presenza di alcune funzionalità nel sistema, come il supporto del
280 \textit{job control} o degli identificatori del gruppo \textit{saved}.
282 Oltre allo standard POSIX.1, anche lo standard POSIX.2 definisce una serie di
283 altre costanti. Siccome queste sono principalmente attinenti a limiti relativi
284 alle applicazioni di sistema presenti, come quelli su alcuni parametri delle
285 espressioni regolari o del comando \cmd{bc}, non li tratteremo esplicitamente,
286 se ne trova una menzione completa nell'header file \file{bits/posix2\_lim.h},
287 e alcuni di loro sono descritti nella pagina di manuale di \func{sysconf} e
288 nel manuale delle \acr{glibc}.
290 Quando uno dei limiti o delle caratteristiche del sistema può variare, per non
291 dover essere costretti a ricompilare un programma tutte le volte che si
292 cambiano le opzioni con cui è compilato il kernel, o alcuni dei parametri
293 modificabili al momento dell'esecuzione, è necessario ottenerne il valore
294 attraverso la funzione \funcd{sysconf}, cui prototipo è:
298 \fdecl{long sysconf(int name)}
299 \fdesc{Restituisce il valore di un parametro di sistema.}
302 {La funzione ritorna in caso di successo il valore del parametro richiesto, o
303 1 se si tratta di un'opzione disponibile, 0 se l'opzione non è disponibile e
304 $-1$ per un errore, nel qual caso però \var{errno} non viene impostata.}
307 La funzione prende come argomento un intero che specifica quale dei limiti si
308 vuole conoscere. Uno specchietto contenente i principali valori disponibili in
309 Linux è riportato in tab.~\ref{tab:sys_sysconf_par}, l'elenco completo è
310 contenuto in \file{bits/confname.h}, ed una lista più esaustiva, con le
311 relative spiegazioni, si può trovare nel manuale delle \acr{glibc}.
316 \begin{tabular}[c]{|l|l|p{8cm}|}
318 \textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
321 \texttt{\_SC\_ARG\_MAX} & \const{ARG\_MAX}&
322 La dimensione massima degli argomenti passati
323 ad una funzione della famiglia \func{exec}.\\
324 \texttt{\_SC\_CHILD\_MAX} & \const{CHILD\_MAX}&
325 Il numero massimo di processi contemporanei
326 che un utente può eseguire.\\
327 \texttt{\_SC\_OPEN\_MAX} & \const{OPEN\_MAX}&
328 Il numero massimo di file che un processo può
329 mantenere aperti in contemporanea.\\
330 \texttt{\_SC\_STREAM\_MAX}& \const{STREAM\_MAX}&
331 Il massimo numero di stream che un processo
332 può mantenere aperti in contemporanea. Questo
333 limite previsto anche dallo standard ANSI C,
334 che specifica la macro {FOPEN\_MAX}.\\
335 \texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}&
336 La dimensione massima di un nome di una
337 \texttt{timezone} (vedi
338 sez.~\ref{sec:sys_date}).\\
339 \texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}&
340 Massimo numero di gruppi supplementari che
341 può avere un processo (vedi
342 sez.~\ref{sec:proc_access_id}).\\
343 \texttt{\_SC\_SSIZE\_MAX} & \const{SSIZE\_MAX}&
344 Valore massimo del tipo di dato
346 \texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} &
347 Il numero di \itindex{clock~tick}
348 \textit{clock tick} al secondo,
349 cioè l'unità di misura del
350 \itindex{process~time} \textit{process
352 sez.~\ref{sec:sys_unix_time}).\\
353 \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
354 Indica se è supportato il \textit{job
356 sez.~\ref{sec:sess_job_control}) in stile
358 \texttt{\_SC\_SAVED\_IDS} & \macro{\_POSIX\_SAVED\_IDS}&
359 Indica se il sistema supporta i
360 \textit{saved id} (vedi
361 sez.~\ref{sec:proc_access_id}).\\
362 \texttt{\_SC\_VERSION} & \const{\_POSIX\_VERSION} &
363 Indica il mese e l'anno di approvazione
364 della revisione dello standard POSIX.1 a cui
365 il sistema fa riferimento, nel formato
366 YYYYMML, la revisione più recente è 199009L,
367 che indica il Settembre 1990.\\
370 \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
371 \label{tab:sys_sysconf_par}
374 In generale ogni limite o caratteristica del sistema per cui è definita una
375 macro, sia dagli standard ANSI C e ISO C90, che da POSIX.1 e POSIX.2, può
376 essere ottenuto attraverso una chiamata a \func{sysconf}. Il nome della
377 costante da utilizzare come valore dell'argomento \param{name} si otterrà
378 aggiungendo \code{\_SC\_} ai nomi delle costanti definite dai primi due
379 standard (quelle di tab.~\ref{tab:sys_generic_macro}), o sostituendolo a
380 \code{\_POSIX\_} per le costanti definite dagli altri due standard (quelle di
381 tab.~\ref{tab:sys_posix1_general}).
383 In linea teorica si dovrebbe fare uso di \func{sysconf} solo quando la
384 relativa costante di sistema non è definita, quindi con un codice analogo al
386 \includecodesnip{listati/get_child_max.c}
387 ma in realtà con Linux queste costanti sono comunque definite, indicando però
388 un limite generico che non è detto sia corretto; per questo motivo è sempre
389 meglio usare i valori restituiti da \func{sysconf}.
392 \subsection{Limiti e caratteristiche dei file}
393 \label{sec:sys_file_limits}
395 Come per le caratteristiche generali del sistema anche per i file esistono una
396 serie di limiti (come la lunghezza del nome del file o il numero massimo di
397 link) che dipendono sia dall'implementazione che dal filesystem in uso. Anche
398 in questo caso lo standard prevede alcune macro che ne specificano il valore,
399 riportate in tab.~\ref{tab:sys_file_macro}.
404 \begin{tabular}[c]{|l|r|l|}
406 \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
409 \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\
410 \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\
411 \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\
412 \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe
413 (vedi sez.~\ref{sec:ipc_pipes}).\\
414 \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
415 canonico (vedi sez.~\ref{sec:term_io_design}).\\
416 \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
418 sez.~\ref{sec:term_io_design}).\\
421 \caption{Costanti per i limiti sulle caratteristiche dei file.}
422 \label{tab:sys_file_macro}
425 Come per i limiti di sistema, lo standard POSIX.1 detta una serie di valori
426 minimi anche per queste caratteristiche, che ogni sistema che vuole essere
427 conforme deve rispettare. Le relative macro sono riportate in
428 tab.~\ref{tab:sys_posix1_file} e per esse vale lo stesso discorso fatto per le
429 analoghe di tab.~\ref{tab:sys_posix1_general}.
434 \begin{tabular}[c]{|l|r|l|}
436 \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
439 \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\
440 \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\
441 \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
443 \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
445 \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
446 terminale in modo canonico.\\
447 \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
449 % \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
450 % \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
451 % \const{\_POSIX\_FD\_SETSIZE}& 16 & \\
452 % \const{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
455 \caption{Costanti dei valori minimi delle caratteristiche dei file per la
456 conformità allo standard POSIX.1.}
457 \label{tab:sys_posix1_file}
460 Tutti questi limiti sono definiti in \headfile{limits.h}; come nel caso
461 precedente il loro uso è di scarsa utilità in quanto ampiamente superati in
462 tutte le implementazioni moderne. In generale i limiti per i file sono molto
463 più soggetti ad essere variabili rispetto ai limiti generali del sistema; ad
464 esempio parametri come la lunghezza del nome del file o il numero di link
465 possono variare da filesystem a filesystem.
467 Per questo motivo quando si ha a che fare con limiti relativi ai file questi
468 devono essere sempre controllati con la funzione \funcd{pathconf}, il cui
473 \fdecl{long pathconf(char *path, int name)}
474 \fdesc{Restituisce il valore di un parametro dei file.}
477 {La funzione ritorna il valore del parametro richiesto in caso di successo e
478 $-1$ per un errore, nel qual caso \var{errno} viene impostata ad uno degli
479 errori possibili relativi all'accesso a \param{path}.}
482 La funzione richiede che si specifichi il limite che si vuole controllare con
483 l'argomento \param{name}, per il quale si deve usare la relativa costante
484 identificativa, il cui nome si ottiene da quelle descritte in
485 tab.~\ref{tab:sys_file_macro} e tab.~\ref{tab:sys_posix1_file} con la stessa
486 convenzione già vista con \func{sysconf}, ma un questo caso con l'uso del
487 suffisso ``\texttt{\_PC\_}''.
489 In questo caso la funzione richiede anche un secondo argomento \param{path}
490 che specifichi a quale file si fa riferimento, dato che il valore del limite
491 cercato può variare a seconda del filesystem su cui si trova il file. Una
492 seconda versione della funzione, \funcd{fpathconf}, opera su un file
493 descriptor invece che su un \textit{pathname}, il suo prototipo è:
497 \fdecl{long fpathconf(int fd, int name)}
498 \fdesc{Restituisce il valore di un parametro dei file.}
501 {È identica a \func{pathconf} solo che utilizza un file descriptor invece di
502 un \textit{pathname}; pertanto gli errori restituiti in \var{errno} cambiano
505 \noindent ed il suo comportamento è identico a quello di \func{pathconf} a
506 parte quello di richiedere l'indicazione di un file descriptor
507 nell'argomento \param{fd}.
511 \subsection{I parametri del kernel ed il filesystem \texttt{/proc}}
512 \label{sec:sys_sysctl}
514 Tradizionalmente la funzione che permette la lettura ed l'impostazione dei
515 parametri del sistema è \funcm{sysctl}. Si tratta di una funzione derivata da
516 BSD4.4 ed introdotta su Linux a partire dal kernel 1.3.57, ma oggi il suo uso
517 è totalmente deprecato. Una \textit{system call} \funcm{\_sysctl} continua ad
518 esistere, ma non dispone più di una interfaccia nella \acr{glibc} ed il suo
519 utilizzo può essere effettuato solo tramite \func{syscall}, ma di nuovo questo
520 viene sconsigliato in quanto la funzionalità non è più mantenuta e molto
521 probabilmente sarà rimossa nel prossimo futuro. Per questo motivo eviteremo di
522 trattarne i particolari.
524 Lo scopo di \funcm{sysctl} era quello di fornire ai programmi una modalità per
525 modificare i parametri di sistema. Questi erano organizzati in maniera
526 gerarchica all'interno di un albero e per accedere a ciascuno di essi
527 occorreva specificare un percorso attraverso i vari nodi dell'albero, in
528 maniera analoga a come avviene per la risoluzione di un \textit{pathname}.
530 I parametri accessibili e modificabili attraverso questa funzione sono
531 moltissimi, dipendendo anche dallo stato corrente del kernel, ad esempio dai
532 moduli che sono stati caricati nel sistema. Inoltre non essendo standardizzati
533 i loro nomi possono variare da una versione di kernel all'altra, alcuni esempi
534 di questi parametri sono:
536 \item il nome di dominio
537 \item i parametri del meccanismo di \textit{paging}.
538 \item il filesystem montato come radice
539 \item la data di compilazione del kernel
540 \item i parametri dello stack TCP
541 \item il numero massimo di file aperti
546 \index{file!filesystem~\texttt {/proc}!definizione|(}
548 Dato che fin dall'inizio i parametri erano organizzati in una struttura
549 albero, è parso naturale rimappare questa organizzazione utilizzando il
550 filesystem \file{/proc}. Questo è un filesystem completamente virtuale, il cui
551 contenuto è generato direttamente dal kernel, che non fa riferimento a nessun
552 dispositivo fisico, ma presenta in forma di file e directory i dati di alcune
553 delle strutture interne del kernel stesso. Il suo utilizzo principale, come
554 denuncia il nome stesso, è quello di fornire una interfaccia per ottenere i
555 dati relativi ai processi (venne introdotto a questo scopo su BSD), ma nel
556 corso del tempo il suo uso è stato ampliato.
558 All'interno di questo filesystem sono pertanto presenti una serie di file che
559 riflettono il contenuto dei parametri del kernel (molti dei quali accessibili
560 in sola lettura) e in altrettante directory, nominate secondo il relativo
561 \ids{PID}, vengono mantenute le informazioni relative a ciascun processo
564 In particolare l'albero dei valori dei parametri di sistema impostabili con
565 \func{sysctl} viene presentato in forma di una gerarchia di file e directory a
566 partire dalla directory \file{/proc/sys}, cosicché è possibile accedere al
567 valore di un parametro del kernel tramite il \textit{pathname} ad un file
568 sotto \file{/proc/sys} semplicemente leggendone il contenuto, così come si può
569 modificare un parametro scrivendo sul file ad esso corrispondente.
571 Il kernel si occupa di generare al volo il contenuto ed i nomi dei file
572 corrispondenti ai vari parametri che sono presenti, e questo ha il grande
573 vantaggio di rendere accessibili gli stessi ad un qualunque comando di shell e
574 di permettere la navigazione dell'albero in modo da riconoscere quali
575 parametri sono presenti senza dover cercare un valore all'interno di una
578 Inizialmente l'uso del filesystem \file{/proc} serviva soltanto a replicare
579 l'accesso, con altrettante corrispondenze ai file presenti in
580 \file{/proc/sys}, ai parametri impostabili tradizionalmente con \func{sysctl},
581 ma vista la assoluta naturalità dell'interfaccia, e la sua maggiore
582 efficienza, nelle versioni più recenti del kernel questa è diventata la
583 modalità canonica per modificare i parametri del kernel, evitando di dover
584 ricorrere all'uso di una \textit{system call} specifica che pur essendo ancora
585 presente, prima o poi verrà eliminata.
587 Nonostante la semplificazione nella gestione ottenuta con l'uso di
588 \file{/proc/sys} resta il problema generale di conoscere il significato di
589 ciascuno degli innumerevoli parametri che vi si trovano. Purtroppo la
590 documentazione degli stessi spesso risulta incompleta e non aggiornata, ma
591 buona parte di quelli può importanti sono descritti dalla documentazione
592 inclusa nei sorgenti del kernel, nella directory \file{Documentation/sysctl}.
594 Ma oltre alle informazioni che sostituiscono quelle ottenibili dalla ormai
595 deprecata \func{sysctl} dentro \file{/proc} sono disponibili moltissime altre
596 informazioni, fra cui ad esempio anche quelle fornite dalla funzione di
597 sistema \funcd{uname},\footnote{con Linux ci sono in realtà 3 \textit{system
598 call} diverse per le dimensioni delle stringhe restituite, le prime due
599 usano rispettivamente delle lunghezze di 9 e 65 byte, la terza usa anch'essa
600 65 byte, ma restituisce anche l'ultimo campo, \var{domainname}, con una
601 lunghezza di 257 byte, la \acr{glibc} provvede a mascherare questi dettagli
602 usando la versione più recente disponibile.} il cui prototipo è:
605 \fhead{sys/utsname.h}
606 \fdecl{int uname(struct utsname *info)}
607 \fdesc{Restituisce informazioni generali sul sistema.}
610 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
611 caso \var{errno} può assumere solo il valore \errval{EFAULT}.}
614 La funzione, che viene usata dal comando \cmd{uname}, restituisce una serie di
615 informazioni relative al sistema nelle stringhe che costituiscono i campi
616 della struttura \struct{utsname} (la cui definizione è riportata in
617 fig.~\ref{fig:sys_utsname}) che viene scritta nel buffer puntato
618 dall'argomento \param{info}.
620 \begin{figure}[!ht!b]
621 \footnotesize \centering
622 \begin{minipage}[c]{0.8\textwidth}
623 \includestruct{listati/ustname.h}
626 \caption{La struttura \structd{utsname}.}
627 \label{fig:sys_utsname}
630 Si noti come in fig.~\ref{fig:sys_utsname} le dimensioni delle stringhe di
631 \struct{utsname} non sono specificate. Il manuale delle \acr{glibc} indica
632 due costanti per queste dimensioni, \const{\_UTSNAME\_LENGTH} per i campi
633 standard e \const{\_UTSNAME\_DOMAIN\_LENGTH} per quello relativo al nome di
634 dominio, altri sistemi usano nomi diversi come \const{SYS\_NMLN} o
635 \const{\_SYS\_NMLN} o \const{UTSLEN} che possono avere valori diversi. Dato
636 che il buffer per \struct{utsname} deve essere preallocato l'unico modo per
637 farlo in maniera sicura è allora usare come dimensione il valore ottenuto con
638 \code{sizeof(utsname)}.
640 Le informazioni vengono restituite in ciascuno dei singoli campi di
641 \struct{utsname} in forma di stringhe terminate dal carattere NUL. In
642 particolare dette informazioni sono:
644 \item il nome del sistema operativo;
645 \item il nome della macchine (l'\textit{hostname});
646 \item il nome della release del kernel;
647 \item il nome della versione del kernel;
648 \item il tipo di hardware della macchina;
649 \item il nome del domino (il \textit{domainname});
651 ma l'ultima di queste informazioni è stata aggiunta di recente e non è
652 prevista dallo standard POSIX, per questo essa è accessibile, come mostrato in
653 fig.~\ref{fig:sys_utsname}, solo se si è definita la macro
654 \macro{\_GNU\_SOURCE}.
656 Come accennato queste stesse informazioni, anche se a differenza di
657 \func{sysctl} la funzione continua ad essere mantenuta, si possono ottenere
658 direttamente tramite il filesystem \file{/proc}, esse infatti sono mantenute
659 rispettivamente nei file \sysctlrelfile{kernel}{ostype},
660 \sysctlrelfile{kernel}{hostname}, \sysctlrelfile{kernel}{osrelease},
661 \sysctlrelfile{kernel}{version} e \sysctlrelfile{kernel}{domainname} che si
662 trovano sotto la directory \file{/proc/sys/kernel/}.
664 \index{file!filesystem~\texttt {/proc}!definizione|)}
668 \section{La gestione del sistema}
669 \label{sec:sys_management}
671 In questa sezione prenderemo in esame le interfacce di programmazione messe a
672 disposizione per affrontare una serie di tematiche attinenti la gestione
673 generale del sistema come quelle relative alla gestione di utenti e gruppi, al
674 trattamento delle informazioni relative ai collegamenti al sistema, alle
675 modalità per effettuare lo spegnimento o il riavvio di una macchina.
678 \subsection{La gestione delle informazioni su utenti e gruppi}
679 \label{sec:sys_user_group}
681 Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
682 (password, corrispondenze fra nomi simbolici e \ids{UID} numerici, home
683 directory, ecc.) venivano registrate all'interno dei due file di testo
684 \conffile{/etc/passwd} ed \conffile{/etc/group}, il cui formato è descritto
685 dalle relative pagine del manuale\footnote{nella quinta sezione, quella dei
686 file di configurazione (esistono comandi corrispondenti), una trattazione
687 sistemistica dell'intero argomento coperto in questa sezione si consulti
688 sez.~4.3 di \cite{AGL}.} e tutte le funzioni che richiedevano l'accesso a
689 queste informazione andavano a leggere direttamente il contenuto di questi
692 In realtà oltre a questi due file da molto tempo gran parte dei sistemi
693 unix-like usano il cosiddetto sistema delle \textit{shadow password} che
694 prevede anche i due file \conffile{/etc/shadow} e \conffile{/etc/gshadow}, in
695 cui sono state spostate le informazioni di autenticazione (ed inserite alcune
696 estensioni di gestione avanzata) per toglierle dagli altri file che devono
697 poter essere letti da qualunque processo per poter effettuare l'associazione
698 fra username e \ids{UID}.
700 Col tempo però questa impostazione ha incominciato a mostrare dei limiti. Da
701 una parte il meccanismo classico di autenticazione è stato ampliato, ed oggi
702 la maggior parte delle distribuzioni di GNU/Linux usa la libreria PAM (sigla
703 che sta per \textit{Pluggable Authentication Method}) che fornisce una
704 interfaccia comune per i processi di autenticazione, svincolando completamente
705 le singole applicazioni dai dettagli del come questa viene eseguita e di dove
706 vengono mantenuti i dati relativi. Si tratta di un sistema modulare, in cui è
707 possibile utilizzare anche più meccanismi insieme, diventa così possibile
708 avere vari sistemi di riconoscimento (biometria, chiavi hardware, ecc.),
709 diversi formati per le password e diversi supporti per le informazioni. Il
710 tutto avviene in maniera trasparente per le applicazioni purché per ciascun
711 meccanismo si disponga della opportuna libreria che implementa l'interfaccia
714 Dall'altra parte, il diffondersi delle reti e la necessità di centralizzare le
715 informazioni degli utenti e dei gruppi per insiemi di macchine e servizi
716 all'interno di una stessa organizzazione, in modo da mantenere coerenti i
717 dati, ha portato anche alla necessità di poter recuperare e memorizzare dette
718 informazioni su supporti diversi dai file citati, introducendo il sistema del
719 \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} che
720 tratteremo brevemente più avanti (in sez.~\ref{sec:sock_resolver}) dato che la
721 sua applicazione è cruciale nella procedura di risoluzione di nomi di rete.
723 In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche
724 per la lettura delle informazioni relative a utenti e gruppi tralasciando
725 completamente quelle relative all'autenticazione.
726 % Per questo non tratteremo
727 % affatto l'interfaccia di PAM, ma approfondiremo invece il sistema del
728 % \textit{Name Service Switch}, un meccanismo messo a disposizione dalle
729 % \acr{glibc} per modularizzare l'accesso a tutti i servizi in cui sia
730 % necessario trovare una corrispondenza fra un nome ed un numero (od altra
731 % informazione) ad esso associato, come appunto, quella fra uno username ed un
732 % \ids{UID} o fra un \ids{GID} ed il nome del gruppo corrispondente.
733 Le prime funzioni che vedremo sono quelle previste dallo standard POSIX.1;
734 queste sono del tutto generiche e si appoggiano direttamente al \textit{Name
735 Service Switch}, per cui sono in grado di ricevere informazioni qualunque
736 sia il supporto su cui esse vengono mantenute. Per leggere le informazioni
737 relative ad un utente si possono usare due funzioni, \funcd{getpwuid} e
738 \funcd{getpwnam}, i cui prototipi sono:
743 \fdecl{struct passwd *getpwuid(uid\_t uid)}
744 \fdecl{struct passwd *getpwnam(const char *name)}
745 \fdesc{Restituiscono le informazioni relative all'utente specificato.}
748 {Le funzioni ritornano il puntatore alla struttura contenente le informazioni
749 in caso di successo e \val{NULL} nel caso non sia stato trovato nessun
750 utente corrispondente a quanto specificato, nel qual caso \var{errno}
751 assumerà il valore riportato dalle funzioni di sistema sottostanti.}
754 Le due funzioni forniscono le informazioni memorizzate nel registro degli
755 utenti (che nelle versioni più recenti per la parte di credenziali di
756 autenticazione vengono ottenute attraverso PAM) relative all'utente
757 specificato attraverso il suo \ids{UID} o il nome di login. Entrambe le
758 funzioni restituiscono un puntatore ad una struttura di tipo \struct{passwd}
759 la cui definizione (anch'essa eseguita in \headfile{pwd.h}) è riportata in
760 fig.~\ref{fig:sys_passwd_struct}, dove è pure brevemente illustrato il
761 significato dei vari campi.
766 \begin{minipage}[c]{0.8\textwidth}
767 \includestruct{listati/passwd.h}
770 \caption{La struttura \structd{passwd} contenente le informazioni relative
771 ad un utente del sistema.}
772 \label{fig:sys_passwd_struct}
775 La struttura usata da entrambe le funzioni è allocata staticamente, per questo
776 motivo viene sovrascritta ad ogni nuova invocazione, lo stesso dicasi per la
777 memoria dove sono scritte le stringhe a cui i puntatori in essa contenuti
778 fanno riferimento. Ovviamente questo implica che dette funzioni non possono
779 essere \index{funzioni!rientranti} rientranti; per questo motivo ne esistono
780 anche due versioni alternative (denotate dalla solita estensione \code{\_r}),
781 i cui prototipi sono:
786 \fdecl{struct passwd *getpwuid\_r(uid\_t uid, struct passwd *password,
787 char *buffer, size\_t buflen, struct passwd **result)}
788 \fdecl{struct passwd *getpwnam\_r(const char *name, struct passwd
789 *password, char *buffer, size\_t buflen, struct passwd **result)}
790 \fdesc{Restituiscono le informazioni relative all'utente specificato.}
793 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
794 caso \var{errno} assumerà il valore riportato dalle di sistema funzioni
798 In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
799 la memoria necessaria a contenere le informazioni. In particolare i valori
800 della struttura \struct{passwd} saranno restituiti all'indirizzo
801 \param{password} mentre la memoria allocata all'indirizzo \param{buffer}, per
802 un massimo di \param{buflen} byte, sarà utilizzata per contenere le stringhe
803 puntate dai campi di \param{password}. Infine all'indirizzo puntato da
804 \param{result} viene restituito il puntatore ai dati ottenuti, cioè
805 \param{buffer} nel caso l'utente esista, o \val{NULL} altrimenti. Qualora i
806 dati non possano essere contenuti nei byte specificati da \param{buflen}, la
807 funzione fallirà restituendo \errcode{ERANGE} (e \param{result} sarà comunque
808 impostato a \val{NULL}).
810 Sia queste versioni rientranti che precedenti gli errori eventualmente
811 riportati in \var{errno} in caso di fallimento dipendono dalla sottostanti
812 funzioni di sistema usate per ricavare le informazioni (si veda quanto
813 illustrato in sez.~\ref{sec:sys_errno}) per cui se lo si vuole utilizzare è
814 opportuno inizializzarlo a zero prima di invocare le funzioni per essere
815 sicuri di non avere un residuo di errore da una chiamata precedente. Il non
816 aver trovato l'utente richiesto infatti può essere dovuto a diversi motivi (a
817 partire dal fatto che non esista) per cui si possono ottenere i valori di
818 errore più vari a seconda dei casi.
820 Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e
821 \funcd{getgrgid} che permettono di leggere le informazioni relative ai gruppi,
822 i loro prototipi sono:
827 \fdecl{struct group *getgrgid(gid\_t gid)}
828 \fdecl{struct group *getgrnam(const char *name)}
829 \fdesc{Restituiscono le informazioni relative al gruppo specificato.}
832 {Le funzioni ritornano il puntatore alla struttura contenente le informazioni
833 in caso di successo e \val{NULL} nel caso non sia stato trovato nessun
834 utente corrispondente a quanto specificato, nel qual caso \var{errno}
835 assumerà il valore riportato dalle funzioni di sistema sottostanti.}
838 Come per le precedenti per gli utenti esistono anche le analoghe versioni
839 \index{funzioni!rientranti} rientranti che di nuovo utilizzano la stessa
840 estensione \code{\_r}; i loro prototipi sono:
845 \fdecl{int getgrgid\_r(gid\_t gid, struct group *grp, char *buf,
846 size\_t buflen, struct group **result)}
847 \fdecl{int getgrnam\_r(const char *name, struct group *grp, char *buf,
848 size\_t buflen, struct group **result)}
849 \fdesc{Restituiscono le informazioni relative al gruppo specificato.}
852 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
853 caso \var{errno} assumerà il valore riportato dalle funzioni di sistema
858 Il comportamento di tutte queste funzioni è assolutamente identico alle
859 precedenti che leggono le informazioni sugli utenti, l'unica differenza è che
860 in questo caso le informazioni vengono restituite in una struttura di tipo
861 \struct{group}, la cui definizione è riportata in
862 fig.~\ref{fig:sys_group_struct}.
867 \begin{minipage}[c]{0.8\textwidth}
868 \includestruct{listati/group.h}
871 \caption{La struttura \structd{group} contenente le informazioni relative ad
872 un gruppo del sistema.}
873 \label{fig:sys_group_struct}
876 Le funzioni viste finora sono in grado di leggere le informazioni sia
877 direttamente dal file delle password in \conffile{/etc/passwd} che tramite il
878 sistema del \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} e
879 sono completamente generiche. Si noti però che non c'è una funzione che
880 permetta di impostare direttamente una password.\footnote{in realtà questo può
881 essere fatto ricorrendo alle funzioni della libreria PAM, ma questo non è un
882 argomento che trattremo qui.} Dato che POSIX non prevede questa possibilità
883 esiste un'altra interfaccia che lo fa, derivata da SVID le cui funzioni sono
884 riportate in tab.~\ref{tab:sys_passwd_func}. Questa interfaccia però funziona
885 soltanto quando le informazioni sono mantenute su un apposito file di
886 \textsl{registro} di utenti e gruppi, con il formato classico di
887 \conffile{/etc/passwd} e \conffile{/etc/group}.
892 \begin{tabular}[c]{|l|p{8cm}|}
894 \textbf{Funzione} & \textbf{Significato}\\
897 \funcm{fgetpwent} & Legge una voce dal file di registro degli utenti
899 \funcm{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti}
901 \funcm{putpwent} & Immette una voce in un file di registro degli
903 \funcm{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\
904 \funcm{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti}
906 \funcm{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\
907 \funcm{endpwent} & Chiude \conffile{/etc/passwd}.\\
908 \funcm{fgetgrent} & Legge una voce dal file di registro dei gruppi
910 \funcm{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti}
912 \funcm{putgrent} & Immette una voce in un file di registro dei gruppi.\\
913 \funcm{getgrent} & Legge una voce da \conffile{/etc/group}.\\
914 \funcm{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti}
916 \funcm{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\
917 \funcm{endgrent} & Chiude \conffile{/etc/group}.\\
920 \caption{Funzioni per la manipolazione dei campi di un file usato come
921 registro per utenti o gruppi nel formato di \conffile{/etc/passwd} e
922 \conffile{/etc/group}.}
923 \label{tab:sys_passwd_func}
926 % TODO mancano i prototipi di alcune delle funzioni
928 Dato che oramai tutte le distribuzioni di GNU/Linux utilizzano le
929 \textit{shadow password} (quindi con delle modifiche rispetto al formato
930 classico del file \conffile{/etc/passwd}), si tenga presente che le funzioni
931 di questa interfaccia che permettono di scrivere delle voci in un
932 \textsl{registro} degli utenti (cioè \func{putpwent} e \func{putgrent}) non
933 hanno la capacità di farlo specificando tutti i contenuti necessari rispetto a
936 Per questo motivo l'uso di queste funzioni è deprecato, in quanto comunque non
937 funzionale rispetto ad un sistema attuale, pertanto ci limiteremo a fornire
938 soltanto l'elenco di tab.~\ref{tab:sys_passwd_func}, senza nessuna spiegazione
939 ulteriore. Chi volesse insistere ad usare questa interfaccia può fare
940 riferimento alle pagine di manuale delle rispettive funzioni ed al manuale
941 delle \acr{glibc} per i dettagli del funzionamento.
945 \subsection{Il registro della \textsl{contabilità} degli utenti}
946 \label{sec:sys_accounting}
948 Un altro insieme di funzioni relative alla gestione del sistema che
949 esamineremo è quello che permette di accedere ai dati del registro della
950 cosiddetta \textsl{contabilità} (o \textit{accounting}) degli utenti. In esso
951 vengono mantenute una serie di informazioni storiche relative sia agli utenti
952 che si sono collegati al sistema, tanto per quelli correntemente collegati,
953 che per la registrazione degli accessi precedenti, sia relative all'intero
954 sistema, come il momento di lancio di processi da parte di \cmd{init}, il
955 cambiamento dell'orologio di sistema, il cambiamento di runlevel o il riavvio
958 I dati vengono usualmente memorizzati nei due file \file{/var/run/utmp} e
959 \file{/var/log/wtmp}. che sono quelli previsti dal \textit{Linux Filesystem
960 Hierarchy Standard}, adottato dalla gran parte delle distribuzioni. Quando
961 un utente si collega viene aggiunta una voce a \file{/var/run/utmp} in cui
962 viene memorizzato il nome di login, il terminale da cui ci si collega,
963 l'\ids{UID} della shell di login, l'orario della connessione ed altre
964 informazioni. La voce resta nel file fino al logout, quando viene cancellata
965 e spostata in \file{/var/log/wtmp}.
967 In questo modo il primo file viene utilizzato per registrare chi sta
968 utilizzando il sistema al momento corrente, mentre il secondo mantiene la
969 registrazione delle attività degli utenti. A quest'ultimo vengono anche
970 aggiunte delle voci speciali per tenere conto dei cambiamenti del sistema,
971 come la modifica del runlevel, il riavvio della macchina, ecc. Tutte queste
972 informazioni sono descritte in dettaglio nel manuale delle \acr{glibc}.
974 Questi file non devono mai essere letti direttamente, ma le informazioni che
975 contengono possono essere ricavate attraverso le opportune funzioni di
976 libreria. Queste sono analoghe alle precedenti funzioni (vedi
977 tab.~\ref{tab:sys_passwd_func}) usate per accedere al registro degli utenti,
978 solo che in questo caso la struttura del registro della \textsl{contabilità} è
979 molto più complessa, dato che contiene diversi tipi di informazione.
981 Le prime tre funzioni, \funcd{setutent}, \funcd{endutent} e \funcd{utmpname}
982 servono rispettivamente a aprire e a chiudere il file che contiene il registro
983 della \textsl{contabilità} degli, e a specificare su quale file esso viene
984 mantenuto. I loro prototipi sono:
988 \fdecl{void utmpname(const char *file)}
989 \fdesc{Specifica il file da usare come registro.}
990 \fdecl{void setutent(void)}
991 \fdesc{Apre il file del registro.}
992 \fdecl{void endutent(void)}
993 \fdesc{Chiude il file del registro.}
996 {Le funzioni non ritornano nulla.}
999 Si tenga presente che le funzioni non restituiscono nessun valore, pertanto
1000 non è possibile accorgersi di eventuali errori, ad esempio se si è impostato
1001 un nome di file sbagliato con \func{utmpname}.
1003 Nel caso non si sia utilizzata \func{utmpname} per specificare un file di
1004 registro alternativo, sia \func{setutent} che \func{endutent} operano usando
1005 il default che è \sysfile{/var/run/utmp} il cui nome, così come una serie di
1006 altri valori di default per i \textit{pathname} di uso più comune, viene
1007 mantenuto nei valori di una serie di costanti definite includendo
1008 \headfile{paths.h}, in particolare quelle che ci interessano sono:
1009 \begin{basedescript}{\desclabelwidth{2.0cm}}
1010 \item[\const{\_PATH\_UTMP}] specifica il file che contiene il registro per gli
1011 utenti correntemente collegati, questo è il valore che viene usato se non si
1012 è utilizzato \func{utmpname} per modificarlo;
1013 \item[\const{\_PATH\_WTMP}] specifica il file che contiene il registro per
1014 l'archivio storico degli utenti collegati;
1016 che nel caso di Linux hanno un valore corrispondente ai file
1017 \sysfile{/var/run/utmp} e \sysfile{/var/log/wtmp} citati in precedenza.
1019 Una volta aperto il file del registro degli utenti si può eseguire una
1020 scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent},
1021 \funcd{getutid}, \funcd{getutline} e \funcd{pututline}, i cui prototipi sono:
1026 \fdecl{struct utmp *getutent(void)}
1027 \fdesc{Legge una voce dalla posizione corrente nel registro.}
1028 \fdecl{struct utmp *getutid(struct utmp *ut)}
1029 \fdesc{Ricerca una voce sul registro.}
1030 \fdecl{struct utmp *getutline(struct utmp *ut)}
1031 \fdesc{Ricerca una voce sul registro attinente a un terminale.}
1032 \fdecl{struct utmp *pututline(struct utmp *ut)}
1033 \fdesc{Scrive una voce nel registro.}
1036 {Le funzioni ritornano il puntatore ad una struttura \struct{utmp} in caso di
1037 successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà
1038 il valore riportato dalle funzioni di sistema sottostanti.}
1041 Tutte queste funzioni fanno riferimento ad una struttura di tipo
1042 \struct{utmp}, la cui definizione in Linux è riportata in
1043 fig.~\ref{fig:sys_utmp_struct}. Le prime tre funzioni servono per leggere una
1044 voce dal registro: \func{getutent} legge semplicemente la prima voce
1045 disponibile, le altre due permettono di eseguire una ricerca. Aprendo il
1046 registro con \func{setutent} ci si posiziona al suo inizio, ogni chiamata di
1047 queste funzioni eseguirà la lettura sulle voci seguenti, portanto la posizione
1048 sulla voce appena letta, in modo da consentire una scansione del file. Questo
1049 vale anche per \func{getutid} e \func{getutline}, il che comporta che queste
1050 funzioni effettuano comunque una ricerca ``\textsl{in avanti}''.
1052 \begin{figure}[!htb]
1055 \begin{minipage}[c]{0.9\textwidth}
1056 \includestruct{listati/utmp.h}
1059 \caption{La struttura \structd{utmp} contenente le informazioni di una voce
1060 del registro di \textsl{contabilità}.}
1061 \label{fig:sys_utmp_struct}
1064 Con \func{getutid} si può cercare una voce specifica, a seconda del valore del
1065 campo \var{ut\_type} dell'argomento \param{ut}. Questo può assumere i valori
1066 riportati in tab.~\ref{tab:sys_ut_type}, quando assume i valori
1067 \const{RUN\_LVL}, \const{BOOT\_TIME}, \const{OLD\_TIME}, \const{NEW\_TIME},
1068 verrà restituito la prima voce che corrisponde al tipo determinato; quando
1069 invece assume i valori \const{INIT\_PROCESS}, \const{LOGIN\_PROCESS},
1070 \const{USER\_PROCESS} o \const{DEAD\_PROCESS} verrà restituita la prima voce
1071 corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}.
1076 \begin{tabular}[c]{|l|p{8cm}|}
1078 \textbf{Valore} & \textbf{Significato}\\
1081 \const{EMPTY} & Non contiene informazioni valide.\\
1082 \const{RUN\_LVL} & Identica il runlevel del sistema.\\
1083 \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\
1084 \const{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
1086 \const{NEW\_TIME} & Identifica da quanto è stato modificato il
1088 \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\
1089 \const{LOGIN\_PROCESS}& Identifica un processo di login.\\
1090 \const{USER\_PROCESS} & Identifica un processo utente.\\
1091 \const{DEAD\_PROCESS} & Identifica un processo terminato.\\
1092 % \const{ACCOUNTING} & ??? \\
1095 \caption{Classificazione delle voci del registro a seconda dei
1096 possibili valori del campo \var{ut\_type}.}
1097 \label{tab:sys_ut_type}
1100 La funzione \func{getutline} esegue la ricerca sulle voci che hanno
1101 \var{ut\_type} uguale a \const{LOGIN\_PROCESS} o \const{USER\_PROCESS},
1102 restituendo la prima che corrisponde al valore di \var{ut\_line}, che
1103 specifica il dispositivo di terminale che interessa, da indicare senza il
1104 \file{/dev/} iniziale. Lo stesso criterio di ricerca è usato da
1105 \func{pututline} per trovare uno spazio dove inserire la voce specificata;
1106 qualora questo spazio non venga trovato la voce viene aggiunta in coda al
1109 In generale occorre però tenere conto che queste funzioni non sono
1110 completamente standardizzate, e che in sistemi diversi possono esserci
1111 differenze; ad esempio \func{pututline} restituisce \code{void} in vari
1112 sistemi (compreso Linux, fino alle \acr{libc5}). Qui seguiremo la sintassi
1113 fornita dalle \acr{glibc}, ma gli standard POSIX 1003.1-2001 e XPG4.2 hanno
1114 introdotto delle nuove strutture (e relativi file) di tipo \struct{utmpx}, che
1115 sono un sovrainsieme della \struct{utmp} usata tradizionalmente ed altrettante
1116 funzioni che le usano al posto di quelle citate.
1118 Le \acr{glibc} utilizzavano già una versione estesa di \struct{utmp}, che
1119 rende inutili queste nuove strutture, per questo su Linux \struct{utmpx} viene
1120 definita esattamente come \struct{utmp}, con gli stessi campi di
1121 fig.~\ref{fig:sys_utmp_struct}. Altrettanto dicasi per le nuove funzioni di
1122 gestione previste dallo standard: \funcm{getutxent}, \funcm{getutxid},
1123 \funcm{getutxline}, \funcm{pututxline}, \funcm{setutxent} e \funcm{endutxent}.
1125 Tutte queste funzioni, definite con \struct{utmpx} dal file di dichiarazione
1126 \headfile{utmpx.h}, su Linux sono ridefinite come sinonimi delle funzioni
1127 appena viste, con argomento di tipo \struct{utmpx} anziché \struct{utmp} ed
1128 hanno lo stesso identico comportamento. Per completezza viene definita anche
1129 \funcm{utmpxname} che non è prevista da POSIX.1-2001.
1131 Come già visto in sez.~\ref{sec:sys_user_group}, l'uso di strutture allocate
1132 staticamente rende le funzioni di lettura dei dati appena illustrate non
1133 \index{funzioni!rientranti} rientranti. Per questo motivo le \acr{glibc}
1134 forniscono anche delle versioni \index{funzioni!rientranti} rientranti:
1135 \func{getutent\_r}, \func{getutid\_r}, \func{getutline\_r}, che invece di
1136 restituire un puntatore restituiscono un intero e prendono due argomenti
1137 aggiuntivi, i rispettivi prototipi sono:
1141 \fdecl{int *getutent\_r(struct utmp *buffer, struct utmp **result)}
1142 \fdesc{Legge una voce dalla posizione corrente nel registro.}
1143 \fdecl{int *getutid\_r(struct utmp *buffer, struct utmp **result, struct utmp
1145 \fdesc{Ricerca una voce sul registro.}
1146 \fdecl{int *getutline\_r(struct utmp *buffer, struct utmp **result, struct utmp
1148 \fdesc{Ricerca una voce sul registro attinente a un terminale.}
1151 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
1152 caso \var{errno} assumerà il valore riportato dalle funzioni di sistema
1156 Le funzioni si comportano esattamente come le precedenti analoghe non
1157 \index{funzioni!rientranti} rientranti, solo che restituiscono il risultato
1158 all'indirizzo specificato dal primo argomento aggiuntivo \param{buffer} mentre
1159 il secondo, \param{result)} viene usato per restituire il puntatore al buffer
1162 Infine le \acr{glibc} forniscono altre due funzioni, \funcd{updwtmp} e
1163 \funcd{logwtmp}, come estensione per scrivere direttamente delle voci nel file
1164 sul registro storico \sysfile{/var/log/wtmp}; i rispettivi prototipi sono:
1168 \fdecl{void updwtmp(const char *wtmp\_file, const struct utmp *ut)}
1169 \fdesc{Aggiunge una voce in coda al registro.}
1170 \fdecl{void logwtmp(const char *line, const char *name, const char *host)}
1171 \fdesc{Aggiunge nel registro una voce con i valori specificati.}
1174 {Le funzioni non restituiscono nulla.}
1177 La prima funzione permette l'aggiunta di una voce in coda al file del registro
1178 storico, indicato dal primo argomento, specificando direttamente una struttura
1179 \struct{utmp}. La seconda invece utilizza gli argomenti \param{line},
1180 \param{name} e \param{host} per costruire la voce che poi aggiunge chiamando
1183 Queste funzioni non sono previste da POSIX.1-2001, anche se sono presenti in
1184 altri sistemi (ad esempio Solaris e NetBSD), per mantenere una coerenza con le
1185 altre funzioni definite nello standard che usano la struttura \struct{utmpx}
1186 la \acr{glibc} definisce anche una funzione \funcm{updwtmpx}, che come in
1187 precedenza è identica a \func{updwtmp} con la sola differenza di richiedere
1188 l'uso di \headfile{utmpx.h} e di una struttura \struct{utmpx} come secondo
1192 \subsection{La gestione dello spegnimento e del riavvio}
1193 \label{sec:sys_reboot}
1195 Una delle operazioni di gestione generale del sistema è quella che attiene
1196 alle modalità con cui se ne può gestire lo spegnimento ed il riavvio. Perché
1197 questo avvenga in maniera corretta, in particolare per le parti che comportano
1198 lo spegnimento effettivo della macchina, occorre che il kernel effettui le
1199 opportune operazioni interagendo con il BIOS ed i dispositivi che controllano
1200 l'erogazione della potenza.
1202 Ia funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri
1203 aspetti della relativa procedura) è \funcd{reboot},\footnote{la funzione
1204 illustrata è quella fornita dalla \acr{glibc} che maschera i dettagli di
1205 basso livello della \textit{system call} la quale richiede attualmente tre
1206 argomenti; fino al kernel 2.1.30 la \textit{system call} richiedeva un
1207 ulteriore quarto argomento, i primi due indicano dei \textit{magic number}
1208 interi che possono assumere solo alcuni valori predefiniti, il terzo un
1209 comando, corrispondente all'unico argomento della funzione della \acr{glibc}
1210 ed il quarto argomento aggiuntivo, ora ignorato, un puntatore generico ad
1211 ulteriori dati.} il cui prototipo è:
1215 \fhead{sys/reboot.h}
1216 \fdecl{int reboot(int cmd)}
1217 \fdesc{Controlla il riavvio o l'arresto della macchina.}
1220 {La funzione non ritorna o ritorna $0$ in caso di successo e $-1$ per un
1221 errore, nel qual caso \var{errno} assumerà uno dei valori:
1223 \item[\errcode{EFAULT}] c'è un indirizzo non valido nel passaggio degli
1224 argomenti con il comando \const{LINUX\_REBOOT\_CMD\_RESTART2} (obsoleto).
1225 \item[\errcode{EINVAL}] si sono specificati valori non validi per gli
1227 \item[\errcode{EPERM}] il chiamante non ha i privilegi di amministratore (la
1228 \textit{capability} \const{CAP\_SYS\_BOOT}).
1233 La funzione, oltre al riavvio ed allo spegnimento, consente anche di
1234 controllare l'uso della combinazione di tasti tradizionalmente usata come
1235 scorciatoia da tastiera per richiedere il riavvio (\texttt{Ctrl-Alt-Del},
1236 denominata in breve nella documentazione CAD) ed i suoi effetti specifici
1237 dipendono dalla architettura hardware. Se si è richiesto un riavvio o uno
1238 spegnimento in caso di successo la funzione, non esistendo più il programma,
1239 ovviamente non ritorna, pertanto bisogna avere cura di aver effettuato tutte
1240 le operazioni preliminari allo spegnimento prima di eseguirla.
1242 Il comportamento della funzione viene controllato dall'argomento \param{cmd}
1243 e deve assumere indicato con una delle costanti seguente elenco, che
1244 illustra i comandi attualmente disponibili:
1246 \begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
1247 \item[\const{LINUX\_REBOOT\_CMD\_CAD\_OFF}] Disabilita l'uso diretto della
1248 combinazione \texttt{Ctrl-Alt-Del}, la cui pressione si traduce nell'invio
1249 del segnale \const{SIGINT} a \texttt{init} (o più in generale al processo
1250 con \ids{PID} 1) il cui effetto dipende dalla configurazione di
1252 \item[\const{LINUX\_REBOOT\_CMD\_CAD\_ON}] Attiva l'uso diretto della
1253 combinazione \texttt{Ctrl-Alt-Del}, la cui pressione si traduce
1254 nell'esecuzione dell'azione che si avrebbe avuto chiamando \func{reboot} con
1255 il comando \const{LINUX\_REBOOT\_CMD\_RESTART}.
1256 \item[\const{LINUX\_REBOOT\_CMD\_HALT}] Viene inviato sulla console il
1257 messaggio ``\textit{System halted.}'' l'esecuzione viene bloccata
1258 immediatamente ed il controllo passato al monitor nella ROM (se esiste e
1259 l'architettura lo consente). Se non si è eseguita una sincronizzazione dei
1260 dati su disco con \func{sync} questi saranno perduti.
1261 \item[\const{LINUX\_REBOOT\_CMD\_KEXEC}] viene eseguito direttamente il nuovo
1262 kernel che è stato opportunamente caricato in memoria da una
1263 \func{kexec\_load} (che tratteremo a breve) eseguita in precedenza. La
1264 funzionalità è disponibile solo a partire dal kernel 2.6.13 e se il kernel
1265 corrente è stato compilato inlcudendo il relativo supporto.\footnote{deve
1266 essere stata abilitata l'opzione di compilazione \texttt{CONFIG\_KEXEC}.}
1267 Questo meccanismo consente di eseguire una sorta di riavvio rapido che evita
1268 di dover ripassare dalla inizializzazione da parte del BIOS ed il lancio del
1269 kernel attraverso un bootloader. Se non si è eseguita una sincronizzazione
1270 dei dati su disco con \func{sync} questi saranno perduti.
1271 \item[\const{LINUX\_REBOOT\_CMD\_POWER\_OFF}] Viene inviato sulla console il
1272 messaggio ``\textit{Power down.}'' l'esecuzione viene bloccata
1273 immediatamente e la macchina, se possibile, viene spenta. Se non si è
1274 eseguita una sincronizzazione dei dati su disco con \func{sync} questi
1276 \item[\const{LINUX\_REBOOT\_CMD\_RESTART}] Viene inviato sulla console il
1277 messaggio ``\textit{Restarting system.}'' ed avviata immediatamente la
1278 procedura di riavvio ordinaria. Se non si è eseguita una sincronizzazione
1279 dei dati su disco con \func{sync} questi saranno perduti.
1280 \item[\const{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il
1281 messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata
1282 immediatamente la procedura di riavvio usando il comando fornito
1283 nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'}
1284 (veniva usato per lanciare un altro programma al posto di \cmd{init}. Nelle
1285 versioni recenti questo argomento viene ignorato ed il riavvio può essere
1286 controllato dall'argomento di avvio del kernel \texttt{reboot=...} Se non
1287 si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi
1292 Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si
1293 può eseguire un riavvio immediato pre-caricando una immagine del kernel, che
1294 verrà eseguita direttettamente. Questo meccanismo consente di evitare la
1295 reinizializzazione della macchina da parte del BIOS, ed oltre a velocizzare un
1296 eventuale riavvio, ha il vantaggio poter accedere allo stato corrente della
1297 macchina e della memoria, per cui viene usato spesso per installare un kernel
1298 di emergenza da eseguire in caso di crollo del sistema per recuperare il
1299 maggior numero di informazioni possibili.
1301 La funzione di sistema che consente di caricare questa immagine del kernel è
1302 \funcd{kexec\_load}, la funzione non viene definita nella \acr{glibc} e deve
1303 pertanto essere invocata con \func{syscall}, il suo prototipo è:
1306 \fhead{linux/kexec.h}
1307 \fdecl{long kexec\_load(unsigned long entry, unsigned long nr\_segments,
1308 struct kexec\_segment \phantom{long kexec\_load(}*segments, unsigned long
1311 \fdesc{Carica un kernel per un riavvio immediato.}
1314 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1315 caso \var{errno} assumerà uno dei valori:
1317 \item[\errcode{EBUSY}] c'è già un caricamento in corso, o un altro kernel è
1319 \item[\errcode{EINVAL}] il valore di \param{flags} non è valido o si è
1320 indicato un valore eccessivo per \param{nr\_segments}.
1321 \item[\errcode{EPERM}] il chiamante non ha i privilegi di amministratore (la
1322 \textit{capability} \const{CAP\_SYS\_BOOT}).
1327 Il primo argomento indica l'indirizzo fisico di esecuzione del nuovo kernel
1328 questo viene caricato usando un vettore di strutture \struct{kexec\_segment}
1329 (la cui definizione è riportata in fig.~\ref{fig:kexec_segment}) che
1330 contengono i singoli segmenti dell'immagine. I primi due campi indicano
1331 indirizzo e dimensione del segmento di memoria in \textit{user space}, i
1332 secondi indirizzo e dimensione in \textit{kernel space}.
1335 \begin{figure}[!htb]
1338 \begin{minipage}[c]{0.8\textwidth}
1339 \includestruct{listati/kexec_segment.h}
1342 \caption{La struttura \structd{kexec\_segment} per il caricamento di un
1343 segmento di immagine del kernel.}
1344 \label{fig:kexec_segment}
1347 L'argomento \param{flags} è una maschera binaria che contiene i flag che
1348 consentono di indicare alcune specifiche relative alle modalità con cui dovrà
1349 essere eseguito il nuovo kernel. La parte meno significativa viene usata per
1350 impostare l'architettura di esecuzione, il valore \const{KEXEC\_ARCH\_DEFAULT}
1351 indica l'architettura corrente, ma se ne può specificare anche una diversa,
1352 con i valori della seconda parte di tab.~\ref{tab:kexec_load_flags}, e questa
1353 verrà usato posto che sia effettivamente eseguibile sul proprio processore.
1358 \begin{tabular}[c]{|l|p{8cm}|}
1360 \textbf{Valore} & \textbf{Significato}\\
1363 \const{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito
1364 automaticamente in caso di crollo del
1366 \const{KEXEC\_PRESERVE\_CONTEXT}& Viene preservato lo stato dei programmi
1367 e dei dispositivi prima dell'esecuzione
1368 del nuovo kernel. Viene usato
1369 principalmente per l'ibernazione del
1370 sistema ed ha senso solo se si è
1371 indicato un numero di segmento maggiore
1374 \const{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella
1375 architettura corrente. \\
1376 \texttt{KEXEC\_ARCH\_XXX} & Il kernel caricato verrà eseguito nella
1377 architettura indicata (con \texttt{XXX}
1378 che può essere: \texttt{386},
1379 \texttt{X86\_64}, \texttt{PPC},
1380 \texttt{PPC64}, \texttt{IA\_64},
1381 \texttt{ARM}, \texttt{S390},
1382 \texttt{SH}\texttt{MIPS}
1383 e \texttt{MIPS\_LE}).\\
1387 \caption{Valori per l'argomento \param{flags} di \func{kexec\_load}.}
1388 \label{tab:kexec_load_flags}
1391 I due valori più importanti sono però quelli della parte più significativa
1392 di \param{flags} (riportati nella prima sezione di
1393 tab.~\ref{tab:kexec_load_flags}). Il primo, \const{KEXEC\_ON\_CRASH}, consente
1394 di impostare l'esecuzione automatica del nuovo kernel caricato in caso di
1395 crollo del sistema, e viene usato quando si carica un kernel di emergenza da
1396 utilizzare per poter raccogliere informazioni diagnostiche che altrimenti
1397 verrebbero perdute non essendo il kernel ordinario più in grado di essere
1398 eseguito in maniera coerente. Il secondo valore,
1399 \const{KEXEC\_PRESERVE\_CONTEXT}, indica invece di preservare lo stato dei
1400 programmi e dei dispositivi, e viene in genere usato per realizzare la
1401 cosiddetta ibernazione in RAM.
1403 % TODO documentare keyctl ????
1404 % (fare sezione dedicata ????)
1405 %\subsection{La gestione delle chiavi crittografiche}
1406 %\label{sec:keyctl_management}
1409 \section{Il controllo dell'uso delle risorse}
1410 \label{sec:sys_res_limits}
1413 Dopo aver esaminato in sez.~\ref{sec:sys_management} le funzioni che
1414 permettono di controllare le varie caratteristiche, capacità e limiti del
1415 sistema a livello globale, in questa sezione tratteremo le varie funzioni che
1416 vengono usate per quantificare le risorse (CPU, memoria, ecc.) utilizzate da
1417 ogni singolo processo e quelle che permettono di imporre a ciascuno di essi
1418 vincoli e limiti di utilizzo.
1421 \subsection{L'uso delle risorse}
1422 \label{sec:sys_resource_use}
1424 Come abbiamo accennato in sez.~\ref{sec:proc_wait} le informazioni riguardo
1425 l'utilizzo delle risorse da parte di un processo è mantenuto in una struttura
1426 di tipo \struct{rusage}, la cui definizione (che si trova in
1427 \headfile{sys/resource.h}) è riportata in fig.~\ref{fig:sys_rusage_struct}. Si
1428 ricordi che questa è una delle informazioni preservate attraverso una
1431 \begin{figure}[!htb]
1434 \begin{minipage}[c]{0.8\textwidth}
1435 \includestruct{listati/rusage.h}
1438 \caption{La struttura \structd{rusage} per la lettura delle informazioni dei
1439 delle risorse usate da un processo.}
1440 \label{fig:sys_rusage_struct}
1443 La definizione della struttura in fig.~\ref{fig:sys_rusage_struct} è ripresa
1444 da BSD 4.3,\footnote{questo non ha a nulla a che fare con il cosiddetto
1445 \textit{BSD accounting} (vedi sez. \ref{sec:sys_bsd_accounting}) che si
1446 trova nelle opzioni di compilazione del kernel (e di norma è disabilitato)
1447 che serve per mantenere una contabilità delle risorse usate da ciascun
1448 processo in maniera molto più dettagliata.} ma attualmente solo alcuni dei
1449 campi definiti sono effettivamente mantenuti. Con i kernel della serie 2.4 i
1450 soli campi che sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime},
1451 \var{ru\_minflt}, \var{ru\_majflt}, e \var{ru\_nswap}. Con i kernel della
1452 serie 2.6 si aggiungono anche \var{ru\_nvcsw} e \var{ru\_nivcsw}, e a partire
1453 dal 2.6.22 anche \var{ru\_inblock} e \var{ru\_oublock}.
1455 I campi più utilizzati sono comunque \var{ru\_utime} e \var{ru\_stime} che
1456 indicano rispettivamente il tempo impiegato dal processo nell'eseguire le
1457 istruzioni in user space, e quello impiegato dal kernel nelle \textit{system
1458 call} eseguite per conto del processo. I campi \var{ru\_minflt} e
1459 \var{ru\_majflt} servono a quantificare l'uso della memoria
1460 virtuale\index{memoria~virtuale} e corrispondono rispettivamente al numero di
1461 \itindex{page~fault} \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen})
1462 avvenuti senza richiedere I/O su disco (i cosiddetti \textit{minor page
1463 fault}), a quelli che invece han richiesto I/O su disco (detti invece
1464 \textit{major page fault}), mentre \var{ru\_nswap} ed al numero di volte che
1465 il processo è stato completamente tolto dalla memoria per essere inserito
1468 % TODO verificare \var{ru\_nswap} non citato nelle pagine di manuali recenti
1470 In genere includere esplicitamente \file{<sys/time.h>} non è più strettamente
1471 necessario, ma aumenta la portabilità, e serve comunque quando, come nella
1472 maggior parte dei casi, si debba accedere ai campi di \struct{rusage} relativi
1473 ai tempi di utilizzo del processore, che sono definiti come strutture di tipo
1474 \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}).
1476 La struttura \struct{rusage} è la struttura utilizzata da \func{wait4} (si
1477 ricordi quando visto in sez.~\ref{sec:proc_wait}) per ricavare la quantità di
1478 risorse impiegate dal processo di cui si è letto lo stato di terminazione, ma
1479 essa può anche essere letta direttamente utilizzando la funzione di sistema
1480 \funcd{getrusage}, il cui prototipo è:
1484 \fhead{sys/resource.h}
1486 \fdecl{int getrusage(int who, struct rusage *usage)}
1488 \fdesc{Legge la quantità di risorse usate da un processo.}
1491 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
1492 caso \var{errno} assumerà uno dei valori:
1494 \item[\errcode{EINVAL}] l'argomento \param{who} non è valido
1496 ed inoltre \errval{EFAULT} nel suo significato generico.
1500 La funzione ritorna i valori per l'uso delle risorse nella struttura
1501 \struct{rusage} puntata dall'argomento \param{usage}. L'argomento \param{who}
1502 permette di specificare il soggetto di cui si vuole leggere l'uso delle
1503 risorse; esso può assumere solo i valori illustrati in
1504 tab.~\ref{tab:getrusage_who}, di questi \const{RUSAGE\_THREAD} è specifico di
1505 Linux ed è disponibile solo a partire dal kernel 2.6.26. La funzione è stata
1506 recepita nello standard POSIX.1-2001, che però indica come campi di
1507 \struct{rusage} soltanto \var{ru\_utime} e \var{ru\_stime}.
1512 \begin{tabular}[c]{|l|p{8cm}|}
1514 \textbf{Valore} & \textbf{Significato}\\
1517 \const{RUSAGE\_SELF} & ritorna l'uso delle risorse del processo
1518 corrente, che in caso di uso dei
1519 \textit{thread} ammonta alla somma delle
1520 risorse utilizzate da tutti i \textit{thread}
1522 \const{RUSAGE\_CHILDREN} & ritorna l'uso delle risorse dell'insieme dei
1523 processi figli di cui è ricevuto lo stato di
1524 terminazione, che a loro volta comprendono
1525 quelle dei loro figli e così via.\\
1526 \const{RUSAGE\_THREAD} & ritorna l'uso delle risorse del \textit{thread}
1530 \caption{Valori per l'argomento \param{who} di \func{getrusage}.}
1531 \label{tab:getrusage_who}
1534 Si tenga conto che per un errore di implementazione nei i kernel precedenti il
1535 2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1,
1536 l'uso di \const{RUSAGE\_CHILDREN} comportava l'inserimento dell'ammontare
1537 delle risorse usate dai processi figli anche quando si era impostata una
1538 azione di \const{SIG\_ING} per il segnale \const{SIGCHLD} (per i segnali si
1539 veda cap.~\ref{cha:signals}). Il comportamento è stato corretto per aderire
1540 allo standard a partire dal kernel 2.6.9.
1543 \subsection{Limiti sulle risorse}
1544 \label{sec:sys_resource_limit}
1546 Come accennato nell'introduzione il kernel mette a disposizione delle
1547 funzionalità che permettono non solo di mantenere dati statistici relativi
1548 all'uso delle risorse, ma anche di imporre dei limiti precisi sul loro
1549 utilizzo da parte sia dei singoli processi che degli utenti.
1551 Per far questo sono definite una serie di risorse e ad ogni processo vengono
1552 associati due diversi limiti per ciascuna di esse; questi sono il
1553 \textsl{limite corrente} (o \textit{current limit}) che esprime un valore
1554 massimo che il processo non può superare ad un certo momento, ed il
1555 \textsl{limite massimo} (o \textit{maximum limit}) che invece esprime il
1556 valore massimo che può assumere il \textsl{limite corrente}. In generale il
1557 primo viene chiamato anche \textit{soft limit} dato che il suo valore può
1558 essere aumentato dal processo stesso durante l'esecuzione, ciò può però essere
1559 fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
1562 In generale il superamento di un limite corrente comporta o l'emissione di uno
1563 specifico segnale o il fallimento della \textit{system call} che lo ha
1564 provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU}
1565 in cui si ha in comportamento diverso per il superamento dei due limiti e
1566 \const{RLIMIT\_CORE} che influenza soltanto la dimensione (o l'eventuale
1567 creazione) dei file di \itindex{core~dump} \textit{core dump}.
1569 Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da
1570 parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit}
1571 e \funcd{setrlimit}, i cui prototipi sono:
1575 \fhead{sys/resource.h}
1577 \fdecl{int getrlimit(int resource, struct rlimit *rlim)}
1578 \fdesc{Legge il limite corrente di una risorsa.}
1579 \fdecl{int setrlimit(int resource, const struct rlimit *rlim)}
1580 \fdesc{Imposta il limite di una risorsa.}
1583 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
1584 caso \var{errno} assumerà uno dei valori:
1586 \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi.
1587 \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha
1588 cercato di innalzare i propri limiti.
1590 ed inoltre \errval{EFAULT} nel suo significato generico.
1594 Entrambe le funzioni permettono di specificare attraverso l'argomento
1595 \param{resource} su quale risorsa si vuole operare. L'accesso (rispettivamente
1596 in lettura e scrittura) ai valori effettivi dei limiti viene poi effettuato
1597 attraverso la struttura \struct{rlimit} puntata da
1598 \param{rlim}, la cui definizione è riportata in
1599 fig.~\ref{fig:sys_rlimit_struct}, ed i cui campi corrispondono appunto a
1600 limite corrente e limite massimo.
1602 \begin{figure}[!htb]
1605 \begin{minipage}[c]{0.8\textwidth}
1606 \includestruct{listati/rlimit.h}
1609 \caption{La struttura \structd{rlimit} per impostare i limiti di utilizzo
1610 delle risorse usate da un processo.}
1611 \label{fig:sys_rlimit_struct}
1614 Come accennato processo ordinario può alzare il proprio limite corrente fino
1615 al valore del limite massimo, può anche ridurre, irreversibilmente, il valore
1616 di quest'ultimo. Nello specificare un limite, oltre a fornire dei valori
1617 specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette
1618 di sbloccare completamente l'uso di una risorsa; ma si ricordi che solo un
1619 processo con i privilegi di amministratore\footnote{per essere precisi in
1620 questo caso quello che serve è la \itindex{capabilities} \textit{capability}
1621 \const{CAP\_SYS\_RESOURCE} (vedi sez.~\ref{sec:proc_capabilities}).} può
1622 innalzare un limite al di sopra del valore corrente del limite massimo ed
1623 usare un valore qualsiasi per entrambi i limiti.
1625 Come accennato ciascuna risorsa è identificata da uno specifico valore
1626 dell'argomento \param{resource}, i valori possibili per questo argomento, ed
1627 il significato della risorsa corrispondente, dei rispettivi limiti e gli
1628 effetti causati dal superamento degli stessi sono riportati nel seguente
1631 \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}}
1632 \item[\const{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione
1633 massima consentita per la memoria virtuale di un processo, il cosiddetto
1634 \textit{Address Space}, (vedi sez.~\ref{sec:proc_mem_gen}). Se il limite
1635 viene superato dall'uso di funzioni come \func{brk}, \func{mremap} o
1636 \func{mmap} esse falliranno con un errore di \errcode{ENOMEM}, mentre se il
1637 superamento viene causato dalla crescita dello \itindex{stack}
1638 \textit{stack} il processo riceverà un segnale di \signal{SIGSEGV}. Dato che
1639 il valore usato è un intero di tipo \ctyp{long} nelle macchine a 32 bit
1640 questo può assumere un valore massimo di 2Gb (anche se la memoria
1641 disponibile può essere maggiore), in tal caso il limite massimo indicabile
1642 resta 2Gb, altrimenti la risorsa si dà per non limitata.
1644 \item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima
1645 dimensione per un file di \itindex{core~dump} \textit{core dump} (vedi
1646 sez.~\ref{sec:sig_prog_error}) creato nella terminazione di un
1647 processo. File di dimensioni maggiori verranno troncati a questo valore,
1648 mentre con un valore nullo si bloccherà la creazione dei \itindex{core~dump}
1651 \item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo
1652 di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il
1653 superamento del limite corrente comporta l'emissione di un segnale di
1654 \signal{SIGXCPU}, la cui azione predefinita (vedi
1655 sez.~\ref{sec:sig_classification}) è terminare il processo. Il segnale però
1656 può essere intercettato e ignorato, in tal caso esso verrà riemesso una
1657 volta al secondo fino al raggiungimento del limite massimo. Il superamento
1658 del limite massimo comporta comunque l'emissione di un segnale di
1659 \signal{SIGKILL}. Si tenga presente che questo è il comportamento presente
1660 su Linux dai kernel della serie 2.2 ad oggi, altri kernel possono avere
1661 comportamenti diversi per quanto avviene quando viene superato il
1662 \textit{soft limit}, pertanto per avere operazioni portabili è suggerito di
1663 intercettare sempre \signal{SIGXCPU} e terminare in maniera ordinata il
1664 processo con la prima ricezione.
1666 \item[\const{RLIMIT\_DATA}] Questa risorsa indica, in byte, la massima
1667 dimensione del \index{segmento!dati} segmento dati di un processo (vedi
1668 sez.~\ref{sec:proc_mem_layout}). Il tentativo di allocare più memoria di
1669 quanto indicato dal limite corrente causa il fallimento della funzione di
1670 allocazione eseguita (\func{brk} o \func{sbrk}) con un errore di
1673 \item[\const{RLIMIT\_FSIZE}] Questa risorsa indica, in byte, la massima
1674 dimensione di un file che un processo può usare. Se il processo cerca di
1675 scrivere o di estendere il file oltre questa dimensione riceverà un segnale
1676 di \signal{SIGXFSZ}, che di norma termina il processo. Se questo segnale
1677 viene intercettato la \textit{system call} che ha causato l'errore fallirà
1678 con un errore di \errcode{EFBIG}.
1680 \item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di
1681 \itindex{file~locking} \textit{file lock} (vedi sez.~\ref{sec:file_locking})
1682 e di \textit{file lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un
1683 processo poteva effettuare. È un limite presente solo nelle prime versioni
1684 del kernel 2.4, pertanto non deve essere più utilizzato.
1686 \item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare
1687 massimo di memoria che può essere bloccata in RAM da un processo (vedi
1688 sez.~\ref{sec:proc_mem_lock}). Dato che il \itindex{memory~locking}
1689 \textit{memory locking} viene effettuato sulle pagine di memoria, il valore
1690 indicato viene automaticamente arrotondato al primo multiplo successivo
1691 della dimensione di una pagina di memoria. Il limite comporta il fallimento
1692 delle \textit{system call} che eseguono il \textit{memory locking}
1693 (\func{mlock}, \func{mlockall} ed anche, vedi
1694 sez.~\ref{sec:file_memory_map}, \func{mmap} con l'operazione
1695 \const{MAP\_LOCKED}).
1697 Dal kernel 2.6.9 questo limite comprende anche la memoria che può essere
1698 bloccata da ciascun utente nell'uso della memoria condivisa (vedi
1699 sez.~\ref{sec:ipc_sysv_shm}) con \func{shmctl}, che viene contabilizzata
1700 separatamente ma sulla quale viene applicato questo stesso limite. In
1701 precedenza invece questo limite veniva applicato sulla memoria condivisa per
1702 processi con privilegi amministrativi, il limite su questi è stato rimosso e
1703 la semantica della risorsa cambiata.
1706 \item[\const{RLIMIT\_MSGQUEUE}] Questa risorsa indica il numero massimo di
1707 byte che possono essere utilizzati da un utente, identificato con
1708 l'\ids{UID} reale del processo chiamante, per le code di messaggi POSIX
1709 (vedi sez.~\ref{sec:ipc_posix_mq}). Per ciascuna coda che viene creata viene
1710 calcolata un'occupazione pari a:
1711 \includecodesnip{listati/mq_occupation.c}
1712 dove \var{attr} è la struttura \struct{mq\_attr} (vedi
1713 fig.~\ref{fig:ipc_mq_attr}) usata nella creazione della coda. Il primo addendo
1714 consente di evitare la creazione di una coda con un numero illimitato di
1715 messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa
1716 è stata introdotta con il kernel 2.6.8.
1718 \item[\const{RLIMIT\_NICE}] Questa risorsa indica il numero massimo a cui può
1719 essere il portato il valore di \textit{nice} (vedi
1720 sez.~\ref{sec:proc_sched_stand}). Dato che non possono essere usati numeri
1721 negativi per specificare un limite, il valore di \textit{nice} viene
1722 calcolato come \code{20-rlim\_cur}. Questa risorsa è stata introdotta con il
1725 \item[\const{RLIMIT\_NOFILE}] Questa risorsa indica il numero massimo di file
1726 che un processo può aprire. Il tentativo di creazione di un ulteriore file
1727 descriptor farà fallire la funzione (\func{open}, \func{dup}, \func{pipe},
1728 ecc.) con un errore \errcode{EMFILE}.
1730 \item[\const{RLIMIT\_NPROC}] Questa risorsa indica il numero massimo di
1731 processi che possono essere creati dallo stesso utente, che viene
1732 identificato con l'\ids{UID} reale (vedi sez.~\ref{sec:proc_access_id}) del
1733 processo chiamante. Se il limite viene raggiunto \func{fork} fallirà con un
1736 \item[\const{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la
1737 dimensione massima della memoria residente (il codiddetto RSS
1738 \itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size}) cioè
1739 l'ammontare della memoria associata al processo che risiede effettivamente
1740 in RAM (e non a quella eventualmente portata sulla \textit{swap} o non
1741 ancora caricata dal filesystem (per il \index{segmento!testo} segmento testo
1742 del programma). Ha effetto solo sulle chiamate a \func{madvise} con
1743 \const{MADV\_WILLNEED} (vedi sez.~\ref{sec:file_memory_map}). Presente solo
1744 sui i kernel precedenti il 2.4.30.
1746 \item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il
1748 % TODO trattare i seguenti...
1749 % \const{RLIMIT\_RTPRIO}& Il numero massimo di \\
1750 % aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
1751 % vedi file include/asm-generic/resource.h
1754 \item[\const{RLIMIT\_SIGPENDING}] Il numero massimo di segnali che possono
1755 essere mantenuti in coda per ciascun utente, considerando sia i segnali
1756 normali che real-time (vedi sez.~\ref{sec:sig_real_time}). Il limite è
1757 attivo solo per \func{sigqueue}, con \func{kill} si potrà sempre inviare un
1758 segnale che non sia già presente su una coda.\footnote{il limite su questa
1759 risorsa è stato introdotto con il kernel 2.6.8.}
1762 \item[\const{RLIMIT\_RSS}] L'ammontare massimo di pagine di memoria dato al
1763 \index{segmento!testo} testo del processo. Il limite è solo una indicazione
1764 per il kernel, qualora ci fosse un surplus di memoria questa verrebbe
1767 \item[\const{RLIMIT\_STACK}] La massima dimensione dello \itindex{stack}
1768 \textit{stack} del processo. Se il processo esegue operazioni che estendano
1769 lo \textit{stack} oltre questa dimensione riceverà un segnale di
1772 % TODO dal 2.6.23 il significato è cambiato, vedi anche man execve
1774 % TODO: aggiungere a \const{RLIMIT\_STACK} i dati di execve:
1775 % Questi fino al kernel 2.6.23 erano fissi e costituiti da
1776 % 32 pagine di memoria (corrispondenti per la gran parte delle architetture a
1777 % 128kb di dati). Dal 2.6.23 su molte architettire il limite viene stabilito in
1778 % base al valore della risorsa \const{RLIMIT\_STACK} (vedi
1779 % sez.~\ref{sec:sys_resource_limit}), ad un quarto dello spazio da essa
1780 % indicato). Dal 2.6.25 viene comunque garantito uno spazio base di 32 pagine.
1782 % TODO integrare con la roba di madvise
1783 % TODO integrare con le ultime aggiunte, vedi pagina di manuale
1785 % TODO trattare prlimit64 introdotta con il 2.6.36 che dovrebbe sostituire
1790 Si tenga conto infine che tutti i limiti vengono ereditati dal
1791 processo padre attraverso una \func{fork} (vedi sez.~\ref{sec:proc_fork}) e
1792 mantenuti per gli altri programmi eseguiti attraverso una \func{exec} (vedi
1793 sez.~\ref{sec:proc_exec}).
1796 \subsection{Le risorse di memoria e processore}
1797 \label{sec:sys_memory_res}
1799 La gestione della memoria è già stata affrontata in dettaglio in
1800 sez.~\ref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il
1801 meccanismo della \index{memoria~virtuale} memoria virtuale attraverso la
1802 divisione della memoria fisica in pagine.
1804 In genere tutto ciò è del tutto trasparente al singolo processo, ma in certi
1805 casi, come per l'I/O mappato in memoria (vedi sez.~\ref{sec:file_memory_map})
1806 che usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
1807 dimensioni delle pagine usate dal kernel. Lo stesso vale quando si vuole
1808 gestire in maniera ottimale l'interazione della memoria che si sta allocando
1809 con il meccanismo della \index{paginazione} paginazione.
1811 Di solito la dimensione delle pagine di memoria è fissata dall'architettura
1812 hardware, per cui il suo valore di norma veniva mantenuto in una costante che
1813 bastava utilizzare in fase di compilazione, ma oggi, con la presenza di alcune
1814 architetture (ad esempio Sun Sparc) che permettono di variare questa
1815 dimensione, per non dover ricompilare i programmi per ogni possibile modello e
1816 scelta di dimensioni, è necessario poter utilizzare una funzione.
1818 Dato che si tratta di una caratteristica generale del sistema, questa
1819 dimensione può essere ottenuta come tutte le altre attraverso una chiamata a
1820 \func{sysconf}, \footnote{nel caso specifico si dovrebbe utilizzare il
1821 parametro \const{\_SC\_PAGESIZE}.} ma in BSD 4.2 è stata introdotta una
1822 apposita funzione, \funcd{getpagesize}, che restituisce la dimensione delle
1823 pagine di memoria; il suo prototipo è:
1824 \begin{prototype}{unistd.h}{int getpagesize(void)}
1825 Legge le dimensioni delle pagine di memoria.
1827 \bodydesc{La funzione ritorna la dimensione di una pagina in byte, e non
1828 sono previsti errori.}
1831 La funzione è prevista in SVr4, BSD 4.4 e SUSv2, anche se questo ultimo
1832 standard la etichetta come obsoleta, mentre lo standard POSIX 1003.1-2001 la
1833 ha eliminata. In Linux è implementata come una \textit{system call} nelle
1834 architetture in cui essa è necessaria, ed in genere restituisce il valore del
1835 simbolo \const{PAGE\_SIZE} del kernel, che dipende dalla architettura
1836 hardware, anche se le versioni delle librerie del C precedenti le \acr{glibc}
1837 2.1 implementavano questa funzione restituendo sempre un valore statico.
1839 % TODO verificare meglio la faccenda di const{PAGE\_SIZE}
1841 Le \textsl{glibc} forniscono, come specifica estensione GNU, altre due
1842 funzioni, \funcd{get\_phys\_pages} e \funcd{get\_avphys\_pages} che permettono
1843 di ottenere informazioni riguardo la memoria; i loro prototipi sono:
1845 \headdecl{sys/sysinfo.h}
1847 \funcdecl{long int get\_phys\_pages(void)}
1849 Legge il numero totale di pagine di memoria disponibili per il sistema.
1851 \funcdecl{long int get\_avphys\_pages(void)}
1853 Legge il numero di pagine di memoria disponibili nel sistema.
1855 \bodydesc{Le funzioni restituiscono un numero di pagine.}
1858 Queste funzioni sono equivalenti all'uso della funzione \func{sysconf}
1859 rispettivamente con i parametri \const{\_SC\_PHYS\_PAGES} e
1860 \const{\_SC\_AVPHYS\_PAGES}. La prima restituisce il numero totale di pagine
1861 corrispondenti alla RAM della macchina; la seconda invece la memoria
1862 effettivamente disponibile per i processi.
1864 Le \acr{glibc} supportano inoltre, come estensioni GNU, due funzioni che
1865 restituiscono il numero di processori della macchina (e quello dei processori
1866 attivi); anche queste sono informazioni comunque ottenibili attraverso
1867 \func{sysconf} utilizzando rispettivamente i parametri
1868 \const{\_SC\_NPROCESSORS\_CONF} e \const{\_SC\_NPROCESSORS\_ONLN}.
1870 Infine le \acr{glibc} riprendono da BSD la funzione \funcd{getloadavg} che
1871 permette di ottenere il carico di processore della macchina, in questo modo è
1872 possibile prendere decisioni su quando far partire eventuali nuovi processi.
1874 \begin{prototype}{stdlib.h}{int getloadavg(double loadavg[], int nelem)}
1875 Legge il carico medio della macchina.
1877 \bodydesc{La funzione ritorna il numero di elementi scritti o -1 in caso di
1881 La funzione restituisce in ciascun elemento di \param{loadavg} il numero medio
1882 di processi attivi sulla coda dello \itindex{scheduler} scheduler, calcolato
1883 su diversi intervalli di tempo. Il numero di intervalli che si vogliono
1884 leggere è specificato da \param{nelem}, dato che nel caso di Linux il carico
1885 viene valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti),
1886 questo è anche il massimo valore che può essere assegnato a questo argomento.
1889 \subsection{La \textsl{contabilità} in stile BSD}
1890 \label{sec:sys_bsd_accounting}
1892 Una ultima modalità per monitorare l'uso delle risorse è, se si è compilato il
1893 kernel con il relativo supporto,\footnote{se cioè si è abilitata l'opzione di
1894 compilazione \texttt{CONFIG\_BSD\_PROCESS\_ACCT}.} quella di attivare il
1895 cosiddetto \textit{BSD accounting}, che consente di registrare su file una
1896 serie di informazioni\footnote{contenute nella struttura \texttt{acct}
1897 definita nel file \texttt{include/linux/acct.h} dei sorgenti del kernel.}
1898 riguardo alla \textsl{contabilità} delle risorse utilizzate da ogni processo
1899 che viene terminato.
1901 Linux consente di salvare la contabilità delle informazioni relative alle
1902 risorse utilizzate dai processi grazie alla funzione \funcd{acct}, il cui
1904 \begin{prototype}{unistd.h}{int acct(const char *filename)}
1905 Abilita il \textit{BSD accounting}.
1907 \bodydesc{La funzione ritorna 0 in caso di successo o $-1$ in caso di
1908 errore, nel qual caso \var{errno} assumerà uno dei valori:
1910 \item[\errcode{EACCES}] non si hanno i permessi per accedere a
1912 \item[\errcode{EPERM}] il processo non ha privilegi sufficienti ad
1913 abilitare il \textit{BSD accounting}.
1914 \item[\errcode{ENOSYS}] il kernel non supporta il \textit{BSD accounting}.
1915 \item[\errcode{EUSERS}] non sono disponibili nel kernel strutture per il
1916 file o si è finita la memoria.
1918 ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
1919 \errval{ENAMETOOLONG}, \errval{ENFILE}, \errval{ENOENT}, \errval{ENOMEM},
1920 \errval{ENOTDIR}, \errval{EROFS}.}
1923 La funzione attiva il salvataggio dei dati sul file indicato dal
1924 \textit{pathname} contenuti nella stringa puntata da \param{filename}; la
1925 funzione richiede che il processo abbia i privilegi di amministratore (è
1926 necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
1927 sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per
1928 \param{filename} il \textit{BSD accounting} viene invece disabilitato. Un
1929 semplice esempio per l'uso di questa funzione è riportato nel programma
1930 \texttt{AcctCtrl.c} dei sorgenti allegati alla guida.
1932 Quando si attiva la contabilità, il file che si indica deve esistere; esso
1933 verrà aperto in sola scrittura; le informazioni verranno registrate in
1934 \itindex{append~mode} \textit{append} in coda al file tutte le volte che un
1935 processo termina. Le informazioni vengono salvate in formato binario, e
1936 corrispondono al contenuto della apposita struttura dati definita all'interno
1939 Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
1940 parametro di sistema, modificabile attraverso \sysctlfile{kernel/acct}
1941 (o tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi,
1942 il primo indica la percentuale di spazio disco libero sopra il quale viene
1943 ripresa una registrazione che era stata sospesa per essere scesi sotto il
1944 minimo indicato dal secondo valore (sempre in percentuale di spazio disco
1945 libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve
1946 essere controllata detta percentuale.
1949 \section{La gestione dei tempi del sistema}
1950 \label{sec:sys_time}
1952 In questa sezione, una volta introdotti i concetti base della gestione dei
1953 tempi da parte del sistema, tratteremo le varie funzioni attinenti alla
1954 gestione del tempo in un sistema unix-like, a partire da quelle per misurare i
1955 veri tempi di sistema associati ai processi, a quelle per convertire i vari
1956 tempi nelle differenti rappresentazioni che vengono utilizzate, a quelle della
1957 gestione di data e ora.
1960 \subsection{La misura del tempo in Unix}
1961 \label{sec:sys_unix_time}
1963 Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di
1964 dati per la misure dei tempi all'interno del sistema: essi sono
1965 rispettivamente chiamati \itindex{calendar~time} \textit{calendar time} e
1966 \itindex{process~time} \textit{process time}, secondo le definizioni:
1967 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
1968 \item[\textit{calendar time}] \itindex{calendar~time} detto anche
1969 \textsl{tempo di calendario}. È il numero di secondi dalla mezzanotte del
1970 primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
1971 usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
1972 Epoch}. Questo tempo viene anche chiamato anche GMT (Greenwich Mean Time)
1973 dato che l'UTC corrisponde all'ora locale di Greenwich. È il tempo su cui
1974 viene mantenuto l'orologio del kernel, e viene usato ad esempio per indicare
1975 le date di modifica dei file o quelle di avvio dei processi. Per memorizzare
1976 questo tempo è stato riservato il tipo primitivo \type{time\_t}.
1977 \item[\textit{process time}] \itindex{process~time} detto talvolta
1978 \textsl{tempo di processore}. Viene misurato in \itindex{clock~tick}
1979 \textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni
1980 effettuate dal timer di sistema, adesso lo standard POSIX richiede che esso
1981 sia pari al valore della costante \const{CLOCKS\_PER\_SEC}, che deve essere
1982 definita come 1000000, qualunque sia la risoluzione reale dell'orologio di
1983 sistema e la frequenza delle interruzioni del timer.\footnote{quest'ultima,
1984 come accennato in sez.~\ref{sec:proc_hierarchy}, è invece data dalla
1985 costante \const{HZ}.} Il dato primitivo usato per questo tempo è
1986 \type{clock\_t}, che ha quindi una risoluzione del microsecondo. Il numero
1987 di \itindex{clock~tick} \textit{tick} al secondo può essere ricavato anche
1988 attraverso \func{sysconf} (vedi sez.~\ref{sec:sys_limits}). Il vecchio
1989 simbolo \const{CLK\_TCK} definito in \headfile{time.h} è ormai considerato
1993 In genere si usa il \itindex{calendar~time} \textit{calendar time} per
1994 esprimere le date dei file e le informazioni analoghe che riguardano i
1995 cosiddetti \textsl{tempi di orologio}, che vengono usati ad esempio per i
1996 demoni che compiono lavori amministrativi ad ore definite, come \cmd{cron}.
1998 Di solito questo tempo viene convertito automaticamente dal valore in UTC al
1999 tempo locale, utilizzando le opportune informazioni di localizzazione
2000 (specificate in \conffile{/etc/timezone}). E da tenere presente che questo
2001 tempo è mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
2002 dall'orologio hardware del calcolatore.
2004 Anche il \itindex{process~time} \textit{process time} di solito si esprime in
2005 secondi, ma fornisce una precisione ovviamente superiore al \textit{calendar
2006 time} (che è mantenuto dal sistema con una granularità di un secondo) e
2007 viene usato per tenere conto dei tempi di esecuzione dei processi. Per ciascun
2008 processo il kernel calcola tre tempi diversi:
2009 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
2010 \item[\textit{clock time}] il tempo \textsl{reale} (viene chiamato anche
2011 \textit{wall clock time} o \textit{elapsed time}) passato dall'avvio del
2012 processo. Chiaramente tale tempo dipende anche dal carico del sistema e da
2013 quanti altri processi stavano girando nello stesso periodo.
2015 \item[\textit{user time}] il tempo effettivo che il processore ha impiegato
2016 nell'esecuzione delle istruzioni del processo in user space. È quello
2017 riportato nella risorsa \var{ru\_utime} di \struct{rusage} vista in
2018 sez.~\ref{sec:sys_resource_use}.
2020 \item[\textit{system time}] il tempo effettivo che il processore ha impiegato
2021 per eseguire codice delle \textit{system call} nel kernel per conto del
2022 processo. È quello riportato nella risorsa \var{ru\_stime} di
2023 \struct{rusage} vista in sez.~\ref{sec:sys_resource_use}.
2026 In genere la somma di \textit{user time} e \textit{system time} indica il
2027 tempo di processore totale che il sistema ha effettivamente utilizzato per
2028 eseguire un certo processo, questo viene chiamato anche \textit{CPU time} o
2029 \textsl{tempo di CPU}. Si può ottenere un riassunto dei valori di questi tempi
2030 quando si esegue un qualsiasi programma lanciando quest'ultimo come argomento
2031 del comando \cmd{time}.
2035 \subsection{La gestione del \textit{process time}}
2036 \label{sec:sys_cpu_times}
2038 \itindbeg{process~time}
2040 Di norma tutte le operazioni del sistema fanno sempre riferimento al
2041 \itindex{calendar~time} \textit{calendar time}, l'uso del \textit{process
2042 time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione
2043 di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti
2044 fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere
2045 trascorso mentre un altro processo era in esecuzione o in attesa del risultato
2046 di una operazione di I/O.
2048 La funzione più semplice per leggere il \textit{process time} di un processo è
2049 \funcd{clock}, che da una valutazione approssimativa del tempo di CPU
2050 utilizzato dallo stesso; il suo prototipo è:
2051 \begin{prototype}{time.h}{clock\_t clock(void)}
2052 Legge il valore corrente del tempo di CPU.
2054 \bodydesc{La funzione ritorna il tempo di CPU usato dal programma e -1 in
2058 La funzione restituisce il tempo in \itindex{clock~tick} \texttt{clock tick},
2059 quindi se si vuole il tempo in secondi occorre dividere il risultato per la
2060 costante \const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard
2061 ANSI C, POSIX richiede che \const{CLOCKS\_PER\_SEC} sia definito pari a
2062 1000000 indipendentemente dalla risoluzione del timer di sistema.} In genere
2063 \type{clock\_t} viene rappresentato come intero a 32 bit, il che comporta un
2064 valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore
2065 riprenderà lo stesso valore iniziale.
2067 % TODO questi valori sono obsoleti, verificare il tutto.
2069 Come accennato in sez.~\ref{sec:sys_unix_time} il tempo di CPU è la somma di
2070 altri due tempi, l'\textit{user time} ed il \textit{system time} che sono
2071 quelli effettivamente mantenuti dal kernel per ciascun processo. Questi
2072 possono essere letti attraverso la funzione \funcd{times}, il cui prototipo è:
2073 \begin{prototype}{sys/times.h}{clock\_t times(struct tms *buf)}
2074 Legge in \param{buf} il valore corrente dei tempi di processore.
2076 \bodydesc{La funzione ritorna il numero di \itindex{clock~tick}
2077 \textit{clock tick} dall'avvio del sistema in caso di successo e -1 in
2081 La funzione restituisce i valori di \textit{process time} del processo
2082 corrente in una struttura di tipo \struct{tms}, la cui definizione è riportata
2083 in fig.~\ref{fig:sys_tms_struct}. La struttura prevede quattro campi; i primi
2084 due, \var{tms\_utime} e \var{tms\_stime}, sono l'\textit{user time} ed il
2085 \textit{system time} del processo, così come definiti in
2086 sez.~\ref{sec:sys_unix_time}.
2088 \begin{figure}[!htb]
2091 \begin{minipage}[c]{\textwidth}
2092 \includestruct{listati/tms.h}
2095 \caption{La struttura \structd{tms} dei tempi di processore associati a un
2097 \label{fig:sys_tms_struct}
2100 Gli altri due campi mantengono rispettivamente la somma dell'\textit{user
2101 time} ed del \textit{system time} di tutti i processi figli che sono
2102 terminati; il kernel cioè somma in \var{tms\_cutime} il valore di
2103 \var{tms\_utime} e \var{tms\_cutime} per ciascun figlio del quale è stato
2104 ricevuto lo stato di terminazione, e lo stesso vale per \var{tms\_cstime}.
2106 Si tenga conto che l'aggiornamento di \var{tms\_cutime} e \var{tms\_cstime}
2107 viene eseguito solo quando una chiamata a \func{wait} o \func{waitpid} è
2108 ritornata. Per questo motivo se un processo figlio termina prima di ricevere
2109 lo stato di terminazione di tutti i suoi figli, questi processi
2110 ``\textsl{nipoti}'' non verranno considerati nel calcolo di questi tempi.
2112 \itindend{process~time}
2115 \subsection{Le funzioni per il \textit{calendar time}}
2116 \label{sec:sys_time_base}
2118 \itindbeg{calendar~time}
2120 Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time} è
2121 mantenuto dal kernel in una variabile di tipo \type{time\_t},\footnote{in
2122 realtà il kernel usa una rappresentazione interna di che fornisce una
2123 precisione molto maggiore, e consente per questo anche di usare
2124 rappresentazioni diverse del \textit{calendar time}.} che usualmente
2125 corrisponde ad un tipo elementare (in Linux è definito come \ctyp{long int},
2126 che di norma corrisponde a 32 bit). Il valore corrente del \textit{calendar
2127 time}, che indicheremo come \textsl{tempo di sistema}, può essere ottenuto
2128 con la funzione \funcd{time} che lo restituisce nel suddetto formato; il suo
2130 \begin{prototype}{time.h}{time\_t time(time\_t *t)}
2131 Legge il valore corrente del \textit{calendar time}.
2133 \bodydesc{La funzione ritorna il valore del \textit{calendar time} in caso
2134 di successo e -1 in caso di errore, che può essere solo \errval{EFAULT}.}
2136 \noindent dove \param{t}, se non nullo, deve essere l'indirizzo di una
2137 variabile su cui duplicare il valore di ritorno.
2139 Analoga a \func{time} è la funzione \funcd{stime} che serve per effettuare
2140 l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo
2141 sia necessario; il suo prototipo è:
2142 \begin{prototype}{time.h}{int stime(time\_t *t)}
2143 Imposta a \param{t} il valore corrente del \textit{calendar time}.
2145 \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
2146 che può essere \errval{EFAULT} o \errval{EPERM}.}
2148 \noindent dato che modificare l'ora ha un impatto su tutto il sistema
2149 il cambiamento dell'orologio è una operazione privilegiata e questa funzione
2150 può essere usata solo da un processo con i privilegi di amministratore,
2151 altrimenti la chiamata fallirà con un errore di \errcode{EPERM}.
2153 Data la scarsa precisione nell'uso di \type{time\_t} (che ha una risoluzione
2154 massima di un secondo) quando si devono effettuare operazioni sui tempi di
2155 norma l'uso delle funzioni precedenti è sconsigliato, ed esse sono di solito
2156 sostituite da \funcd{gettimeofday} e \funcd{settimeofday},\footnote{le due
2157 funzioni \func{time} e \func{stime} sono più antiche e derivano da SVr4,
2158 \func{gettimeofday} e \func{settimeofday} sono state introdotte da BSD, ed
2159 in BSD4.3 sono indicate come sostitute delle precedenti.} i cui prototipi
2162 \headdecl{sys/time.h}
2165 \funcdecl{int gettimeofday(struct timeval *tv, struct timezone *tz)}
2167 Legge il tempo corrente del sistema.
2169 \funcdecl{int settimeofday(const struct timeval *tv, const struct timezone
2172 Imposta il tempo di sistema.
2174 \bodydesc{Entrambe le funzioni restituiscono 0 in caso di successo e -1 in
2175 caso di errore, nel qual caso \var{errno} può assumere i valori
2176 \errval{EINVAL} \errval{EFAULT} e per \func{settimeofday} anche
2180 Si noti come queste funzioni utilizzino per indicare il tempo una struttura di
2181 tipo \struct{timeval}, la cui definizione si è già vista in
2182 fig.~\ref{fig:sys_timeval_struct}, questa infatti permette una espressione
2183 alternativa dei valori del \textit{calendar time}, con una precisione,
2184 rispetto a \type{time\_t}, fino al microsecondo.\footnote{la precisione è solo
2185 teorica, la precisione reale della misura del tempo dell'orologio di sistema
2186 non dipende dall'uso di queste strutture.}
2188 Come nel caso di \func{stime} anche \func{settimeofday} (la cosa continua a
2189 valere per qualunque funzione che vada a modificare l'orologio di sistema,
2190 quindi anche per quelle che tratteremo in seguito) può essere utilizzata solo
2191 da un processo coi privilegi di amministratore.\footnote{più precisamente la
2192 capabitity \const{CAP\_SYS\_TIME}.}
2194 Il secondo argomento di entrambe le funzioni è una struttura
2195 \struct{timezone}, che storicamente veniva utilizzata per specificare appunto
2196 la \textit{time zone}, cioè l'insieme del fuso orario e delle convenzioni per
2197 l'ora legale che permettevano il passaggio dal tempo universale all'ora
2198 locale. Questo argomento oggi è obsoleto ed in Linux non è mai stato
2199 utilizzato; esso non è supportato né dalle vecchie \textsl{libc5}, né dalle
2200 \textsl{glibc}: pertanto quando si chiama questa funzione deve essere sempre
2201 impostato a \val{NULL}.
2203 Modificare l'orologio di sistema con queste funzioni è comunque problematico,
2204 in quanto esse effettuano un cambiamento immediato. Questo può creare dei
2205 buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con
2206 conseguenze indesiderate. Ad esempio se si porta avanti l'orologio si possono
2207 perdere delle esecuzioni di \cmd{cron} programmate nell'intervallo che si è
2208 saltato. Oppure se si porta indietro l'orologio si possono eseguire due volte
2209 delle operazioni previste nell'intervallo di tempo che viene ripetuto.
2211 Per questo motivo la modalità più corretta per impostare l'ora è quella di
2212 usare la funzione \funcd{adjtime}, il cui prototipo è:
2213 \begin{prototype}{sys/time.h}
2214 {int adjtime(const struct timeval *delta, struct timeval *olddelta)}
2216 Aggiusta del valore \param{delta} l'orologio di sistema.
2218 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
2219 errore, nel qual caso \var{errno} assumerà il valore \errcode{EPERM}.}
2222 Questa funzione permette di avere un aggiustamento graduale del tempo di
2223 sistema in modo che esso sia sempre crescente in maniera monotona. Il valore
2224 di \param{delta} esprime il valore di cui si vuole spostare l'orologio; se è
2225 positivo l'orologio sarà accelerato per un certo tempo in modo da guadagnare
2226 il tempo richiesto, altrimenti sarà rallentato. Il secondo argomento viene
2227 usato, se non nullo, per ricevere il valore dell'ultimo aggiustamento
2231 \begin{figure}[!htb]
2232 \footnotesize \centering
2233 \begin{minipage}[c]{\textwidth}
2234 \includestruct{listati/timex.h}
2237 \caption{La struttura \structd{timex} per il controllo dell'orologio di
2239 \label{fig:sys_timex_struct}
2242 Linux poi prevede un'altra funzione, che consente un aggiustamento molto più
2243 dettagliato del tempo, permettendo ad esempio anche di modificare anche la
2244 velocità dell'orologio di sistema. La funzione è \funcd{adjtimex} ed il suo
2246 \begin{prototype}{sys/timex.h}
2247 {int adjtimex(struct timex *buf)}
2249 Aggiusta del valore \param{delta} l'orologio di sistema.
2251 \bodydesc{La funzione restituisce lo stato dell'orologio (un valore $>0$) in
2252 caso di successo e -1 in caso di errore, nel qual caso \var{errno}
2253 assumerà i valori \errval{EFAULT}, \errval{EINVAL} ed \errval{EPERM}.}
2256 La funzione richiede una struttura di tipo \struct{timex}, la cui definizione,
2257 così come effettuata in \headfile{sys/timex.h}, è riportata in
2258 fig.~\ref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore
2259 del campo \var{mode}, che specifica quale parametro dell'orologio di sistema,
2260 specificato in un opportuno campo di \struct{timex}, deve essere impostato. Un
2261 valore nullo serve per leggere i parametri correnti; i valori diversi da zero
2262 devono essere specificati come OR binario delle costanti riportate in
2263 tab.~\ref{tab:sys_timex_mode}.
2265 La funzione utilizza il meccanismo di David L. Mills, descritto
2266 nell'\href{http://www.ietf.org/rfc/rfc1305.txt}{RFC~1305}, che è alla base del
2267 protocollo NTP. La funzione è specifica di Linux e non deve essere usata se la
2268 portabilità è un requisito, le \acr{glibc} provvedono anche un suo omonimo
2269 \func{ntp\_adjtime}. La trattazione completa di questa funzione necessita di
2270 una lettura approfondita del meccanismo descritto nell'RFC~1305, ci limitiamo
2271 a descrivere in tab.~\ref{tab:sys_timex_mode} i principali valori utilizzabili
2272 per il campo \var{mode}, un elenco più dettagliato del significato dei vari
2273 campi della struttura \struct{timex} può essere ritrovato in \cite{GlibcMan}.
2278 \begin{tabular}[c]{|l|c|p{8.5cm}|}
2280 \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
2283 \const{ADJ\_OFFSET} & 0x0001 & Imposta la differenza fra il tempo
2284 reale e l'orologio di sistema:
2285 deve essere indicata in microsecondi
2286 nel campo \var{offset} di
2288 \const{ADJ\_FREQUENCY} & 0x0002 & Imposta la differenze in frequenza
2289 fra il tempo reale e l'orologio di
2290 sistema: deve essere indicata
2291 in parti per milione nel campo
2292 \var{frequency} di \struct{timex}.\\
2293 \const{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo
2295 sul tempo, espresso in microsecondi
2296 nel campo \var{maxerror} di
2298 \const{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore
2299 sul tempo, espresso in microsecondi
2300 nel campo \var{esterror} di
2302 \const{ADJ\_STATUS} & 0x0010 & Imposta alcuni
2303 valori di stato interni usati dal
2304 sistema nella gestione
2305 dell'orologio specificati nel campo
2306 \var{status} di \struct{timex}.\\
2307 \const{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del
2308 PLL implementato dal kernel,
2309 specificato nel campo
2310 \var{constant} di \struct{timex}.\\
2311 \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick}
2312 \itindex{clock~tick} del timer in
2313 microsecondi, espresso nel campo
2314 \var{tick} di \struct{timex}.\\
2315 \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Imposta uno spostamento una tantum
2316 dell'orologio secondo il valore del
2317 campo \var{offset} simulando il
2318 comportamento di \func{adjtime}.\\
2321 \caption{Costanti per l'assegnazione del valore del campo \var{mode} della
2322 struttura \struct{timex}.}
2323 \label{tab:sys_timex_mode}
2326 Il valore delle costanti per \var{mode} può essere anche espresso, secondo la
2327 sintassi specificata per la forma equivalente di questa funzione definita come
2328 \func{ntp\_adjtime}, utilizzando il prefisso \code{MOD} al posto di
2334 \begin{tabular}[c]{|l|c|l|}
2336 \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
2339 \const{TIME\_OK} & 0 & L'orologio è sincronizzato.\\
2340 \const{TIME\_INS} & 1 & Insert leap second.\\
2341 \const{TIME\_DEL} & 2 & Delete leap second.\\
2342 \const{TIME\_OOP} & 3 & Leap second in progress.\\
2343 \const{TIME\_WAIT} & 4 & Leap second has occurred.\\
2344 \const{TIME\_BAD} & 5 & L'orologio non è sincronizzato.\\
2347 \caption{Possibili valori di ritorno di \func{adjtimex}.}
2348 \label{tab:sys_adjtimex_return}
2351 La funzione ritorna un valore positivo che esprime lo stato dell'orologio di
2352 sistema; questo può assumere i valori riportati in
2353 tab.~\ref{tab:sys_adjtimex_return}. Un valore di -1 viene usato per riportare
2354 un errore; al solito se si cercherà di modificare l'orologio di sistema
2355 (specificando un \var{mode} diverso da zero) senza avere i privilegi di
2356 amministratore si otterrà un errore di \errcode{EPERM}.
2360 \subsection{La gestione delle date.}
2361 \label{sec:sys_date}
2363 Le funzioni viste al paragrafo precedente sono molto utili per trattare le
2364 operazioni elementari sui tempi, però le rappresentazioni del tempo ivi
2365 illustrate, se han senso per specificare un intervallo, non sono molto
2366 intuitive quando si deve esprimere un'ora o una data. Per questo motivo è
2367 stata introdotta una ulteriore rappresentazione, detta \textit{broken-down
2368 time}, che permette appunto di \textsl{suddividere} il \textit{calendar
2369 time} usuale in ore, minuti, secondi, ecc.
2371 Questo viene effettuato attraverso una opportuna struttura \struct{tm}, la cui
2372 definizione è riportata in fig.~\ref{fig:sys_tm_struct}, ed è in genere questa
2373 struttura che si utilizza quando si deve specificare un tempo a partire dai
2374 dati naturali (ora e data), dato che essa consente anche di trattare la
2375 gestione del fuso orario e dell'ora legale.\footnote{in realtà i due campi
2376 \var{tm\_gmtoff} e \var{tm\_zone} sono estensioni previste da BSD e dalle
2377 \acr{glibc}, che, quando è definita \macro{\_BSD\_SOURCE}, hanno la forma in
2378 fig.~\ref{fig:sys_tm_struct}.}
2380 Le funzioni per la gestione del \textit{broken-down time} sono varie e vanno
2381 da quelle usate per convertire gli altri formati in questo, usando o meno
2382 l'ora locale o il tempo universale, a quelle per trasformare il valore di un
2383 tempo in una stringa contenente data ed ora, i loro prototipi sono:
2386 \funcdecl{char *\funcd{asctime}(const struct tm *tm)}
2387 Produce una stringa con data e ora partendo da un valore espresso in
2388 \textit{broken-down time}.
2390 \funcdecl{char *\funcd{ctime}(const time\_t *timep)}
2391 Produce una stringa con data e ora partendo da un valore espresso in
2392 in formato \type{time\_t}.
2394 \funcdecl{struct tm *\funcd{gmtime}(const time\_t *timep)}
2395 Converte il \textit{calendar time} dato in formato \type{time\_t} in un
2396 \textit{broken-down time} espresso in UTC.
2398 \funcdecl{struct tm *\funcd{localtime}(const time\_t *timep)}
2399 Converte il \textit{calendar time} dato in formato \type{time\_t} in un
2400 \textit{broken-down time} espresso nell'ora locale.
2402 \funcdecl{time\_t \funcd{mktime}(struct tm *tm)}
2403 Converte il \textit{broken-down time} in formato \type{time\_t}.
2405 \bodydesc{Tutte le funzioni restituiscono un puntatore al risultato in caso
2406 di successo e \val{NULL} in caso di errore, tranne che \func{mktime} che
2407 restituisce direttamente il valore o -1 in caso di errore.}
2410 \begin{figure}[!htb]
2411 \footnotesize \centering
2412 \begin{minipage}[c]{\textwidth}
2413 \includestruct{listati/tm.h}
2416 \caption{La struttura \structd{tm} per una rappresentazione del tempo in
2417 termini di ora, minuti, secondi, ecc.}
2418 \label{fig:sys_tm_struct}
2423 Le prime due funzioni, \func{asctime} e \func{ctime} servono per poter
2424 stampare in forma leggibile un tempo; esse restituiscono il puntatore ad una
2425 stringa, allocata staticamente, nella forma:
2427 "Wed Jun 30 21:49:08 1993\n"
2429 e impostano anche la variabile \var{tzname} con l'informazione della
2430 \textit{time zone} corrente; \func{ctime} è banalmente definita in termini di
2431 \func{asctime} come \code{asctime(localtime(t)}. Dato che l'uso di una stringa
2432 statica rende le funzioni non \index{funzioni!rientranti} rientranti POSIX.1c
2433 e SUSv2 prevedono due sostitute \index{funzioni!rientranti} rientranti, il cui
2434 nome è al solito ottenuto aggiungendo un \code{\_r}, che prendono un secondo
2435 argomento \code{char *buf}, in cui l'utente deve specificare il buffer su cui
2436 la stringa deve essere copiata (deve essere di almeno 26 caratteri).
2438 Le altre tre funzioni, \func{gmtime}, \func{localtime} e \func{mktime} servono
2439 per convertire il tempo dal formato \type{time\_t} a quello di \struct{tm} e
2440 viceversa; \func{gmtime} effettua la conversione usando il tempo coordinato
2441 universale (UTC), cioè l'ora di Greenwich; mentre \func{localtime} usa l'ora
2442 locale; \func{mktime} esegue la conversione inversa.
2444 Anche in questo caso le prime due funzioni restituiscono l'indirizzo di una
2445 struttura allocata staticamente, per questo sono state definite anche altre
2446 due versioni \index{funzioni!rientranti} rientranti (con la solita estensione
2447 \code{\_r}), che prevedono un secondo argomento \code{struct tm *result},
2448 fornito dal chiamante, che deve preallocare la struttura su cui sarà
2449 restituita la conversione.
2451 Come mostrato in fig.~\ref{fig:sys_tm_struct} il \textit{broken-down time}
2452 permette di tenere conto anche della differenza fra tempo universale e ora
2453 locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre
2454 \index{variabili!globali} variabili globali mostrate in
2455 fig.~\ref{fig:sys_tzname}, cui si accede quando si include
2456 \headfile{time.h}. Queste variabili vengono impostate quando si chiama una
2457 delle precedenti funzioni di conversione, oppure invocando direttamente la
2458 funzione \funcd{tzset}, il cui prototipo è:
2459 \begin{prototype}{sys/timex.h}
2462 Imposta le variabili globali della \textit{time zone}.
2464 \bodydesc{La funzione non ritorna niente e non dà errori.}
2467 La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire
2468 dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è
2469 definita verrà usato il file \conffile{/etc/localtime}.
2471 \begin{figure}[!htb]
2474 \begin{minipage}[c]{\textwidth}
2475 \includestruct{listati/time_zone_var.c}
2478 \caption{Le \index{variabili!globali} variabili globali usate per la
2479 gestione delle \textit{time zone}.}
2480 \label{fig:sys_tzname}
2483 La variabile \var{tzname} contiene due stringhe, che indicano i due nomi
2484 standard della \textit{time zone} corrente. La prima è il nome per l'ora
2485 solare, la seconda per l'ora legale.\footnote{anche se sono indicati come
2486 \code{char *} non è il caso di modificare queste stringhe.} La variabile
2487 \var{timezone} indica la differenza di fuso orario in secondi, mentre
2488 \var{daylight} indica se è attiva o meno l'ora legale.
2490 Benché la funzione \func{asctime} fornisca la modalità più immediata per
2491 stampare un tempo o una data, la flessibilità non fa parte delle sue
2492 caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il
2493 giorno) di un tempo si può ricorrere alla più sofisticata \funcd{strftime},
2495 \begin{prototype}{time.h}
2496 {size\_t strftime(char *s, size\_t max, const char *format,
2497 const struct tm *tm)}
2499 Stampa il tempo \param{tm} nella stringa \param{s} secondo il formato
2502 \bodydesc{La funzione ritorna il numero di caratteri stampati in \param{s},
2503 altrimenti restituisce 0.}
2506 La funzione converte opportunamente il tempo \param{tm} in una stringa di
2507 testo da salvare in \param{s}, purché essa sia di dimensione, indicata da
2508 \param{size}, sufficiente. I caratteri generati dalla funzione vengono
2509 restituiti come valore di ritorno, ma non tengono conto del terminatore
2510 finale, che invece viene considerato nel computo della dimensione; se
2511 quest'ultima è eccessiva viene restituito 0 e lo stato di \param{s} è
2517 \begin{tabular}[c]{|c|l|p{6cm}|}
2519 \textbf{Modificatore} & \textbf{Esempio} & \textbf{Significato}\\
2522 \var{\%a}&\texttt{Wed} & Nome del giorno, abbreviato.\\
2523 \var{\%A}&\texttt{Wednesday} & Nome del giorno, completo.\\
2524 \var{\%b}&\texttt{Apr} & Nome del mese, abbreviato.\\
2525 \var{\%B}&\texttt{April} & Nome del mese, completo.\\
2526 \var{\%c}&\texttt{Wed Apr 24 18:40:50 2002}& Data e ora.\\
2527 \var{\%d}&\texttt{24} & Giorno del mese.\\
2528 \var{\%H}&\texttt{18} & Ora del giorno, da 0 a 24.\\
2529 \var{\%I}&\texttt{06} & Ora del giorno, da 0 a 12.\\
2530 \var{\%j}&\texttt{114} & Giorno dell'anno.\\
2531 \var{\%m}&\texttt{04} & Mese dell'anno.\\
2532 \var{\%M}&\texttt{40} & Minuto.\\
2533 \var{\%p}&\texttt{PM} & AM/PM.\\
2534 \var{\%S}&\texttt{50} & Secondo.\\
2535 \var{\%U}&\texttt{16} & Settimana dell'anno (partendo dalla
2537 \var{\%w}&\texttt{3} & Giorno della settimana. \\
2538 \var{\%W}&\texttt{16} & Settimana dell'anno (partendo dal
2540 \var{\%x}&\texttt{04/24/02} & La data.\\
2541 \var{\%X}&\texttt{18:40:50} & L'ora.\\
2542 \var{\%y}&\texttt{02} & Anno nel secolo.\\
2543 \var{\%Y}&\texttt{2002} & Anno.\\
2544 \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\
2545 \var{\%\%}&\texttt{\%} & Il carattere \%.\\
2548 \caption{Valori previsti dallo standard ANSI C per modificatore della
2549 stringa di formato di \func{strftime}.}
2550 \label{tab:sys_strftime_format}
2553 Il risultato della funzione è controllato dalla stringa di formato
2554 \param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che
2555 viene utilizzato come modificatore; alcuni\footnote{per la precisione quelli
2556 definiti dallo standard ANSI C, che sono anche quelli riportati da POSIX.1;
2557 le \acr{glibc} provvedono tutte le estensioni introdotte da POSIX.2 per il
2558 comando \cmd{date}, i valori introdotti da SVID3 e ulteriori estensioni GNU;
2559 l'elenco completo dei possibili valori è riportato nella pagina di manuale
2560 della funzione.} dei possibili valori che esso può assumere sono riportati
2561 in tab.~\ref{tab:sys_strftime_format}. La funzione tiene conto anche della
2562 presenza di una localizzazione per stampare in maniera adeguata i vari nomi.
2564 \itindend{calendar~time}
2567 \section{La gestione degli errori}
2568 \label{sec:sys_errors}
2570 In questa sezione esamineremo le caratteristiche principali della gestione
2571 degli errori in un sistema unix-like. Infatti a parte il caso particolare di
2572 alcuni segnali (che tratteremo in cap.~\ref{cha:signals}) in un sistema
2573 unix-like il kernel non avvisa mai direttamente un processo dell'occorrenza di
2574 un errore nell'esecuzione di una funzione, ma di norma questo viene riportato
2575 semplicemente usando un opportuno valore di ritorno della funzione invocata.
2576 Inoltre il sistema di classificazione degli errori è basato sull'architettura
2577 a processi, e presenta una serie di problemi nel caso lo si debba usare con i
2578 \itindex{thread} \textit{thread}.
2581 \subsection{La variabile \var{errno}}
2582 \label{sec:sys_errno}
2584 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
2585 riportare condizioni di errore, ed è una norma fondamentale di buona
2586 programmazione controllare \textbf{sempre} che le funzioni chiamate si siano
2587 concluse correttamente.
2589 In genere le funzioni di libreria usano un valore speciale per indicare che
2590 c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la
2591 costante \val{EOF} (a seconda della funzione); ma questo valore segnala solo
2592 che c'è stato un errore, non il tipo di errore.
2594 Per riportare il tipo di errore il sistema usa \index{variabili!globali} la
2595 variabile globale \var{errno},\footnote{l'uso di una variabile globale può
2596 comportare alcuni problemi (ad esempio nel caso dei \itindex{thread}
2597 \textit{thread}) ma lo standard ISO C consente anche di definire \var{errno}
2598 come un \textit{modifiable lvalue}, quindi si può anche usare una macro, e
2599 questo è infatti il modo usato da Linux per renderla locale ai singoli
2600 \itindex{thread} \textit{thread}.} definita nell'header \headfile{errno.h};
2601 la variabile è in genere definita come \direct{volatile} dato che può essere
2602 cambiata in modo asincrono da un segnale (si veda sez.~\ref{sec:sig_sigchld}
2603 per un esempio, ricordando quanto trattato in sez.~\ref{sec:proc_race_cond}),
2604 ma dato che un gestore di segnale scritto bene salva e ripristina il valore
2605 della variabile, di questo non è necessario preoccuparsi nella programmazione
2608 I valori che può assumere \var{errno} sono riportati in app.~\ref{cha:errors},
2609 nell'header \headfile{errno.h} sono anche definiti i nomi simbolici per le
2610 costanti numeriche che identificano i vari errori; essi iniziano tutti per
2611 \val{E} e si possono considerare come nomi riservati. In seguito faremo sempre
2612 riferimento a tali valori, quando descriveremo i possibili errori restituiti
2613 dalle funzioni. Il programma di esempio \cmd{errcode} stampa il codice
2614 relativo ad un valore numerico con l'opzione \cmd{-l}.
2616 Il valore di \var{errno} viene sempre impostato a zero all'avvio di un
2617 programma, gran parte delle funzioni di libreria impostano \var{errno} ad un
2618 valore diverso da zero in caso di errore. Il valore è invece indefinito in
2619 caso di successo, perché anche se una funzione ha successo, può chiamarne
2620 altre al suo interno che falliscono, modificando così \var{errno}.
2622 Pertanto un valore non nullo di \var{errno} non è sintomo di errore (potrebbe
2623 essere il risultato di un errore precedente) e non lo si può usare per
2624 determinare quando o se una chiamata a funzione è fallita. La procedura da
2625 seguire è sempre quella di controllare \var{errno} immediatamente dopo aver
2626 verificato il fallimento della funzione attraverso il suo codice di ritorno.
2629 \subsection{Le funzioni \func{strerror} e \func{perror}}
2630 \label{sec:sys_strerror}
2632 Benché gli errori siano identificati univocamente dal valore numerico di
2633 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
2634 riportare in opportuni messaggi le condizioni di errore verificatesi. La
2635 prima funzione che si può usare per ricavare i messaggi di errore è
2636 \funcd{strerror}, il cui prototipo è:
2637 \begin{prototype}{string.h}{char *strerror(int errnum)}
2638 Restituisce una stringa con il messaggio di errore relativo ad
2641 \bodydesc{La funzione ritorna il puntatore ad una stringa di errore.}
2645 La funzione ritorna il puntatore alla stringa contenente il messaggio di
2646 errore corrispondente al valore di \param{errnum}, se questo non è un valore
2647 valido verrà comunque restituita una stringa valida contenente un messaggio
2648 che dice che l'errore è sconosciuto, e \var{errno} verrà modificata assumendo
2649 il valore \errval{EINVAL}.
2651 In generale \func{strerror} viene usata passando \var{errno} come argomento,
2652 ed il valore di quest'ultima non verrà modificato. La funzione inoltre tiene
2653 conto del valore della variabile di ambiente \envvar{LC\_MESSAGES} per usare
2654 le appropriate traduzioni dei messaggi d'errore nella localizzazione presente.
2656 La funzione utilizza una stringa statica che non deve essere modificata dal
2657 programma; essa è utilizzabile solo fino ad una chiamata successiva a
2658 \func{strerror} o \func{perror}, nessun'altra funzione di libreria tocca
2659 questa stringa. In ogni caso l'uso di una stringa statica rende la funzione
2660 non \index{funzioni!rientranti} rientrante, per cui nel caso si usino i
2661 \itindex{thread} \textit{thread} le librerie forniscono\footnote{questa
2662 funzione è la versione prevista dalle \acr{glibc}, ed effettivamente
2663 definita in \headfile{string.h}, ne esiste una analoga nello standard SUSv3
2664 (quella riportata dalla pagina di manuale), che restituisce \code{int} al
2665 posto di \code{char *}, e che tronca la stringa restituita a
2666 \param{size}.} una apposita versione \index{funzioni!rientranti} rientrante
2667 \funcd{strerror\_r}, il cui prototipo è:
2668 \begin{prototype}{string.h}
2669 {char * strerror\_r(int errnum, char *buf, size\_t size)}
2671 Restituisce una stringa con il messaggio di errore relativo ad
2674 \bodydesc{La funzione restituisce l'indirizzo del messaggio in caso di
2675 successo e \val{NULL} in caso di errore; nel qual caso \var{errno}
2678 \item[\errcode{EINVAL}] si è specificato un valore di \param{errnum} non
2680 \item[\errcode{ERANGE}] la lunghezza di \param{buf} è insufficiente a
2681 contenere la stringa di errore.
2686 La funzione è analoga a \func{strerror} ma restituisce la stringa di errore
2687 nel buffer \param{buf} che il singolo \itindex{thread} \textit{thread} deve
2688 allocare autonomamente per evitare i problemi connessi alla condivisione del
2689 buffer statico. Il messaggio è copiato fino alla dimensione massima del
2690 buffer, specificata dall'argomento
2691 \param{size}, che deve comprendere pure il carattere di terminazione;
2692 altrimenti la stringa viene troncata.
2694 Una seconda funzione usata per riportare i codici di errore in maniera
2695 automatizzata sullo standard error è \funcd{perror}, il cui prototipo è:
2696 \begin{prototype}{stdio.h}{void perror(const char *message)}
2697 Stampa il messaggio di errore relativo al valore corrente di \var{errno}
2698 sullo standard error; preceduto dalla stringa \param{message}.
2701 I messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati
2702 in app.~\ref{cha:errors}), e, usando il valore corrente di \var{errno}, si
2703 riferiscono all'ultimo errore avvenuto. La stringa specificata con
2704 \param{message} viene stampato prima del messaggio d'errore, seguita dai due
2705 punti e da uno spazio, il messaggio è terminato con un a capo.
2707 Il messaggio può essere riportato anche usando le due
2708 \index{variabili!globali} variabili globali:
2709 \includecodesnip{listati/errlist.c}
2710 dichiarate in \headfile{errno.h}. La prima contiene i puntatori alle stringhe
2711 di errore indicizzati da \var{errno}; la seconda esprime il valore più alto
2712 per un codice di errore, l'utilizzo di questa stringa è sostanzialmente
2713 equivalente a quello di \func{strerror}.
2715 \begin{figure}[!htbp]
2716 \footnotesize \centering
2717 \begin{minipage}[c]{\codesamplewidth}
2718 \includecodesample{listati/errcode_mess.c}
2721 \caption{Codice per la stampa del messaggio di errore standard.}
2722 \label{fig:sys_err_mess}
2725 In fig.~\ref{fig:sys_err_mess} è riportata la sezione attinente del codice del
2726 programma \cmd{errcode}, che può essere usato per stampare i messaggi di
2727 errore e le costanti usate per identificare i singoli errori; il sorgente
2728 completo del programma è allegato nel file \file{ErrCode.c} e contiene pure la
2729 gestione delle opzioni e tutte le definizioni necessarie ad associare il
2730 valore numerico alla costante simbolica. In particolare si è riportata la
2731 sezione che converte la stringa passata come argomento in un intero
2732 (\texttt{\small 1--2}), controllando con i valori di ritorno di \funcm{strtol}
2733 che la conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi
2734 stampa, a seconda dell'opzione scelta il messaggio di errore (\texttt{\small
2735 11--14}) o la macro (\texttt{\small 15--17}) associate a quel codice.
2739 \subsection{Alcune estensioni GNU}
2740 \label{sec:sys_err_GNU}
2742 Le precedenti funzioni sono quelle definite ed usate nei vari standard; le
2743 \acr{glibc} hanno però introdotto una serie di estensioni ``GNU'' che
2744 forniscono alcune funzionalità aggiuntive per una gestione degli errori
2745 semplificata e più efficiente.
2747 La prima estensione consiste in due variabili, \code{char *
2748 program\_invocation\_name} e \code{char * program\_invocation\_short\_name}
2749 servono per ricavare il nome del programma; queste sono utili quando si deve
2750 aggiungere il nome del programma (cosa comune quando si ha un programma che
2751 non viene lanciato da linea di comando e salva gli errori in un file di log)
2752 al messaggio d'errore. La prima contiene il nome usato per lanciare il
2753 programma (ed è equivalente ad \code{argv[0]}); la seconda mantiene solo il
2754 nome del programma (senza eventuali directory in testa).
2756 Uno dei problemi che si hanno con l'uso di \func{perror} è che non c'è
2757 flessibilità su quello che si può aggiungere al messaggio di errore, che può
2758 essere solo una stringa. In molte occasioni invece serve poter scrivere dei
2759 messaggi con maggiore informazione; ad esempio negli standard di
2760 programmazione GNU si richiede che ogni messaggio di errore sia preceduto dal
2761 nome del programma, ed in generale si può voler stampare il contenuto di
2762 qualche variabile; per questo le \acr{glibc} definiscono la funzione
2763 \funcd{error}, il cui prototipo è:
2764 \begin{prototype}{stdio.h}
2765 {void error(int status, int errnum, const char *format, ...)}
2767 Stampa un messaggio di errore formattato.
2769 \bodydesc{La funzione non restituisce nulla e non riporta errori.}
2772 La funzione fa parte delle estensioni GNU per la gestione degli errori,
2773 l'argomento \param{format} prende la stessa sintassi di \func{printf}, ed i
2774 relativi argomenti devono essere forniti allo stesso modo, mentre
2775 \param{errnum} indica l'errore che si vuole segnalare (non viene quindi usato
2776 il valore corrente di \var{errno}); la funzione stampa sullo standard error il
2777 nome del programma, come indicato dalla \index{variabili!globali} variabile
2778 globale \var{program\_name}, seguito da due punti ed uno spazio, poi dalla
2780 \param{format} e dagli argomenti seguenti, seguita da due punti ed uno spazio
2781 infine il messaggio di errore relativo ad \param{errnum}, il tutto è terminato
2784 Il comportamento della funzione può essere ulteriormente controllato se si
2785 definisce una variabile \var{error\_print\_progname} come puntatore ad una
2786 funzione \ctyp{void} che restituisce \ctyp{void} che si incarichi di stampare
2787 il nome del programma.
2789 L'argomento \param{status} può essere usato per terminare direttamente il
2790 programma in caso di errore, nel qual caso \func{error} dopo la stampa del
2791 messaggio di errore chiama \func{exit} con questo stato di uscita. Se invece
2792 il valore è nullo \func{error} ritorna normalmente ma viene incrementata
2793 un'altra \index{variabili!globali} variabile globale,
2794 \var{error\_message\_count}, che tiene conto di quanti errori ci sono stati.
2796 Un'altra funzione per la stampa degli errori, ancora più sofisticata, che
2797 prende due argomenti aggiuntivi per indicare linea e file su cui è avvenuto
2798 l'errore è \funcd{error\_at\_line}; il suo prototipo è:
2799 \begin{prototype}{stdio.h}
2800 {void error\_at\_line(int status, int errnum, const char *fname,
2801 unsigned int lineno, const char *format, ...)}
2803 Stampa un messaggio di errore formattato.
2805 \bodydesc{La funzione non restituisce nulla e non riporta errori.}
2807 \noindent ed il suo comportamento è identico a quello di \func{error} se non
2808 per il fatto che, separati con il solito due punti-spazio, vengono inseriti un
2809 nome di file indicato da \param{fname} ed un numero di linea subito dopo la
2810 stampa del nome del programma. Inoltre essa usa un'altra
2811 \index{variabili!globali} variabile globale, \var{error\_one\_per\_line}, che
2812 impostata ad un valore diverso da zero fa si che errori relativi alla stessa
2813 linea non vengano ripetuti.
2816 % LocalWords: filesystem like kernel saved header limits sysconf sez tab float
2817 % LocalWords: FOPEN stdio MB LEN CHAR char UCHAR unsigned SCHAR MIN signed INT
2818 % LocalWords: SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG
2819 % LocalWords: Stevens exec CHILD STREAM stream TZNAME timezone NGROUPS SSIZE
2820 % LocalWords: ssize LISTIO JOB CONTROL job control IDS VERSION YYYYMML bits bc
2821 % LocalWords: dall'header posix lim nell'header glibc run unistd name errno
2822 % LocalWords: NGROUP CLK TCK clock tick process PATH pathname BUF CANON path
2823 % LocalWords: pathconf fpathconf descriptor fd uname sys struct utsname info
2824 % LocalWords: EFAULT fig SOURCE NUL LENGTH DOMAIN NMLN UTSLEN system call proc
2825 % LocalWords: domainname sysctl BSD nlen void oldval size oldlenp newval EPERM
2826 % LocalWords: newlen ENOTDIR EINVAL ENOMEM linux array oldvalue paging stack
2827 % LocalWords: TCP shell Documentation ostype hostname osrelease version mount
2828 % LocalWords: const source filesystemtype mountflags ENODEV ENOTBLK block read
2829 % LocalWords: device EBUSY only EACCES NODEV ENXIO major
2830 % LocalWords: number EMFILE dummy ENAMETOOLONG ENOENT ELOOP virtual devfs MGC
2831 % LocalWords: magic MSK RDONLY NOSUID suid sgid NOEXEC SYNCHRONOUS REMOUNT MNT
2832 % LocalWords: MANDLOCK mandatory locking WRITE APPEND append IMMUTABLE NOATIME
2833 % LocalWords: access NODIRATIME BIND MOVE umount flags FORCE statfs fstatfs ut
2834 % LocalWords: buf ENOSYS EIO EBADF type fstab mntent home shadow username uid
2835 % LocalWords: passwd PAM Pluggable Authentication Method Service Switch pwd ru
2836 % LocalWords: getpwuid getpwnam NULL buflen result ERANGE getgrnam getgrgid AS
2837 % LocalWords: grp group gid SVID fgetpwent putpwent getpwent setpwent endpwent
2838 % LocalWords: fgetgrent putgrent getgrent setgrent endgrent accounting init HZ
2839 % LocalWords: runlevel Hierarchy logout setutent endutent utmpname utmp paths
2840 % LocalWords: WTMP getutent getutid getutline pututline LVL OLD DEAD EMPTY dev
2841 % LocalWords: line libc XPG utmpx getutxent getutxid getutxline pututxline who
2842 % LocalWords: setutxent endutxent wmtp updwtmp logwtmp wtmp host rusage utime
2843 % LocalWords: minflt majflt nswap fault swap timeval wait getrusage usage SELF
2844 % LocalWords: CHILDREN current limit soft RLIMIT address brk mremap mmap dump
2845 % LocalWords: SIGSEGV SIGXCPU SIGKILL sbrk FSIZE SIGXFSZ EFBIG LOCKS lock dup
2846 % LocalWords: MEMLOCK NOFILE NPROC fork EAGAIN SIGPENDING sigqueue kill RSS tv
2847 % LocalWords: resource getrlimit setrlimit rlimit rlim INFINITY capabilities
2848 % LocalWords: capability CAP l'I Sun Sparc PAGESIZE getpagesize SVr SUSv get
2849 % LocalWords: phys pages avphys NPROCESSORS CONF ONLN getloadavg stdlib double
2850 % LocalWords: loadavg nelem scheduler CONFIG ACCT acct filename EUSER
2851 % LocalWords: ENFILE EROFS PACCT AcctCtrl cap calendar UTC Jan the Epoch GMT
2852 % LocalWords: Greenwich Mean l'UTC timer CLOCKS SEC cron wall elapsed times tz
2853 % LocalWords: tms cutime cstime waitpid gettimeofday settimeofday timex
2854 % LocalWords: timespec adjtime olddelta adjtimex David Mills RFC NTP ntp
2855 % LocalWords: nell'RFC ADJ FREQUENCY frequency MAXERROR maxerror ESTERROR PLL
2856 % LocalWords: esterror TIMECONST constant SINGLESHOT MOD INS insert leap OOP
2857 % LocalWords: second delete progress has occurred BAD broken tm gmtoff asctime
2858 % LocalWords: ctime timep gmtime localtime mktime tzname tzset daylight format
2859 % LocalWords: strftime thread EOF modifiable lvalue app errcode strerror LC at
2860 % LocalWords: perror string errnum MESSAGES error message ErrCode strtol log
2861 % LocalWords: program invocation argv printf print progname exit count fname
2862 % LocalWords: lineno one standardese Di page Wed Wednesday Apr April PM AM
2867 %%% Local Variables:
2869 %%% TeX-master: "gapil"