From 4ef9b8137a62982f50075a3c1c3b0c33f77aae0f Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 10 Sep 2001 17:45:08 +0000 Subject: [PATCH] Aggiunte note sugli errori --- intro.tex | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/intro.tex b/intro.tex index 5fac07c..cdc19e1 100644 --- a/intro.tex +++ b/intro.tex @@ -342,7 +342,8 @@ nell'header \file{errno.h} sono anche definiti i nomi simbolici per le costanti numeriche che identificano i vari errori; essi iniziano tutti per \macro{E} e si possono considerare come nomi riservati. In seguito faremo sempre rifermento a tali valori, quando descriveremo i possibili errori -restituiti dalle funzioni. +restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il +codice relativo ad un valore numerico con l'opzione \cmd{-l}. Il valore di \var{errno} viene sempre settato a zero all'avvio di un programma, gran parte delle funzioni di libreria settano \var{errno} ad un @@ -358,7 +359,58 @@ della chiamata. \subsection{Le funzioni \func{strerror} e \func{perror}} \label{sec:intro_strerror} -Benché gli errori siano identificati univocamente dal valore di \var{errno} le -librerie provvedono alcune funzioni e variabili utili per riportare in -opportuni messaggi le condizioni di errore verificatesi. - +Benché gli errori siano identificati univocamente dal valore numerico di +\var{errno} le librerie provvedono alcune funzioni e variabili utili per +riportare in opportuni messaggi le condizioni di errore verificatesi. La +prima funzione che si può usare per ricavare i messaggi di errore è +\func{strerror}, il cui prototipo è: +\begin{prototype}{string.h}{char * strerror(int errnum)} + La funzione ritorna una stringa (statica) che descrive l'errore il cui + codice è passato come parametro. +\end{prototype} + +In generale \func{strerror} viene usata passando \var{errno} come parametro; +nel caso si specifichi un codice sbagliato verrà restituita un messaggio di +errore sconosciuto. + +Il problema con \func{strerror} è che 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}; nel caso si usino i thread è +provvista\footnote{questa funzione è una estensione GNU, non fa parte dello + standard POSIX} una versione apposita: +\begin{prototype}{string.h} +{char * strerror_r(int errnum, char * buff, size\_t size)} + La funzione è analoga a \func{strerror} ma ritorna il messaggio in un buffer + specificato da \var{buff} di lunghezza massima (compreso il terminatore) + \var{size}. +\end{prototype} +che utilizza un buffer che il singolo thread deve allocare, per evitare i +problemi connessi alla condivisione del buffer statico. Infine, per completare +la caratterizzazione dell'errore, si può usare anche la variabile globale +\var{program_invocation_short_name} che riporta il nome del programma +attualmente in esecuzione. + + +Una seconda funzione usata per riportare i codici di errore è \func{perror} il +cui prototipo è: +\begin{prototype}{stdio.h}{void perror (const char *message)} + La funzione stampa il messaggio di errore relativo al valore corrente di + \var{errno} sullo standard error; preceduto dalla stringa \var{message}. +\end{prototype} +i messaggi di errore sono gli stessi di \func{strerror}, riportati in +\capref{cha:errors}, + + +Il codice del programma \cmd{errcode} è riportato in \nfig, le sezioni che +illustrano l'utilizzo delle due funzioni suddette s + +\begin{figure}[!htb] + \footnotesize + \begin{lstlisting}{} + + + + \end{lstlisting} + \caption{Codice per la stampa del messaggio di errore standard.} + \label{fig:proc_fork_code} +\end{figure} -- 2.30.2