questo crea una ambiguità che non è sempre possibile risolvere in maniera
chiara; in generale quello che succede è che quando i limiti del sistema sono
fissi essi vengono definiti come macro di preprocessore nel file
-\file{limits.h}, se invece possono variare, il loro valore sarà ottenibile
+\headfile{limits.h}, se invece possono variare, il loro valore sarà ottenibile
tramite la funzione \func{sysconf} (che esamineremo in
sez.~\ref{sec:sys_sysconf}).
Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo
saranno sempre disponibili al momento della compilazione. Un elenco, ripreso
-da \file{limits.h}, è riportato in tab.~\ref{tab:sys_ansic_macro}. Come si può
-vedere per la maggior parte questi limiti attengono alle dimensioni dei dati
-interi, che sono in genere fissati dall'architettura hardware (le analoghe
-informazioni per i dati in virgola mobile sono definite a parte, ed
-accessibili includendo \file{float.h}). Lo standard prevede anche un'altra
+da \headfile{limits.h}, è riportato in tab.~\ref{tab:sys_ansic_macro}. Come si
+può vedere per la maggior parte questi limiti attengono alle dimensioni dei
+dati interi, che sono in genere fissati dall'architettura hardware (le
+analoghe informazioni per i dati in virgola mobile sono definite a parte, ed
+accessibili includendo \headfile{float.h}). Lo standard prevede anche un'altra
costante, \const{FOPEN\_MAX}, che può non essere fissa e che pertanto non è
-definita in \file{limits.h}; essa deve essere definita in \file{stdio.h} ed
-avere un valore minimo di 8.
+definita in \headfile{limits.h}; essa deve essere definita in
+\headfile{stdio.h} ed avere un valore minimo di 8.
\begin{table}[htb]
\centering
\const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\
\hline
\end{tabular}
- \caption{Costanti definite in \file{limits.h} in conformità allo standard
+ \caption{Costanti definite in \headfile{limits.h} in conformità allo standard
ANSI C.}
\label{tab:sys_ansic_macro}
\end{table}
Massimo di \ctyp{unsigned long long}.\\
\hline
\end{tabular}
- \caption{Macro definite in \file{limits.h} in conformità allo standard
+ \caption{Macro definite in \headfile{limits.h} in conformità allo standard
ISO C90.}
\label{tab:sys_isoc90_macro}
\end{table}
\label{tab:sys_generic_macro}
\end{table}
-Lo standard dice che queste macro devono essere definite in \file{limits.h}
-quando i valori a cui fanno riferimento sono fissi, e altrimenti devono essere
-lasciate indefinite, ed i loro valori dei limiti devono essere accessibili
-solo attraverso \func{sysconf}. In realtà queste vengono sempre definite ad
-un valore generico. Si tenga presente poi che alcuni di questi limiti possono
-assumere valori molto elevati (come \const{CHILD\_MAX}), e non è pertanto il
-caso di utilizzarli per allocare staticamente della memoria.
+Lo standard dice che queste macro devono essere definite in
+\headfile{limits.h} quando i valori a cui fanno riferimento sono fissi, e
+altrimenti devono essere lasciate indefinite, ed i loro valori dei limiti
+devono essere accessibili solo attraverso \func{sysconf}. In realtà queste
+vengono sempre definite ad un valore generico. Si tenga presente poi che
+alcuni di questi limiti possono assumere valori molto elevati (come
+\const{CHILD\_MAX}), e non è pertanto il caso di utilizzarli per allocare
+staticamente della memoria.
A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di
altre costanti (il cui nome inizia sempre con \code{\_POSIX\_}) che
199009L).\\
\hline
\end{tabular}
- \caption{Alcune macro definite in \file{limits.h} in conformità allo standard
- POSIX.1.}
+ \caption{Alcune macro definite in \headfile{limits.h} in conformità allo
+ standard POSIX.1.}
\label{tab:sys_posix1_other}
\end{table}
tab.~\ref{tab:sys_posix1_file}), che devono essere obbligatoriamente definiti,
lo standard POSIX.1 ne prevede parecchi altri. La lista completa si trova
dall'header file \file{bits/posix1\_lim.h} (da non usare mai direttamente, è
-incluso automaticamente all'interno di \file{limits.h}). Di questi vale la
+incluso automaticamente all'interno di \headfile{limits.h}). Di questi vale la
pena menzionare alcune macro di uso comune, (riportate in
tab.~\ref{tab:sys_posix1_other}), che non indicano un valore specifico, ma
denotano la presenza di alcune funzionalità nel sistema (come il supporto del
\hline
\const{LINK\_MAX} &8 & Numero massimo di link a un file.\\
\const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\
- \const{PATH\_MAX}& 256 & Lunghezza in byte di un
- \itindex{pathname} \textit{pathname}.\\
+ \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\
\const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe
(vedi sez.~\ref{sec:ipc_pipes}).\\
\const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
\const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\
\const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\
\const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un
- \itindex{pathname} \textit{pathname}.\\
+ \textit{pathname}.\\
\const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
pipe.\\
\const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
\label{tab:sys_posix1_file}
\end{table}
-Tutti questi limiti sono definiti in \file{limits.h}; come nel caso precedente
-il loro uso è di scarsa utilità in quanto ampiamente superati in tutte le
-implementazioni moderne.
+Tutti questi limiti sono definiti in \headfile{limits.h}; come nel caso
+precedente il loro uso è di scarsa utilità in quanto ampiamente superati in
+tutte le implementazioni moderne.
\subsection{La funzione \func{pathconf}}
a quale file si fa riferimento, dato che il valore del limite cercato può
variare a seconda del filesystem. Una seconda versione della funzione,
\funcd{fpathconf}, opera su un file descriptor invece che su un
-\itindex{pathname} \textit{pathname}. Il suo prototipo è:
+\textit{pathname}. Il suo prototipo è:
\begin{prototype}{unistd.h}{long fpathconf(int fd, int name)}
Restituisce il valore del parametro \param{name} per il file \param{fd}.
\bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor
- invece di un \itindex{pathname} \textit{pathname}; pertanto gli errori
- restituiti cambiano di conseguenza.}
+ invece di un \textit{pathname}; pertanto gli errori restituiti cambiano di
+ conseguenza.}
\end{prototype}
\noindent ed il suo comportamento è identico a quello di \func{pathconf}.
La funzione, che viene usata dal comando \cmd{uname}, restituisce le
informazioni richieste nella struttura \param{info}; anche questa struttura è
-definita in \file{sys/utsname.h}, secondo quanto mostrato in
+definita in \headfile{sys/utsname.h}, secondo quanto mostrato in
fig.~\ref{fig:sys_utsname}, e le informazioni memorizzate nei suoi membri
indicano rispettivamente:
\begin{itemize*}
I parametri a cui la funzione permettere di accedere sono organizzati in
maniera gerarchica all'interno di un albero;\footnote{si tenga presente che
- includendo solo \file{unistd.h}, saranno definiti solo i parametri generici;
- dato che ce ne sono molti specifici dell'implementazione, nel caso di Linux
- occorrerà includere anche i file \file{linux/unistd.h} e
+ includendo solo \headfile{unistd.h}, saranno definiti solo i parametri
+ generici; dato che ce ne sono molti specifici dell'implementazione, nel caso
+ di Linux occorrerà includere anche i file \file{linux/unistd.h} e
\file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un
cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene
-per la risoluzione di un \itindex{pathname} \textit{pathname} (da cui l'uso
-alternativo del filesystem \file{/proc}, che vedremo dopo).
+per la risoluzione di un \textit{pathname} (da cui l'uso alternativo del
+filesystem \file{/proc}, che vedremo dopo).
Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che
arriva ad identificare un parametro specifico è passato alla funzione
valore letto restituito dalla funzione è quello precedente alla scrittura.
I parametri accessibili attraverso questa funzione sono moltissimi, e possono
-essere trovati in \file{sysctl.h}, essi inoltre dipendono anche dallo stato
-corrente del kernel (ad esempio dai moduli che sono stati caricati nel
+essere trovati in \headfile{sysctl.h}, essi inoltre dipendono anche dallo
+stato corrente del kernel (ad esempio dai moduli che sono stati caricati nel
sistema) e in genere i loro nomi possono variare da una versione di kernel
all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl}
quando esistono modalità alternative per ottenere le stesse informazioni.
In particolare l'albero dei valori di \func{sysctl} viene presentato in forma
di file nella directory \file{/proc/sys}, cosicché è possibile accedervi
-specificando un \itindex{pathname} \textit{pathname} e leggendo e scrivendo sul
-file corrispondente al parametro scelto. Il kernel si occupa di generare al
-volo il contenuto ed i nomi dei file corrispondenti, e questo ha il grande
+specificando un \textit{pathname} e leggendo e scrivendo sul file
+corrispondente al parametro scelto. Il kernel si occupa di generare al volo
+il contenuto ed i nomi dei file corrispondenti, e questo ha il grande
vantaggio di rendere accessibili i vari parametri a qualunque comando di shell
e di permettere la navigazione dell'albero dei valori.
informazioni degli utenti e dei gruppi per insiemi di macchine, in modo da
mantenere coerenti i dati, ha portato anche alla necessità di poter recuperare
e memorizzare dette informazioni su supporti diversi, introducendo il sistema
-del \itindex{Name~Service~Switch} \textit{Name Service Switch} che tratteremo
-brevemente più avanti (in sez.~\ref{sec:sock_resolver}) dato che la maggior
-parte delle sua applicazioni sono relative alla risoluzioni di nomi di rete.
+del \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} che
+tratteremo brevemente più avanti (in sez.~\ref{sec:sock_resolver}) dato che la
+maggior parte delle sua applicazioni sono relative alla risoluzioni di nomi di
+rete.
In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche
per la lettura delle informazioni relative a utenti e gruppi tralasciando
utenti (che nelle versioni più recenti possono essere ottenute attraverso PAM)
relative all'utente specificato attraverso il suo \ids{UID} o il nome di
login. Entrambe le funzioni restituiscono un puntatore ad una struttura di
-tipo \struct{passwd} la cui definizione (anch'essa eseguita in \file{pwd.h}) è
-riportata in fig.~\ref{fig:sys_passwd_struct}, dove è pure brevemente
-illustrato il significato dei vari campi.
+tipo \struct{passwd} la cui definizione (anch'essa eseguita in
+\headfile{pwd.h}) è riportata in fig.~\ref{fig:sys_passwd_struct}, dove è pure
+brevemente illustrato il significato dei vari campi.
\begin{figure}[!htb]
\footnotesize
Le funzioni viste finora sono in grado di leggere le informazioni sia
direttamente dal file delle password in \conffile{/etc/passwd} che tramite il
-sistema del \itindex{Name~Service~Switch} \textit{Name Service Switch} e sono
-completamente generiche. Si noti però che non c'è una funzione che permetta di
-impostare direttamente una password.\footnote{in realtà questo può essere
- fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che POSIX non
-prevede questa possibilità esiste un'altra interfaccia che lo fa, derivata da
-SVID le cui funzioni sono riportate in tab.~\ref{tab:sys_passwd_func}. Questa
-però funziona soltanto quando le informazioni sono mantenute su un apposito
-file di \textsl{registro} di utenti e gruppi, con il formato classico di
-\conffile{/etc/passwd} e \conffile{/etc/group}.
+sistema del \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} e
+sono completamente generiche. Si noti però che non c'è una funzione che
+permetta di impostare direttamente una password.\footnote{in realtà questo può
+ essere fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che
+POSIX non prevede questa possibilità esiste un'altra interfaccia che lo fa,
+derivata da SVID le cui funzioni sono riportate in
+tab.~\ref{tab:sys_passwd_func}. Questa però funziona soltanto quando le
+informazioni sono mantenute su un apposito file di \textsl{registro} di utenti
+e gruppi, con il formato classico di \conffile{/etc/passwd} e
+\conffile{/etc/group}.
\begin{table}[htb]
\footnotesize
\textbf{Funzione} & \textbf{Significato}\\
\hline
\hline
- \func{fgetpwent} & Legge una voce dal file di registro degli utenti
+ \funcm{fgetpwent} & Legge una voce dal file di registro degli utenti
+ specificato.\\
+ \funcm{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti}
+ rientrante.\\
+ \funcm{putpwent} & Immette una voce in un file di registro degli
+ utenti.\\
+ \funcm{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\
+ \funcm{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti}
+ rientrante.\\
+ \funcm{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\
+ \funcm{endpwent} & Chiude \conffile{/etc/passwd}.\\
+ \funcm{fgetgrent} & Legge una voce dal file di registro dei gruppi
specificato.\\
- \func{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti}
- rientrante.\\
- \func{putpwent} & Immette una voce in un file di registro degli
- utenti.\\
- \func{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\
- \func{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti}
- rientrante.\\
- \func{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\
- \func{endpwent} & Chiude \conffile{/etc/passwd}.\\
- \func{fgetgrent} & Legge una voce dal file di registro dei gruppi
- specificato.\\
- \func{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti}
- rientrante.\\
- \func{putgrent} & Immette una voce in un file di registro dei gruppi.\\
- \func{getgrent} & Legge una voce da \conffile{/etc/group}.\\
- \func{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti}
- rientrante.\\
- \func{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\
- \func{endgrent} & Chiude \conffile{/etc/group}.\\
+ \funcm{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti}
+ rientrante.\\
+ \funcm{putgrent} & Immette una voce in un file di registro dei gruppi.\\
+ \funcm{getgrent} & Legge una voce da \conffile{/etc/group}.\\
+ \funcm{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti}
+ rientrante.\\
+ \funcm{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\
+ \funcm{endgrent} & Chiude \conffile{/etc/group}.\\
\hline
\end{tabular}
\caption{Funzioni per la manipolazione dei campi di un file usato come
\label{tab:sys_passwd_func}
\end{table}
+% TODO mancano i prototipi di alcune delle funzioni
+
Dato che oramai la gran parte delle distribuzioni di GNU/Linux utilizzano
almeno le \textit{shadow password} (quindi con delle modifiche rispetto al
formato classico del file \conffile{/etc/passwd}), si tenga presente che le
Nel caso non si sia utilizzata \func{utmpname} per specificare un file di
registro alternativo, sia \func{setutent} che \func{endutent} operano usando
-il default che è \file{/var/run/utmp}. Il nome di questo file, così come una
-serie di altri valori di default per i \textit{pathname} di uso più comune,
-viene mantenuto nei valori di una serie di costanti definite includendo
-\file{paths.h}, in particolare quelle che ci interessano sono:
+il default che è \sysfile{/var/run/utmp}. Il nome di questo file, così come
+una serie di altri valori di default per i \textit{pathname} di uso più
+comune, viene mantenuto nei valori di una serie di costanti definite
+includendo \headfile{paths.h}, in particolare quelle che ci interessano sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
\item[\const{\_PATH\_UTMP}] specifica il file che contiene il registro per gli
utenti correntemente collegati; questo è il valore che viene usato se non si
l'archivio storico degli utenti collegati.
\end{basedescript}
che nel caso di Linux hanno un valore corrispondente ai file
-\file{/var/run/utmp} e \file{/var/log/wtmp} citati in precedenza.
+\sysfile{/var/run/utmp} e \sysfile{/var/log/wtmp} citati in precedenza.
Una volta aperto il file del registro degli utenti si può eseguire una
scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent},
Le \acr{glibc} utilizzano già una versione estesa di \code{utmp}, che rende
inutili queste nuove strutture; pertanto esse e le relative funzioni di
-gestione (\func{getutxent}, \func{getutxid}, \func{getutxline},
-\func{pututxline}, \func{setutxent} e \func{endutxent}) sono ridefinite come
+gestione (\funcm{getutxent}, \funcm{getutxid}, \funcm{getutxline},
+\funcm{pututxline}, \funcm{setutxent} e \funcm{endutxent}) sono ridefinite come
sinonimi delle funzioni appena viste.
+% TODO (verificare le funzioni di cui sopra )
+
Come visto in sez.~\ref{sec:sys_user_group}, l'uso di strutture allocate
staticamente rende le funzioni di lettura non \index{funzioni!rientranti}
rientranti; per questo motivo le \acr{glibc} forniscono anche delle versioni
-\index{funzioni!rientranti} rientranti: \func{getutent\_r}, \func{getutid\_r},
-\func{getutline\_r}, che invece di restituire un puntatore restituiscono un
+\index{funzioni!rientranti} rientranti: \funcm{getutent\_r}, \funcm{getutid\_r},
+\funcm{getutline\_r}, che invece di restituire un puntatore restituiscono un
intero e prendono due argomenti aggiuntivi. Le funzioni si comportano
esattamente come le analoghe non \index{funzioni!rientranti} rientranti, solo
che restituiscono il risultato all'indirizzo specificato dal primo argomento
Come abbiamo accennato in sez.~\ref{sec:proc_wait} le informazioni riguardo
l'utilizzo delle risorse da parte di un processo è mantenuto in una struttura
di tipo \struct{rusage}, la cui definizione (che si trova in
-\file{sys/resource.h}) è riportata in fig.~\ref{fig:sys_rusage_struct}.
+\headfile{sys/resource.h}) è riportata in fig.~\ref{fig:sys_rusage_struct}.
\begin{figure}[!htb]
\footnotesize
\bodydesc{La funzione ritorna 0 in caso di successo o $-1$ in caso di
errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{EACCESS}] non si hanno i permessi per accedere a
+ \item[\errcode{EACCES}] non si hanno i permessi per accedere a
\param{pathname}.
\item[\errcode{EPERM}] il processo non ha privilegi sufficienti ad
abilitare il \textit{BSD accounting}.
\item[\errcode{ENOSYS}] il kernel non supporta il \textit{BSD accounting}.
- \item[\errcode{EUSER}] non sono disponibili nel kernel strutture per il
+ \item[\errcode{EUSERS}] non sono disponibili nel kernel strutture per il
file o si è finita la memoria.
\end{errlist}
ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
\errval{ENOTDIR}, \errval{EROFS}.}
\end{prototype}
-La funzione attiva il salvataggio dei dati sul file indicato dal pathname
-contenuti nella stringa puntata da \param{filename}; la funzione richiede che
-il processo abbia i privilegi di amministratore (è necessaria la
-\itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
+La funzione attiva il salvataggio dei dati sul file indicato dal
+\textit{pathname} contenuti nella stringa puntata da \param{filename}; la
+funzione richiede che il processo abbia i privilegi di amministratore (è
+necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per
\param{filename} il \textit{BSD accounting} viene invece disabilitato. Un
semplice esempio per l'uso di questa funzione è riportato nel programma
\type{clock\_t}, che ha quindi una risoluzione del microsecondo. Il numero
di \itindex{clock~tick} \textit{tick} al secondo può essere ricavato anche
attraverso \func{sysconf} (vedi sez.~\ref{sec:sys_sysconf}). Il vecchio
- simbolo \const{CLK\_TCK} definito in \file{time.h} è ormai considerato
+ simbolo \const{CLK\_TCK} definito in \headfile{time.h} è ormai considerato
obsoleto.
\end{basedescript}
\end{prototype}
La funzione richiede una struttura di tipo \struct{timex}, la cui definizione,
-così come effettuata in \file{sys/timex.h}, è riportata in
-fig.~\ref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore del
-campo \var{mode}, che specifica quale parametro dell'orologio di sistema,
+così come effettuata in \headfile{sys/timex.h}, è riportata in
+fig.~\ref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore
+del campo \var{mode}, che specifica quale parametro dell'orologio di sistema,
specificato in un opportuno campo di \struct{timex}, deve essere impostato. Un
valore nullo serve per leggere i parametri correnti; i valori diversi da zero
devono essere specificati come OR binario delle costanti riportate in
locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre
\index{variabili!globali} variabili globali mostrate in
fig.~\ref{fig:sys_tzname}, cui si accede quando si include
-\file{time.h}. Queste variabili vengono impostate quando si chiama una delle
-precedenti funzioni di conversione, oppure invocando direttamente la funzione
-\funcd{tzset}, il cui prototipo è:
+\headfile{time.h}. Queste variabili vengono impostate quando si chiama una
+delle precedenti funzioni di conversione, oppure invocando direttamente la
+funzione \funcd{tzset}, il cui prototipo è:
\begin{prototype}{sys/timex.h}
{void tzset(void)}
\bodydesc{La funzione non ritorna niente e non dà errori.}
\end{prototype}
-La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire dal
-valore della variabile di ambiente \const{TZ}, se quest'ultima non è definita
-verrà usato il file \conffile{/etc/localtime}.
+La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire
+dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è
+definita verrà usato il file \conffile{/etc/localtime}.
\begin{figure}[!htb]
\footnotesize
\textit{thread}) ma lo standard ISO C consente anche di definire \var{errno}
come un \textit{modifiable lvalue}, quindi si può anche usare una macro, e
questo è infatti il modo usato da Linux per renderla locale ai singoli
- \itindex{thread} \textit{thread}.} definita nell'header \file{errno.h}; la
-variabile è in genere definita come \direct{volatile} dato che può essere
+ \itindex{thread} \textit{thread}.} definita nell'header \headfile{errno.h};
+la variabile è in genere definita come \direct{volatile} dato che può essere
cambiata in modo asincrono da un segnale (si veda sez.~\ref{sec:sig_sigchld}
per un esempio, ricordando quanto trattato in sez.~\ref{sec:proc_race_cond}),
ma dato che un gestore di segnale scritto bene salva e ripristina il valore
normale.
I valori che può assumere \var{errno} sono riportati in app.~\ref{cha:errors},
-nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
+nell'header \headfile{errno.h} sono anche definiti i nomi simbolici per le
costanti numeriche che identificano i vari errori; essi iniziano tutti per
-\val{E} e si possono considerare come nomi riservati. In seguito faremo
-sempre riferimento a tali valori, quando descriveremo i possibili errori
-restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
-codice relativo ad un valore numerico con l'opzione \cmd{-l}.
+\val{E} e si possono considerare come nomi riservati. In seguito faremo sempre
+riferimento a tali valori, quando descriveremo i possibili errori 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 impostato a zero all'avvio di un
programma, gran parte delle funzioni di libreria impostano \var{errno} ad un
In generale \func{strerror} viene usata passando \var{errno} come argomento,
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.
+conto del valore della variabile di ambiente \envvar{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; essa è utilizzabile solo fino ad una chiamata successiva a
non \index{funzioni!rientranti} rientrante, per cui nel caso si usino i
\itindex{thread} \textit{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
+ definita in \headfile{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 \index{funzioni!rientranti} rientrante
-\func{strerror\_r}, il cui prototipo è:
+\funcd{strerror\_r}, il cui prototipo è:
\begin{prototype}{string.h}
{char * strerror\_r(int errnum, char *buf, size\_t size)}
Il messaggio può essere riportato anche usando le due
\index{variabili!globali} 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
+dichiarate in \headfile{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}[!htbp]
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}
+(\texttt{\small 1--2}), controllando con i valori di ritorno di \funcm{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.
% 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: dall'header posix lim nell'header glibc run unistd name errno
% 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: newlen ENOTDIR EINVAL ENOMEM linux 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: device EBUSY only EACCES NODEV ENXIO major
% 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: 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: 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: loadavg nelem scheduler CONFIG ACCT acct filename 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: tms cutime cstime waitpid gettimeofday settimeofday timex
+% LocalWords: timespec adjtime olddelta adjtimex David Mills 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