%% system.tex
%%
-%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2012 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 "Un preambolo",
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.
Ma oltre alle informazioni ottenibili da \func{sysctl} dentro \file{proc} sono
disponibili moltissime altre informazioni, fra cui ad esempio anche quelle
fornite da \func{uname} (vedi sez.~\ref{sec:sys_uname}) che sono mantenute nei
-file \procrelfile{/proc/sys/kernel}{ostype},
-\procrelfile{/proc/sys/kernel}{hostname},
-\procrelfile{/proc/sys/kernel}{osrelease},
-\procrelfile{/proc/sys/kernel}{version} e
-\procrelfile{/proc/sys/kernel}{domainname} di \file{/proc/sys/kernel/}.
+file \sysctlrelfile{kernel}{ostype}, \sysctlrelfile{kernel}{hostname},
+\sysctlrelfile{kernel}{osrelease}, \sysctlrelfile{kernel}{version} e
+\sysctlrelfile{kernel}{domainname} di \file{/proc/sys/kernel/}.
\conffile{/etc/gshadow}, in cui sono state spostate le informazioni di
autenticazione (ed inserite alcune estensioni) per toglierle dagli altri
file che devono poter essere letti per poter effettuare l'associazione fra
- username e \acr{uid}.} il cui formato è descritto dalle relative pagine del
+ username e \ids{UID}.} il cui formato è descritto dalle relative pagine del
manuale\footnote{nella quinta sezione, quella dei file di configurazione,
occorre cioè usare \cmd{man 5 passwd} dato che altrimenti si avrebbe la
pagina di manuale del comando \cmd{passwd}.} e tutte le funzioni che
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
% \acr{glibc} per modularizzare l'accesso a tutti i servizi in cui sia
% necessario trovare una corrispondenza fra un nome ed un numero (od altra
% informazione) ad esso associato, come appunto, quella fra uno username ed un
-% \acr{uid} o fra un \acr{gid} ed il nome del gruppo corrispondente.
+% \ids{UID} o fra un \ids{GID} ed il nome del gruppo corrispondente.
Le prime funzioni che vedremo sono quelle previste dallo standard POSIX.1;
queste sono del tutto generiche e si appoggiano direttamente al \textit{Name
Service Switch}, per cui sono in grado di ricevere informazioni qualunque
Le due funzioni forniscono le informazioni memorizzate nel registro degli
utenti (che nelle versioni più recenti possono essere ottenute attraverso PAM)
-relative all'utente specificato attraverso il suo \acr{uid} o il nome di
+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
\file{/var/log/btmp} dove invece vengono memorizzati dal programma di login
tutti tentativi di accesso fallito.} Quando un utente si collega viene
aggiunta una voce a \file{/var/run/utmp} in cui viene memorizzato il nome di
-login, il terminale da cui ci si collega, l'\acr{uid} della shell di login,
+login, il terminale da cui ci si collega, l'\ids{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}.
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
fatto solo fino al valore del secondo, che per questo viene detto \textit{hard
limit}.
+%TODO: tabella troppo grossa, trasformare in lista
+
\begin{table}[htb]
\footnotesize
\centering
un errore di \errcode{EFBIG}.\\
\const{RLIMIT\_LOCKS}& È un limite presente solo nelle prime versioni
del kernel 2.4 sul numero massimo di
- \index{file!locking} \textit{file lock} (vedi
+ \itindex{file~locking} \textit{file lock} (vedi
sez.~\ref{sec:file_locking}) che un
processo poteva effettuare.\\
\const{RLIMIT\_MEMLOCK}& L'ammontare massimo di memoria che può essere
esegue operazioni che estendano lo
\textit{stack} oltre questa dimensione
riceverà un segnale di \signal{SIGSEGV}.\\
+% TODO dal 2.6.23 il significato è cambiato, vedi anche man execve
\const{RLIMIT\_RSS} & L'ammontare massimo di pagine di memoria dato al
\index{segmento!testo} testo del processo. Il
limite è solo una indicazione per il kernel,
qualora ci fosse un surplus di memoria questa
verrebbe assegnata.\\
+% TODO: aggiungere a \const{RLIMIT\_STACK} i dati di execve:
+% Questi fino al kernel 2.6.23 erano fissi e costituiti da
+% 32 pagine di memoria (corrispondenti per la gran parte delle architetture a
+% 128kb di dati). Dal 2.6.23 su molte architettire il limite viene stabilito in
+% base al valore della risorsa \const{RLIMIT\_STACK} (vedi
+% sez.~\ref{sec:sys_resource_limit}), ad un quarto dello spazio da essa
+% indicato). Dal 2.6.25 viene comunque garantito uno spazio base di 32 pagine.
+
% TODO integrare con la roba di madvise
% TODO integrare con le ultime aggiunte, vedi pagina di manuale
\hline
\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
del kernel.
Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
-parametro di sistema, modificabile attraverso \procfile{/proc/sys/kernel/acct}
+parametro di sistema, modificabile attraverso \sysctlfile{kernel/acct}
(o tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi,
il primo indica la percentuale di spazio disco libero sopra il quale viene
ripresa una registrazione che era stata sospesa per essere scesi sotto il
\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
una lettura approfondita del meccanismo descritto nell'RFC~1305, ci limitiamo
a descrivere in tab.~\ref{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}.
+campi della struttura \struct{timex} può essere ritrovato in \cite{GlibcMan}.
\begin{table}[!htb]
\footnotesize
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