+In fig.~\ref{fig:sys_err_mess} è riportata la sezione attinente del codice del
+programma \cmd{errcode}, che può essere usato per stampare i messaggi di
+errore e le costanti usate per identificare i singoli errori; il sorgente
+completo del programma è allegato nel file \file{ErrCode.c} e contiene pure la
+gestione delle opzioni e tutte le definizioni necessarie ad associare il
+valore numerico alla costante simbolica. In particolare si è riportata la
+sezione che converte la stringa passata come argomento in un intero
+(\texttt{\small 1--2}), controllando con i valori di ritorno di \func{strtol}
+che la conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi
+stampa, a seconda dell'opzione scelta il messaggio di errore (\texttt{\small
+ 11--14}) o la macro (\texttt{\small 15--17}) associate a quel codice.
+
+
+
+\subsection{Alcune estensioni GNU}
+\label{sec:sys_err_GNU}
+
+Le precedenti funzioni sono quelle definite ed usate nei vari standard; le
+\acr{glibc} hanno però introdotto una serie di estensioni ``GNU'' che
+forniscono alcune funzionalità aggiuntive per una gestione degli errori
+semplificata e più efficiente.
+
+La prima estensione consiste in due variabili, \code{char *
+ program\_invocation\_name} e \code{char * program\_invocation\_short\_name}
+servono per ricavare il nome del programma; queste sono utili quando si deve
+aggiungere il nome del programma (cosa comune quando si ha un programma che
+non viene lanciato da linea di comando e salva gli errori in un file di log)
+al messaggio d'errore. La prima contiene il nome usato per lanciare il
+programma (ed è equivalente ad \code{argv[0]}); la seconda mantiene solo il
+nome del programma (senza eventuali directory in testa).
+
+Uno dei problemi che si hanno con l'uso di \func{perror} è che non c'è
+flessibilità su quello che si può aggiungere al messaggio di errore, che può
+essere solo una stringa. In molte occasioni invece serve poter scrivere dei
+messaggi con maggiore informazione; ad esempio negli standard di
+programmazione GNU si richiede che ogni messaggio di errore sia preceduto dal
+nome del programma, ed in generale si può voler stampare il contenuto di
+qualche variabile; per questo le \acr{glibc} definiscono la funzione
+\funcd{error}, il cui prototipo è:
+\begin{prototype}{stdio.h}
+{void error(int status, int errnum, const char *format, ...)}
+
+Stampa un messaggio di errore formattato.
+
+\bodydesc{La funzione non restituisce nulla e non riporta errori.}
+\end{prototype}
+
+La funzione fa parte delle estensioni GNU per la gestione degli errori,
+l'argomento \param{format} prende la stessa sintassi di \func{printf}, ed i
+relativi argomenti devono essere forniti allo stesso modo, mentre
+\param{errnum} indica l'errore che si vuole segnalare (non viene quindi usato
+il valore corrente di \var{errno}); la funzione stampa sullo standard error il
+nome del programma, come indicato dalla variabile globale \var{program\_name},
+seguito da due punti ed uno spazio, poi dalla stringa generata da
+\param{format} e dagli argomenti seguenti, seguita da due punti ed uno spazio
+infine il messaggio di errore relativo ad \param{errnum}, il tutto è terminato
+da un a capo.
+
+Il comportamento della funzione può essere ulteriormente controllato se si
+definisce una variabile \var{error\_print\_progname} come puntatore ad una
+funzione \ctyp{void} che restituisce \ctyp{void} che si incarichi di stampare
+il nome del programma.
+
+L'argomento \param{status} può essere usato per terminare direttamente il
+programma in caso di errore, nel qual caso \func{error} dopo la stampa del
+messaggio di errore chiama \func{exit} con questo stato di uscita. Se invece
+il valore è nullo \func{error} ritorna normalmente ma viene incrementata
+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, 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, ...)}
+
+Stampa un messaggio di errore formattato.
+
+\bodydesc{La funzione non restituisce nulla e non riporta errori.}
+\end{prototype}
+\noindent ed il suo comportamento è identico a quello di \func{error} se non
+per il fatto che, separati con il solito due punti-spazio, vengono inseriti un
+nome di file indicato da \param{fname} ed un numero di linea subito dopo la
+stampa del nome del programma. Inoltre essa usa un'altra variabile globale,
+\var{error\_one\_per\_line}, che impostata ad un valore diverso da zero fa si
+che errori relativi alla stessa linea non vengano ripetuti.
+
+
+% LocalWords: filesystem like kernel saved header limits sysconf sez tab float
+% LocalWords: FOPEN stdio MB LEN CHAR char UCHAR unsigned SCHAR MIN signed INT
+% LocalWords: SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG
+% LocalWords: Stevens exec CHILD STREAM stream TZNAME timezone NGROUPS SSIZE
+% LocalWords: ssize LISTIO JOB CONTROL job control IDS VERSION YYYYMML bits bc
+% LocalWords: dall'header posix lim nell'header glibc run unistd name errno SC
+% LocalWords: NGROUP CLK TCK clock tick process PATH pathname BUF CANON path
+% LocalWords: pathconf fpathconf descriptor fd uname sys struct utsname info
+% LocalWords: EFAULT fig SOURCE NUL LENGTH DOMAIN NMLN UTSLEN system call proc
+% LocalWords: domainname sysctl BSD nlen void oldval size oldlenp newval EPERM
+% LocalWords: newlen ENOTDIR EINVAL ENOMEM linux l'array oldvalue paging stack
+% LocalWords: TCP shell Documentation ostype hostname osrelease version mount
+% LocalWords: const source filesystemtype mountflags ENODEV ENOTBLK block read
+% LocalWords: device EBUSY only superblock point EACCES NODEV ENXIO major xC
+% LocalWords: number EMFILE dummy ENAMETOOLONG ENOENT ELOOP virtual devfs MGC
+% LocalWords: magic MSK RDONLY NOSUID suid sgid NOEXEC SYNCHRONOUS REMOUNT MNT
+% LocalWords: MANDLOCK mandatory locking WRITE APPEND append IMMUTABLE NOATIME
+% LocalWords: access NODIRATIME BIND MOVE umount flags FORCE statfs fstatfs ut
+% LocalWords: buf ENOSYS EIO EBADF type fstab mntent home shadow username uid
+% LocalWords: passwd PAM Pluggable Authentication Method Service Switch pwd ru
+% LocalWords: getpwuid getpwnam NULL buflen result ERANGE getgrnam getgrgid AS
+% LocalWords: grp group gid SVID fgetpwent putpwent getpwent setpwent endpwent
+% LocalWords: fgetgrent putgrent getgrent setgrent endgrent accounting init HZ
+% LocalWords: runlevel Hierarchy logout setutent endutent utmpname utmp paths
+% LocalWords: WTMP getutent getutid getutline pututline LVL OLD DEAD EMPTY dev
+% LocalWords: line libc XPG utmpx getutxent getutxid getutxline pututxline who
+% LocalWords: setutxent endutxent wmtp updwtmp logwtmp wtmp host rusage utime
+% LocalWords: minflt majflt nswap fault swap timeval wait getrusage usage SELF
+% LocalWords: CHILDREN current limit soft RLIMIT Address brk mremap mmap dump
+% LocalWords: SIGSEGV SIGXCPU SIGKILL sbrk FSIZE SIGXFSZ EFBIG LOCKS lock dup
+% LocalWords: MEMLOCK NOFILE NPROC fork EAGAIN SIGPENDING sigqueue kill RSS tv
+% LocalWords: resource getrlimit setrlimit rlimit rlim INFINITY capabilities
+% LocalWords: capability CAP l'I Sun Sparc PAGESIZE getpagesize SVr SUSv get
+% LocalWords: phys pages avphys NPROCESSORS CONF ONLN getloadavg stdlib double
+% LocalWords: loadavg nelem scheduler CONFIG ACCT acct filename EACCESS EUSER
+% LocalWords: ENFILE EROFS PACCT AcctCtrl cap calendar UTC Jan the Epoch GMT
+% LocalWords: Greenwich Mean l'UTC timer CLOCKS SEC cron wall elapsed times tz
+% LocalWords: tms dell' cutime cstime waitpid gettimeofday settimeofday timex
+% LocalWords: timespec adjtime olddelta adjtimex David Mills nell' RFC NTP ntp
+% LocalWords: nell'RFC ADJ FREQUENCY frequency MAXERROR maxerror ESTERROR PLL
+% LocalWords: esterror TIMECONST constant SINGLESHOT MOD INS insert leap OOP
+% LocalWords: second delete progress has occurred BAD broken tm gmtoff asctime
+% LocalWords: ctime timep gmtime localtime mktime tzname tzset daylight format
+% LocalWords: strftime thread EOF modifiable lvalue app errcode strerror LC at
+% LocalWords: perror string errnum MESSAGES error message ErrCode strtol log
+% LocalWords: program invocation argv printf print progname exit count fname
+% LocalWords: lineno one standardese Di page Wed Wednesday Apr April PM AM
+