X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=60ca1e9bae873a10d505afdcd965e1ab3f638b37;hp=e5fe228b30d7bd41f80270be16f10a1bc2c37b4b;hb=b99370b46df36884995d94ed00de41aa51b4e027;hpb=a051e3c3d3b403ee210274d8c2ec7d756c531a21 diff --git a/system.tex b/system.tex index e5fe228..60ca1e9 100644 --- a/system.tex +++ b/system.tex @@ -1,6 +1,6 @@ %% system.tex %% -%% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2003 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Prefazione", @@ -365,22 +365,7 @@ sostituendolo a \code{\_POSIX\_} per le macro definite dagli gli altri due. In generale si dovrebbe fare uso di \func{sysconf} solo quando la relativa macro non è definita, quindi con un codice analogo al seguente: -%\footnotesize -\begin{lstlisting}[stepnumber=0,frame=]{} -get_child_max(void) -{ -#ifdef CHILD_MAX - return CHILD_MAX; -#else - int val = sysconf(_SC_CHILD_MAX); - if (val < 0) { - perror("fatal error"); - exit(-1); - } - return val; -} -\end{lstlisting} -%\normalsize +\includecodesnip{listati/get_child_max.c} ma in realtà in Linux queste macro sono comunque definite, indicando però un limite generico. Per questo motivo è sempre meglio usare i valori restituiti da \func{sysconf}. @@ -521,18 +506,7 @@ solo definendo \macro{\_GNU\_SOURCE}. \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct utsname { - char sysname[]; - char nodename[]; - char release[]; - char version[]; - char machine[]; -#ifdef _GNU_SOURCE - char domainname[]; -#endif -}; - \end{lstlisting} + \includestruct{listati/ustname.h} \end{minipage} \normalsize \caption{La struttura \structd{utsname}.} @@ -896,20 +870,7 @@ genere \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct statfs { - long f_type; /* tipo di filesystem */ - long f_bsize; /* dimensione ottimale dei blocchi di I/O */ - long f_blocks; /* blocchi totali nel filesystem */ - long f_bfree; /* blocchi liberi nel filesystem */ - long f_bavail; /* blocchi liberi agli utenti normali */ - long f_files; /* inode totali nel filesystem */ - long f_ffree; /* inode liberi nel filesystem */ - fsid_t f_fsid; /* filesystem id */ - long f_namelen; /* lunghezza massima dei nomi dei file */ - long f_spare[6]; /* riservati per uso futuro */ -}; -\end{lstlisting} + \includestruct{listati/statfs.h} \end{minipage} \normalsize \caption{La struttura \structd{statfs}.} @@ -983,17 +944,7 @@ il significato dei vari campi. \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct passwd { - char *pw_name; /* user name */ - char *pw_passwd; /* user password */ - uid_t pw_uid; /* user id */ - gid_t pw_gid; /* group id */ - char *pw_gecos; /* real name */ - char *pw_dir; /* home directory */ - char *pw_shell; /* shell program */ -}; - \end{lstlisting} + \includestruct{listati/passwd.h} \end{minipage} \normalsize \caption{La struttura \structd{passwd} contenente le informazioni relative ad @@ -1070,14 +1021,7 @@ in questo caso le informazioni vengono restituite in una struttura di tipo \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct group { - char *gr_name; /* group name */ - char *gr_passwd; /* group password */ - gid_t gr_gid; /* group id */ - char **gr_mem; /* group members */ -}; - \end{lstlisting} + \includestruct{listati/group.h} \end{minipage} \normalsize \caption{La struttura \structd{group} contenente le informazioni relative ad @@ -1161,16 +1105,16 @@ da cui ci si collega, l'\acr{uid} della shell di login, l'orario della connessione ed altre informazioni. La voce resta nel file fino al logout, quando viene cancellata e spostata in \file{/var/log/wtmp}. -In questo modo il primo file viene utilizzato per registrare sta utilizzando -il sistema al momento corrente, mentre il secondo mantiene la registrazione -delle attività degli utenti. A quest'ultimo vengono anche aggiunte delle voci -speciali per tenere conto dei cambiamenti del sistema, come la modifica del -runlevel, il riavvio della macchina, ecc. Tutte queste informazioni sono -descritte in dettaglio nel manuale delle \acr{glibc}. +In questo modo il primo file viene utilizzato per registrare chi sta +utilizzando il sistema al momento corrente, mentre il secondo mantiene la +registrazione delle attività degli utenti. A quest'ultimo vengono anche +aggiunte delle voci speciali per tenere conto dei cambiamenti del sistema, +come la modifica del runlevel, il riavvio della macchina, ecc. Tutte queste +informazioni sono descritte in dettaglio nel manuale delle \acr{glibc}. Questi file non devono mai essere letti direttamente, ma le informazioni che contengono possono essere ricavate attraverso le opportune funzioni di -libreria. Queste sono analoghe alle precedenti (vedi +libreria. Queste sono analoghe alle precedenti funzioni (vedi \tabref{tab:sys_passwd_func}) usate per accedere al database degli utenti, solo che in questo caso la struttura del database di accounting è molto più complessa, dato che contiene diversi tipi di informazione. @@ -1206,6 +1150,18 @@ standard \const{\_PATH\_UTMP} (che corrispondenti ai file \file{/var/run/utmp} e \file{/var/log/wtmp} visti in precedenza. +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/utmp.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{utmp} contenente le informazioni di una voce + del database di \textit{accounting}.} + \label{fig:sys_utmp_struct} +\end{figure} + Una volta aperto il file si può eseguire una scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent}, \funcd{getutid}, \funcd{getutline} e \funcd{pututline}, i cui prototipi sono: @@ -1230,39 +1186,11 @@ e \funcd{pututline}, i cui prototipi sono: \end{functions} Tutte queste funzioni fanno riferimento ad una struttura di tipo \struct{utmp}, -la cui definizione in Linux è riportata in \secref{fig:sys_utmp_struct}. Le +la cui definizione in Linux è riportata in \figref{fig:sys_utmp_struct}. Le prime tre funzioni servono per leggere una voce dal database; \func{getutent} legge semplicemente la prima voce disponibile; le altre due permettono di eseguire una ricerca. -\begin{figure}[!htb] - \footnotesize - \centering - \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct utmp -{ - short int ut_type; /* Type of login. */ - pid_t ut_pid; /* Process ID of login process. */ - char ut_line[UT_LINESIZE]; /* Devicename. */ - char ut_id[4]; /* Inittab ID. */ - char ut_user[UT_NAMESIZE]; /* Username. */ - char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ - struct exit_status ut_exit; /* Exit status of a process marked - as DEAD_PROCESS. */ - long int ut_session; /* Session ID, used for windowing. */ - struct timeval ut_tv; /* Time entry was made. */ - int32_t ut_addr_v6[4]; /* Internet address of remote host. */ - char __unused[20]; /* Reserved for future use. */ -}; - \end{lstlisting} - \end{minipage} - \normalsize - \caption{La struttura \structd{utmp} contenente le informazioni di una voce - del database di \textit{accounting}.} - \label{fig:sys_utmp_struct} -\end{figure} - Con \func{getutid} si può cercare una voce specifica, a seconda del valore del campo \var{ut\_type} dell'argomento \param{ut}. Questo può assumere i valori riportati in \tabref{tab:sys_ut_type}, quando assume i valori @@ -1291,7 +1219,7 @@ corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}. \const{LOGIN\_PROCESS}& Identifica un processo di login. \\ \const{USER\_PROCESS} & Identifica un processo utente. \\ \const{DEAD\_PROCESS} & Identifica un processo terminato. \\ - \const{ACCOUNTING} & ??? \\ +% \const{ACCOUNTING} & ??? \\ \hline \end{tabular} \caption{Classificazione delle voci del database di accounting a seconda dei @@ -1343,9 +1271,6 @@ prototipi sono: \funcdecl{void logwtmp(const char *line, const char *name, const char *host)} Aggiunge nel database di accounting una voce con i valori specificati. - - \bodydesc{Le funzioni ritornano il puntatore ad una struttura \struct{utmp} - in caso di successo e \val{NULL} in caso di errore.} \end{functions} La prima funzione permette l'aggiunta di una voce a \file{wmtp} specificando @@ -1377,26 +1302,7 @@ di tipo \struct{rusage}, la cui definizione (che si trova in \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct rusage { - struct timeval ru_utime; /* user time used */ - struct timeval ru_stime; /* system time used */ - long ru_maxrss; /* maximum resident set size */ - long ru_ixrss; /* integral shared memory size */ - long ru_idrss; /* integral unshared data size */ - long ru_isrss; /* integral unshared stack size */ - long ru_minflt; /* page reclaims */ - long ru_majflt; /* page faults */ - long ru_nswap; /* swaps */ - long ru_inblock; /* block input operations */ - long ru_oublock; /* block output operations */ - long ru_msgsnd; /* messages sent */ - long ru_msgrcv; /* messages received */ - long ru_nsignals; ; /* signals received */ - long ru_nvcsw; /* voluntary context switches */ - long ru_nivcsw; /* involuntary context switches */ -}; - \end{lstlisting} + \includestruct{listati/rusage.h} \end{minipage} \normalsize \caption{La struttura \structd{rusage} per la lettura delle informazioni dei @@ -1469,23 +1375,6 @@ struttura \struct{rlimit}, la cui definizione \figref{fig:sys_rlimit_struct}, ed i cui campi corrispondono appunto a limite corrente e limite massimo. -\begin{figure}[!htb] - \footnotesize - \centering - \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct rlimit { - rlim_t rlim_cur; - rlim_t rlim_max; -}; - \end{lstlisting} - \end{minipage} - \normalsize - \caption{La struttura \structd{rlimit} per impostare i limiti di utilizzo - delle risorse usate da un processo.} - \label{fig:sys_rlimit_struct} -\end{figure} - In genere il superamento di un limite comporta o l'emissione di un segnale o il fallimento della system call che lo ha provocato; per permettere di leggere e di impostare i limiti di utilizzo delle risorse da parte di un processo @@ -1514,6 +1403,20 @@ prototipi sono: ed \errval{EFAULT}.} \end{functions} +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/rlimit.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{rlimit} per impostare i limiti di utilizzo + delle risorse usate da un processo.} + \label{fig:sys_rlimit_struct} +\end{figure} + + + Entrambe le funzioni permettono di specificare, attraverso l'argomento \param{resource}, su quale risorsa si vuole operare: i possibili valori di questo argomento sono elencati in \secref{tab:sys_rlimit_values}. L'acceso @@ -1740,9 +1643,9 @@ dei tempi di esecuzione dei processi. Per ciascun processo il kernel calcola tre tempi diversi: \begin{description} \item[\textit{clock time}]: il tempo \textsl{reale} (viene chiamato anche - \textit{wall clock time}) passato dall'avvio del processo. Chiaramente tale - tempo dipende anche dal carico del sistema e da quanti altri processi - stavano girando nello stesso periodo. + \textit{wall clock time} o \textit{elapsed time}) passato dall'avvio del + processo. Chiaramente tale tempo dipende anche dal carico del sistema e da + quanti altri processi stavano girando nello stesso periodo. \item[\textit{user time}]: il tempo che la CPU ha impiegato nell'esecuzione delle istruzioni del processo in user space. \item[\textit{system time}]: il tempo che la CPU ha impiegato nel kernel per @@ -1808,14 +1711,7 @@ struttura di tipo \struct{tms}, la cui definizione \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct tms { - clock_t tms_utime; /* user time */ - clock_t tms_stime; /* system time */ - clock_t tms_cutime; /* user time of children */ - clock_t tms_cstime; /* system time of children */ -}; - \end{lstlisting} + \includestruct{listati/tms.h} \end{minipage} \normalsize \caption{La struttura \structd{tms} dei tempi di processore associati a un @@ -1908,17 +1804,7 @@ nanosecondo.\footnote{la precisione \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct timeval -{ - long tv_sec; /* seconds */ - long tv_usec; /* microseconds */ -}; -struct timespec { - time_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ -}; - \end{lstlisting} + \includestruct{listati/timeval.h} \end{minipage} \normalsize \caption{Le strutture \structd{timeval} e \structd{timespec} usate per una @@ -1971,29 +1857,7 @@ effettuato. \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct timex { - unsigned int modes; /* mode selector */ - long int offset; /* time offset (usec) */ - long int freq; /* frequency offset (scaled ppm) */ - long int maxerror; /* maximum error (usec) */ - long int esterror; /* estimated error (usec) */ - int status; /* clock command/status */ - long int constant; /* pll time constant */ - long int precision; /* clock precision (usec) (read only) */ - long int tolerance; /* clock frequency tolerance (ppm) (read only) */ - struct timeval time; /* (read only) */ - long int tick; /* (modified) usecs between clock ticks */ - long int ppsfreq; /* pps frequency (scaled ppm) (ro) */ - long int jitter; /* pps jitter (us) (ro) */ - int shift; /* interval duration (s) (shift) (ro) */ - long int stabil; /* pps stability (scaled ppm) (ro) */ - long int jitcnt; /* jitter limit exceeded (ro) */ - long int calcnt; /* calibration intervals (ro) */ - long int errcnt; /* calibration errors (ro) */ - long int stbcnt; /* stability limit exceeded (ro) */ -}; - \end{lstlisting} + \includestruct{listati/timex.h} \end{minipage} \normalsize \caption{La struttura \structd{timex} per il controllo dell'orologio di @@ -2024,15 +1888,15 @@ valore nullo serve per leggere i parametri correnti; i valori diversi da zero devono essere specificati come OR binario delle costanti riportate in \secref{tab:sys_timex_mode}. -La funzione utilizza il meccanismo di David L. Mills, descritto nell'RFC~1305, -che è alla base del protocollo NTP; la funzione è specifica di Linux e non -deve essere usata se la portabilità è un requisito, le \acr{glibc} provvedono -anche un suo omonimo \func{ntp\_adjtime}. La trattazione completa di questa -funzione necessita di una lettura approfondita del meccanismo descritto -nell'RFC~1305, ci limitiamo a descrivere in \tabref{tab:sys_timex_mode} i -principali valori utilizzabili per il campo \var{mode}, un elenco più -dettagliato del significato dei vari campi della struttura \struct{timex} può -essere ritrovato in \cite{glibc}. +La funzione utilizza il meccanismo di David L. Mills, descritto +nell'\href{http://www.ietf.org/rfc/rfc1305.txt}{RFC~1305}, che è alla base del +protocollo NTP. La funzione è specifica di Linux e non deve essere usata se la +portabilità è un requisito, le \acr{glibc} provvedono anche un suo omonimo +\func{ntp\_adjtime}. La trattazione completa di questa funzione necessita di +una lettura approfondita del meccanismo descritto nell'RFC~1305, ci limitiamo +a descrivere in \tabref{tab:sys_timex_mode} i principali valori utilizzabili +per il campo \var{mode}, un elenco più dettagliato del significato dei vari +campi della struttura \struct{timex} può essere ritrovato in \cite{glibc}. \begin{table}[htb] \footnotesize @@ -2128,31 +1992,6 @@ stata introdotta una ulteriore rappresentazione, detta \textit{broken-down time}, che permette appunto di \textsl{suddividere} il \textit{calendar time} usuale in ore, minuti, secondi, ecc. -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -struct tm { - int tm_sec; /* seconds */ - int tm_min; /* minutes */ - int tm_hour; /* hours */ - int tm_mday; /* day of the month */ - int tm_mon; /* month */ - int tm_year; /* year */ - int tm_wday; /* day of the week */ - int tm_yday; /* day in the year */ - int tm_isdst; /* daylight saving time */ - long int tm_gmtoff; /* Seconds east of UTC. */ - const char *tm_zone; /* Timezone abbreviation. */ -}; - \end{lstlisting} - \end{minipage} - \normalsize - \caption{La struttura \structd{tm} per una rappresentazione del tempo in - termini di ora, minuti, secondi, ecc.} - \label{fig:sys_tm_struct} -\end{figure} - Questo viene effettuato attraverso una opportuna struttura \struct{tm}, la cui definizione è riportata in \figref{fig:sys_tm_struct}, ed è in genere questa struttura che si utilizza quando si deve specificare un tempo a partire dai @@ -2192,6 +2031,19 @@ tempo in una stringa contenente data ed ora, i loro prototipi sono: restituisce direttamente il valore o -1 in caso di errore.} \end{functions} +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/tm.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{tm} per una rappresentazione del tempo in + termini di ora, minuti, secondi, ecc.} + \label{fig:sys_tm_struct} +\end{figure} + + + Le prime due funzioni, \func{asctime} e \func{ctime} servono per poter stampare in forma leggibile un tempo; esse restituiscono il puntatore ad una stringa, allocata staticamente, nella forma: @@ -2242,11 +2094,7 @@ verr \footnotesize \centering \begin{minipage}[c]{15cm} - \begin{lstlisting}[stepnumber=0]{} -extern char *tzname[2]; -extern long timezone; -extern int daylight; - \end{lstlisting} + \includestruct{listati/time_zone_var.c} \end{minipage} \normalsize \caption{Le variabili globali usate per la gestione delle \textit{time @@ -2403,46 +2251,56 @@ prima funzione che si pu Restituisce una stringa con il messaggio di errore relativo ad \param{errnum}. - \bodydesc{La funzione ritorna il puntatore alla stringa col messaggio di - errore in caso di successo e \val{NULL} in caso di errore, nel qual caso - \var{errno} assumerà il valore \errval{EINVAL} se si è specificato un - numero di errore non valido.} + \bodydesc{La funzione ritorna il puntatore ad una stringa di errore.} \end{prototype} -In generale \func{strerror} viene usata passando \var{errno} come parametro; -nel caso si specifichi un codice sbagliato verrà restituito un messaggio di -errore sconosciuto, e la funzione restituirà come errore \errcode{EINVAL}. La -funzione tiene conto del valore della variabile di ambiente -\val{LC\_MESSAGES} per usare eventuali traduzioni dei messaggi d'errore -nella localizzazione presente. + +La funzione ritorna il puntatore alla stringa contenente il messaggio di +errore corrispondente al valore di \param{errnum}, se questo non è un valore +valido verrà comunque restituita una stringa valida contenente un messaggio +che dice che l'errore è sconosciuto, e \var{errno} verrà modificata assumendo +il valore \errval{EINVAL}. + +In generale \func{strerror} viene usata passando \var{errno} come parametro, +ed il valore di quest'ultima non verrà modificato. La funzione inoltre tiene +conto del valore della variabile di ambiente \val{LC\_MESSAGES} per usare le +appropriate traduzioni dei messaggi d'errore nella localizzazione presente. La funzione utilizza una stringa statica che non deve essere modificata dal -programma e che è utilizzabile solo fino ad una chiamata successiva a -\func{strerror}; per questo motivo non è rientrante e nel caso si usino i -thread è provvista\footnote{questa funzione è la versione prevista dalle - \acr{glibc}, ed effettivamente definita in \file{string.h}, ne esiste una - analoga nello standard SUSv3 (quella riportata dalla pagina di manuale), che - restituisce \code{int} al posto di \code{char *}, e che tronca la stringa - restituita a \param{size}.} una versione apposita: +programma; essa è utilizzabile solo fino ad una chiamata successiva a +\func{strerror} o \func{perror}, nessun'altra funzione di libreria tocca +questa stringa. In ogni caso l'uso di una stringa statica rende la funzione +non rientrante, per cui nel caso nel caso si usino i thread le librerie +forniscono\footnote{questa funzione è la versione prevista dalle \acr{glibc}, + ed effettivamente definita in \file{string.h}, ne esiste una analoga nello + standard SUSv3 (quella riportata dalla pagina di manuale), che restituisce + \code{int} al posto di \code{char *}, e che tronca la stringa restituita a + \param{size}.} una apposita versione rientrante \func{strerror\_r}, il cui +prototipo è: \begin{prototype}{string.h} {char * strerror\_r(int errnum, char *buf, size\_t size)} - Analoga a \func{strerror} ma usa il buffer \param{buf} di lunghezza massima - (compreso il terminatore) \param{size}. - - \bodydesc{La funzione restituisce il puntatore alla stringa; in caso di - errore \var{errno} oltre a \errval{EINVAL} può assumere anche il valore - \errval{ERANGE} per indicare che non c'è sufficiente memoria per contenere - la stringa di descrizione.} + Restituisce una stringa con il messaggio di errore relativo ad + \param{errnum}. + + \bodydesc{La funzione restituisce l'indirizzo del messaggio in caso di + successo e \val{NULL} in caso di errore; nel qual caso \var{errno} + assumerà i valori: + \begin{errlist} + \item[\errcode{EINVAL}] si è specificato un valore di \param{errnum} non + valido. + \item[\errcode{ERANGE}] la lunghezza di \param{buf} è insufficiente a + contenere la stringa di errore. + \end{errlist}} \end{prototype} \noindent -che utilizza un buffer che il singolo thread deve allocare, per evitare i -problemi connessi alla condivisione del buffer statico. La funzione -restituisce l'indirizzo della stringa usata, che può essere contenuta nel -buffer specificato da \param{buf}, per una lunghezza non superiore a -\param{size}, nel qual caso la stringa sarebbe troncata e terminata con uno -zero (il carattere NUL). +La funzione è analoga a \func{strerror} ma restituisce la stringa di errore +nel buffer \param{buf} che il singolo thread deve allocare autonomamente per +evitare i problemi connessi alla condivisione del buffer statico. Il messaggio +è copiato fino alla dimensione massima del buffer, specificata dall'argomento +\param{size}, che deve comprendere pure il carattere di terminazione; +altrimenti la stringa viene troncata. Una seconda funzione usata per riportare i codici di errore in maniera automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è @@ -2455,41 +2313,22 @@ automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) I messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati in \capref{cha:errors}), e, usando il valore corrente di \var{errno}, si riferiscono all'ultimo errore avvenuto. La stringa specificata con -\param{message} viene stampato prime del messaggio d'errore, seguita dai due +\param{message} viene stampato prima del messaggio d'errore, seguita dai due punti e da uno spazio, il messaggio è terminato con un a capo. -Il messaggio può essere riportato anche usando altre variabili globali -dichiarate in \file{errno.h}: -\begin{verbatim} - const char *sys_errlist[]; - int sys_nerr; -\end{verbatim} -la prima contiene i puntatori alle stringhe di errore indicizzati da -\var{errno}; la seconda esprime il valore più alto per un codice di errore, -l'utilizzo di questa stringa è sostanzialmente equivalente a quello di -\func{strerror}. +Il messaggio può essere riportato anche usando le due variabili globali: +\includecodesnip{listati/errlist.c} +dichiarate in \file{errno.h}. La prima contiene i puntatori alle stringhe di +errore indicizzati da \var{errno}; la seconda esprime il valore più alto per +un codice di errore, l'utilizzo di questa stringa è sostanzialmente +equivalente a quello di \func{strerror}. \begin{figure}[!htb] - \footnotesize - \begin{lstlisting}{} - /* convert string to number */ - err = strtol(argv[optind], NULL, 10); - /* testing error condition on conversion */ - if (err==LONG_MIN) { - perror("Underflow on error code"); - return 1; - } else if (err==LONG_MIN) { - perror("Overflow on error code"); - return 1; - } - /* conversion is fine */ - if (message) { - printf("Error message for %d is %s\n", err, strerror(err)); - } - if (label) { - printf("Error label for %d is %s\n", err, err_code[err]); - } - \end{lstlisting} + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesample{listati/errcode_mess.c} + \end{minipage} + \normalsize \caption{Codice per la stampa del messaggio di errore standard.} \label{fig:sys_err_mess} \end{figure} @@ -2564,9 +2403,9 @@ il valore un'altra variabile globale, \var{error\_message\_count}, che tiene conto di quanti errori ci sono stati. -Un'altra funzione per la stampa degli errori, ancora più sofisticata, è -\funcd{error\_at\_line}, che prende due argomenti aggiuntivi per indicare -linea e file su cui è avvenuto l'errore; il suo prototipo è: +Un'altra funzione per la stampa degli errori, ancora più sofisticata, che +prende due argomenti aggiuntivi per indicare linea e file su cui è avvenuto +l'errore è \funcd{error\_at\_line}; il suo prototipo è: \begin{prototype}{stdio.h} {void error\_at\_line(int status, int errnum, const char *fname, unsigned int lineno, const char *format, ...)}