+%% system.tex
+%%
+%% Copyright (C) 2000-2002 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",
+%% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the
+%% license is included in the section entitled "GNU Free Documentation
+%% License".
+%%
\chapter{La gestione del sistema, delle risorse, e degli errori}
\label{cha:system}
-\section{La lettura delle caratteristiche del sistema}
+\section{Capacità e caratteristiche del sistema}
\label{sec:sys_characteristics}
In questa sezione tratteremo le varie modalità con cui un programma può
opzioni di configurazione.
La definizione di queste caratteristiche ed il tentativo di provvedere dei
-meccanismi generali che i programmi potessero usare per ricavarle è uno degli
+meccanismi generali che i programmi possono usare per ricavarle è uno degli
aspetti più complessi e controversi con cui le diverse standardizzazioni si
sono dovute confrontare, spesso con risultati spesso tutt'altro che chiari.
-Proveremo comunque a dare una descrizione dei principali metodi previsti dai
-vari standard per ricavare sia le caratteristiche specifiche del sistema, che
+Daremo comunque una descrizione dei principali metodi previsti dai vari
+standard per ricavare sia le caratteristiche specifiche del sistema, che
quelle della gestione dei file.
Quando si devono determinare le le caratteristiche generali del sistema ci si
trova di fronte a diverse possibilità; alcune di queste infatti possono
dipendere dall'architettura dell'hardware (come le dimensioni dei tipi
-interi), o dal sistema operativo (come la presenza o meno dei \textit{saved
- id}), altre invece possono dipendere dalle opzioni con cui si è costruito
-il sistema (ad esempio da come si è compilato il kernel), o dalla
-configurazione del medesimo; per questo motivo in generale sono necessari due
-tipi diversi di funzionalità:
+interi), o dal sistema operativo (come la presenza o meno del gruppo degli
+identificatori \textit{saved}), altre invece possono dipendere dalle opzioni
+con cui si è costruito il sistema (ad esempio da come si è compilato il
+kernel), o dalla configurazione del medesimo; per questo motivo in generale
+sono necessari due tipi diversi di funzionalità:
\begin{itemize*}
\item la possibilità di determinare limiti ed opzioni al momento della
compilazione.
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
-costante, \macro{FOPEN\_MAX}, che può non essere fissa e che pertanto non è
+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.
\footnotesize
\begin{tabular}[c]{|l|r|l|}
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{MB\_LEN\_MAX}& 16 & massima dimensione di un
+ \const{MB\_LEN\_MAX}& 16 & massima dimensione di un
carattere esteso\\
- \macro{CHAR\_BIT} & 8 & bit di \ctyp{char}\\
- \macro{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\
- \macro{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\
- \macro{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\
- \macro{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\
- \macro{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\
- \macro{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\
- \macro{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\
- \macro{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\
- \macro{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\
- \macro{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\
- \macro{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\
- \macro{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\
- \macro{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\
- \macro{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\
+ \const{CHAR\_BIT} & 8 & bit di \ctyp{char}\\
+ \const{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\
+ \const{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\
+ \const{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\
+ \const{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\
+ \const{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\
+ \const{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\
+ \const{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\
+ \const{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\
+ \const{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\
+ \const{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\
+ \const{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\
+ \const{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\
+ \const{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\
+ \const{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\
\hline
\end{tabular}
\caption{Costanti definite in \file{limits.h} in conformità allo standard
\label{tab:sys_ansic_macro}
\end{table}
-\footnotetext[1]{il valore può essere 0 o \macro{SCHAR\_MIN} a seconda che il
+\footnotetext[1]{il valore può essere 0 o \const{SCHAR\_MIN} a seconda che il
sistema usi caratteri con segno o meno.}
-\footnotetext[2]{il valore può essere \macro{UCHAR\_MAX} o \macro{SCHAR\_MAX}
+\footnotetext[2]{il valore può essere \const{UCHAR\_MAX} o \const{SCHAR\_MAX}
a seconda che il sistema usi caratteri con segno o meno.}
A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
\footnotesize
\begin{tabular}[c]{|l|r|l|}
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\
- \macro{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\
- \macro{ULLONG\_MAX}&18446744073709551615&
+ \const{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\
+ \const{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\
+ \const{ULLONG\_MAX}&18446744073709551615&
massimo di \ctyp{unsigned long long}\\
\hline
\end{tabular}
\footnotesize
\begin{tabular}[c]{|l|r|p{8cm}|}
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{ARG\_MAX} &131072& dimensione massima degli argomenti
+ \const{ARG\_MAX} &131072& dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \macro{CHILD\_MAX} & 999& numero massimo di processi contemporanei
+ \const{CHILD\_MAX} & 999& numero massimo di processi contemporanei
che un utente può eseguire.\\
- \macro{OPEN\_MAX} & 256& numero massimo di file che un processo
+ \const{OPEN\_MAX} & 256& numero massimo di file che un processo
può mantenere aperti in contemporanea.\\
- \macro{STREAM\_MAX}& 8& massimo numero di stream aperti per
+ \const{STREAM\_MAX}& 8& massimo numero di stream aperti per
processo in contemporanea.\\
- \macro{TZNAME\_MAX}& 6& dimensione massima del nome di una
- \texttt{timezone} (vedi ).\\
- \macro{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
+ \const{TZNAME\_MAX}& 6& dimensione massima del nome di una
+ \texttt{timezone} (vedi
+ \secref{sec:sys_time_base})).\\
+ \const{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
processo (vedi \secref{sec:proc_access_id}).\\
- \macro{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
+ \const{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
\hline
\hline
\end{tabular}
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 \macro{CHILD\_MAX}), e non è pertanto il
+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
\footnotesize
\begin{tabular}[c]{|l|r|p{8cm}|}
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
+ \const{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \macro{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
+ \const{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
contemporanei che un utente può
eseguire.\\
- \macro{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
+ \const{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
può mantenere aperti in
contemporanea.\\
- \macro{\_POSIX\_STREAM\_MAX} & 8& massimo numero di stream aperti per
+ \const{\_POSIX\_STREAM\_MAX} & 8& massimo numero di stream aperti per
processo in contemporanea.\\
- \macro{\_POSIX\_TZNAME\_MAX} & & dimensione massima del nome di una
- \texttt{timezone} (vedi ).\\
- \macro{\_POSIX\_NGROUPS\_MAX}& 0& numero di gruppi supplementari per
+ \const{\_POSIX\_TZNAME\_MAX} & & dimensione massima del nome di una
+ \texttt{timezone} (vedi
+ \secref{sec:sys_date}). \\
+ \const{\_POSIX\_NGROUPS\_MAX}& 0& numero di gruppi supplementari per
processo (vedi
\secref{sec:proc_access_id}).\\
- \macro{\_POSIX\_SSIZE\_MAX} &32767& valore massimo del tipo
+ \const{\_POSIX\_SSIZE\_MAX} &32767& valore massimo del tipo
\type{ssize\_t}.\\
- \macro{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
- \macro{\_POSIX\_AIO\_MAX} & 1& \\
+ \const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
+ \const{\_POSIX\_AIO\_MAX} & 1& \\
\hline
\hline
\end{tabular}
\hline
\macro{\_POSIX\_JOB\_CONTROL}& il sistema supporta il
\textit{job control} (vedi
- \secref{sec:sess_xxx}).\\
- \macro{\_POSIX\_SAVED\_IDS} & il sistema supporta i \textit{saved id}
- (vedi \secref{sec:proc_access_id}).
+ \secref{sec:sess_job_control}).\\
+ \macro{\_POSIX\_SAVED\_IDS} & il sistema supporta gli identificatori del
+ gruppo \textit{saved} (vedi
+ \secref{sec:proc_access_id})
per il controllo di accesso dei processi\\
- \macro{\_POSIX\_VERSION} & fornisce la versione dello standard POSIX.1
+ \const{\_POSIX\_VERSION} & fornisce la versione dello standard POSIX.1
supportata nel formato YYYYMML (ad esempio
199009L).\\
\hline
pena menzionare alcune macro di uso comune, (riportate in
\tabref{tab:sys_posix1_other}), che non indicano un valore specifico, ma
denotano la presenza di alcune funzionalità nel sistema (come il supporto del
-\textit{job control} o dei \textit{saved id}).
+\textit{job control} o degli identificatori del gruppo \textit{saved}).
Oltre allo standard POSIX.1, anche lo standard POSIX.2 definisce una serie di
altre costanti. Siccome queste sono principalmente attinenti a limiti relativi
alle applicazioni di sistema presenti (come quelli su alcuni parametri delle
espressioni regolari o del comando \cmd{bc}), non li tratteremo
esplicitamente, se ne trova una menzione completa nell'header file
-\file{bits/posix2\_lim.h}, e alcuni di loro sono descritti nella man page di
-\func{sysconf} e nel manuale delle \acr{glibc}.
+\file{bits/posix2\_lim.h}, e alcuni di loro sono descritti nella pagina di
+manuale di \func{sysconf} e nel manuale delle \acr{glibc}.
\subsection{La funzione \func{sysconf}}
\bodydesc{La funzione restituisce indietro il valore del parametro
richiesto, o 1 se si tratta di un'opzione disponibile, 0 se l'opzione non
- è disponibile e -1 in caso di errore (ma \var{errno} non viene settata).}
+ è disponibile e -1 in caso di errore (ma \var{errno} non viene impostata).}
\end{prototype}
La funzione prende come argomento un intero che specifica quale dei limiti si
\textbf{Parametro}&\textbf{Macro sostituita} &\textbf{Significato}\\
\hline
\hline
- \texttt{\_SC\_ARG\_MAX} &\macro{ARG\_MAX}&
+ \texttt{\_SC\_ARG\_MAX} &\const{ARG\_MAX}&
La dimensione massima degli argomenti passati ad una funzione
della famiglia \func{exec}.\\
- \texttt{\_SC\_CHILD\_MAX}&\macro{\_CHILD\_MAX}&
+ \texttt{\_SC\_CHILD\_MAX}&\const{\_CHILD\_MAX}&
Il numero massimo di processi contemporanei che un utente può
eseguire.\\
- \texttt{\_SC\_OPEN\_MAX}&\macro{\_OPEN\_MAX}&
+ \texttt{\_SC\_OPEN\_MAX}&\const{\_OPEN\_MAX}&
Il numero massimo di file che un processo può mantenere aperti in
contemporanea.\\
- \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
+ \texttt{\_SC\_STREAM\_MAX}& \const{STREAM\_MAX}&
Il massimo numero di stream che un processo può mantenere aperti in
contemporanea. Questo limite previsto anche dallo standard ANSI C, che
specifica la macro {FOPEN\_MAX}.\\
- \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
+ \texttt{\_SC\_TZNAME\_MAX}&\const{TZNAME\_MAX}&
La dimensione massima di un nome di una \texttt{timezone} (vedi
\secref{sec:sys_date}).\\
- \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
+ \texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}&
Massimo numero di gruppi supplementari che può avere un processo (vedi
\secref{sec:proc_access_id}).\\
- \texttt{\_SC\_SSIZE\_MAX}&\macro{SSIZE\_MAX}&
+ \texttt{\_SC\_SSIZE\_MAX}&\const{SSIZE\_MAX}&
valore massimo del tipo di dato \type{ssize\_t}.\\
- \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
+ \texttt{\_SC\_CLK\_TCK}& \const{CLK\_TCK} &
Il numero di \textit{clock tick} al secondo, cioè l'unità di misura del
\textit{process time} (vedi \secref{sec:sys_unix_time}).\\
\texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
Indica se è supportato il \textit{job control} (vedi
- \secref{sec:sess_xxx}) in stile POSIX.\\
+ \secref{sec:sess_job_control}) in stile POSIX.\\
\texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
Indica se il sistema supporta i \textit{saved id} (vedi
\secref{sec:proc_access_id}).\\
- \texttt{\_SC\_VERSION}& \macro{\_POSIX\_VERSION} &
+ \texttt{\_SC\_VERSION}& \const{\_POSIX\_VERSION} &
Indica il mese e l'anno di approvazione della revisione dello standard
POSIX.1 a cui il sistema fa riferimento, nel formato YYYYMML, la
revisione più recente è 199009L, che indica il Settembre 1990.\\
\begin{table}[htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|r|p{8cm}|}
+ \begin{tabular}[c]{|l|r|l|}
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
+ \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \macro{PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
- \macro{PIPE\_BUF}& 512 & byte scrivibili atomicamente in una pipe\\
- \macro{LINK\_MAX} &8 & numero massimo di link a un file\\
- \macro{MAX\_CANON}&255 & spazio disponibile nella coda di input
- canonica del terminale\\
- \macro{MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale\\
+ \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 pathname.\\
+ \const{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe
+ (vedi \secref{sec:ipc_pipes}).\\
+ \const{MAX\_CANON}&255 & dimensione di una riga di terminale in modo
+ canonico (vedi \secref{sec:term_design}).\\
+ \const{MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ del terminale (vedi \secref{sec:term_design}).\\
\hline
\end{tabular}
- \caption{Macro per i limiti sulle caratteristiche dei file.}
+ \caption{Costanti per i limiti sulle caratteristiche dei file.}
\label{tab:sys_file_macro}
\end{table}
\begin{table}[htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|r|p{8cm}|}
+ \begin{tabular}[c]{|l|r|l|}
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
- \macro{\_POSIX\_LINK\_MAX} &8 & numero massimo di link a un file\\
- \macro{\_POSIX\_MAX\_CANON}&255 & spazio disponibile nella coda di input
- canonica del terminale\\
- \macro{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale\\
- \macro{\_POSIX\_NAME\_MAX}& 14 & lunghezza in byte di un nome di file. \\
- \macro{\_POSIX\_PATH\_MAX}& 256 & lunghezza in byte di pathname.\\
- \macro{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
- pipe\\
-% \macro{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
-% \macro{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
-% \macro{\_POSIX\_FD\_SETSIZE}& 16 & \\
-% \macro{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
+ \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 pathname.\\
+ \const{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
+ pipe.\\
+ \const{\_POSIX\_MAX\_CANON}&255 & dimensione di una riga di
+ terminale in modo canonico.\\
+ \const{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ del terminale.\\
+% \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
+% \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
+% \const{\_POSIX\_FD\_SETSIZE}& 16 & \\
+% \const{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\
\hline
\end{tabular}
- \caption{Macro dei valori minimi delle caratteristiche dei file per la
+ \caption{Costanti dei valori minimi delle caratteristiche dei file per la
conformità allo standard POSIX.1.}
\label{tab:sys_posix1_file}
\end{table}
Restituisce il valore del parametro \param{name} per il file \param{path}.
\bodydesc{La funzione restituisce indietro il valore del parametro
- richiesto, o -1 in caso di errore (ed \var{errno} viene settata ad uno
+ richiesto, o -1 in caso di errore (ed \var{errno} viene impostata ad uno
degli errori possibili relativi all'accesso a \param{path}).}
\end{prototype}
Restituisce informazioni sul sistema nella struttura \param{info}.
\bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
- fallimento, nel qual caso \var{errno} viene settata a \macro{EFAULT}.}
+ fallimento, nel qual caso \var{errno} assumerà il valore \errval{EFAULT}.}
\end{prototype}
La funzione, che viene usata dal comando \cmd{uname}, restituisce le
\item il nome del domino.
\end{itemize*}
l'ultima informazione è stata aggiunta di recente e non è prevista dallo
-standard POSIX, essa è accessibile, come mostrato in \figref{fig:sig_stack_t},
+standard POSIX, essa è accessibile, come mostrato in \figref{fig:sys_utsname},
solo definendo \macro{\_GNU\_SOURCE}.
\begin{figure}[!htb]
In generale si tenga presente che le dimensioni delle stringe di una
\var{utsname} non è specificata, e che esse sono sempre terminate con
-\macro{NULL}; il manuale delle \acr{glibc} indica due diverse dimensioni,
-\macro{\_UTSNAME\_LENGTH} per i campi standard e
-\macro{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
-altri sistemi usano nomi diversi come \macro{SYS\_NMLN} o \macro{\_SYS\_NMLN}
-o \macro{UTSLEN} che possono avere valori diversi. Nel caso di Linux
+\val{null}; il manuale delle \acr{glibc} indica due diverse dimensioni,
+\const{\_UTSNAME\_LENGTH} per i campi standard e
+\const{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
+altri sistemi usano nomi diversi come \const{SYS\_NMLN} o \const{\_SYS\_NMLN}
+o \const{UTSLEN} che possono avere valori diversi.\footnote{Nel caso di Linux
\func{uname} corrisponde in realtà a 3 system call diverse, le prime due usano
rispettivamente delle lunghezze delle stringhe di 9 e 65 byte; la terza usa
anch'essa 65 byte, ma restituisce anche l'ultimo campo, \var{domainname}, con
-una lunghezza di 257 byte.
+una lunghezza di 257 byte.}
\section{Opzioni e configurazione del sistema}
da uno standard, ogni sistema può avere una sua serie di altri parametri di
configurazione, che, non essendo mai fissi e variando da sistema a sistema,
non sono stati inclusi nella standardizzazione della sezione precedente. Per
-questi occorre, oltre al meccanismo di settaggio, pure un meccanismo di
-lettura.
-
-Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si
-usano per il controllo di altre caratteristiche generali del sistema, come
-quelle per la gestione dei filesystem e di utenti e gruppi.
+questi occorre, oltre al meccanismo di impostazione, pure un meccanismo di
+lettura. Affronteremo questi argomenti in questa sezione, insieme alle
+funzioni che si usano per il controllo di altre caratteristiche generali del
+sistema, come quelle per la gestione dei filesystem e di utenti e gruppi.
\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
\label{sec:sys_sysctl}
-La funzione che permette la lettura ed il settaggio dei parametri del sistema
-è \func{sysctl}; è una funzione derivata da BSD4.4, ma l'implementazione è
-specifica di Linux; il suo prototipo è:
+La funzione che permette la lettura ed l'impostazione dei parametri del
+sistema è \func{sysctl}; è una funzione derivata da BSD4.4, ma
+l'implementazione è specifica di Linux; il suo prototipo è:
\begin{functions}
\headdecl{unistd.h}
-\headdecl{linux/unistd.h}
-\headdecl{linux/sysctl.h}
\funcdecl{int sysctl(int *name, int nlen, void *oldval, size\_t *oldlenp, void
*newval, size\_t newlen)}
Legge o scrive uno dei parametri di sistema.
\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
- errore, nel qual caso \var{errno} viene settato ai valori:
+ errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\macro{EPERM}] il processo non ha il permesso di accedere ad uno dei
- componenti nel cammino specificato per il parametro, o non ha il permesso
- di accesso al parametro nella modalità scelta.
- \item[\macro{ENOTDIR}] non esiste un parametro corrispondente al nome
+ \item[\errcode{EPERM}] non si ha il permesso di accedere ad uno dei
+ componenti nel cammino specificato per il parametro, o di accedere al
+ parametro nella modalità scelta.
+ \item[\errcode{ENOTDIR}] non esiste un parametro corrispondente al nome
\param{name}.
- \item[\macro{EFAULT}] si è specificato \param{oldlenp} zero quando
- \param{oldval} è non nullo.
- \item[\macro{EINVAL}] o si è specificato un valore non valido per il
- parametro che si vuole settare o lo spazio provvisto per il ritorno di un
+% \item[\errcode{EFAULT}] si è specificato \param{oldlenp} zero quando
+% \param{oldval} è non nullo.
+ \item[\errcode{EINVAL}] o si è specificato un valore non valido per il
+ parametro che si vuole impostare o lo spazio provvisto per il ritorno di un
valore non è delle giuste dimensioni.
- \item[\macro{ENOMEM}] talvolta viene usato più correttamente questo errore
+ \item[\errcode{ENOMEM}] talvolta viene usato più correttamente questo errore
quando non si è specificato sufficiente spazio per ricevere il valore di un
parametro.
\end{errlist}
+ ed inoltre \errval{EFAULT}.
}
\end{functions}
I parametri a cui la funzione permettere di accedere sono organizzati in
-maniera gerarchica all'interno un albero; 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 pathname (da cui l'uso alternativo del
-filesystem \file{/proc}, che vedremo dopo).
+maniera gerarchica all'interno 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
+ \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 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
L'indirizzo a cui il valore corrente del parametro deve essere letto è
specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da
\param{oldlenp} (passato come puntatore per avere indietro la dimensione
-effettiva di quanto letto); il valore che si vuole settare nel sistema è
+effettiva di quanto letto); il valore che si vuole impostare nel sistema è
passato in \param{newval} e la sua dimensione in \param{newlen}.
Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il
fallimento, nel qual caso gli errori comuni a tutti i filesystem che possono
essere restituiti in \var{errno} sono:
\begin{errlist}
- \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
- \item[\macro{ENODEV}] \param{filesystemtype} non esiste o non è configurato
+ \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
+ \item[\errcode{ENODEV}] \param{filesystemtype} non esiste o non è configurato
nel kernel.
- \item[\macro{ENOTBLK}] non si è usato un \textit{block device} per
+ \item[\errcode{ENOTBLK}] non si è usato un \textit{block device} per
\param{source} quando era richiesto.
- \item[\macro{EBUSY}] \param{source} è già montato, o non può essere
+ \item[\errcode{EBUSY}] \param{source} è già montato, o non può essere
rimontato in read-only perché ci sono ancora file aperti in scrittura, o
\param{target} è ancora in uso.
- \item[\macro{EINVAL}] il device \param{source} presenta un
+ \item[\errcode{EINVAL}] il device \param{source} presenta un
\textit{superblock} non valido, o si è cercato di rimontare un filesystem
non ancora montato, o di montarlo senza che \param{target} sia un
\textit{mount point} o di spostarlo quando \param{target} non è un
\textit{mount point} o è \file{/}.
- \item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti
- del pathname, o si è cercato di montare un filesystem disponibile in sola
- lettura senza averlo specificato o il device \param{source} è su un
- filesystem montato con l'opzione \macro{MS\_NODEV}.
- \item[\macro{ENXIO}] il \textit{major number} del device \param{source} è
+ \item[\errcode{EACCES}] non si ha il permesso di accesso su uno dei
+ componenti del pathname, o si è cercato di montare un filesystem
+ disponibile in sola lettura senza averlo specificato o il device
+ \param{source} è su un filesystem montato con l'opzione \const{MS\_NODEV}.
+ \item[\errcode{ENXIO}] il \textit{major number} del device \param{source} è
sbagliato.
- \item[\macro{EMFILE}] la tabella dei device \textit{dummy} è piena.
+ \item[\errcode{EMFILE}] la tabella dei device \textit{dummy} è piena.
\end{errlist}
- ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM},
- \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
+ ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM},
+ \errval{ENAMETOOLONG}, \errval{ENOENT} o \errval{ELOOP}.}
\end{prototype}
La funzione monta sulla directory \param{target}, detta \textit{mount point},
In Linux \param{mountflags} deve essere un intero a 32 bit i cui 16 più
significativi sono un \textit{magic number}\footnote{cioè un numero speciale
usato come identificativo, che nel caso è \code{0xC0ED}; si può usare la
- costante \macro{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
+ costante \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags}
riservata al \textit{magic number}.} mentre i 16 meno significativi sono
usati per specificare le opzioni; essi sono usati come maschera binaria e
-vanno settati con un OR aritmetico della costante \macro{MS\_MGC\_VAL} con i
-valori riportati in \ntab.
+vanno impostati con un OR aritmetico della costante \const{MS\_MGC\_VAL} con i
+valori riportati in \tabref{tab:sys_mount_flags}.
\begin{table}[htb]
\footnotesize
\textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{MS\_RDONLY} & 1 & monta in sola lettura\\
- \macro{MS\_NOSUID} & 2 & ignora i bit \acr{suid} e \acr{sgid}\\
- \macro{MS\_NODEV} & 4 & impedisce l'accesso ai file di dispositivo\\
- \macro{MS\_NOEXEC} & 8 & impedisce di eseguire programmi \\
- \macro{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona \\
- \macro{MS\_REMOUNT} & 32 & rimonta il filesystem cambiando i flag\\
- \macro{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking} (vedi
+ \const{MS\_RDONLY} & 1 & monta in sola lettura\\
+ \const{MS\_NOSUID} & 2 & ignora i bit \acr{suid} e \acr{sgid}\\
+ \const{MS\_NODEV} & 4 & impedisce l'accesso ai file di dispositivo\\
+ \const{MS\_NOEXEC} & 8 & impedisce di eseguire programmi \\
+ \const{MS\_SYNCHRONOUS}& 16 & abilita la scrittura sincrona \\
+ \const{MS\_REMOUNT} & 32 & rimonta il filesystem cambiando i flag\\
+ \const{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking} (vedi
\secref{sec:file_mand_locking})\\
- \macro{S\_WRITE} & 128 & scrive normalmente \\
- \macro{S\_APPEND} & 256 & consente la scrittura solo in \textit{append
+ \const{S\_WRITE} & 128 & scrive normalmente \\
+ \const{S\_APPEND} & 256 & consente la scrittura solo in \textit{append
mode} (vedi \secref{sec:file_sharing})\\
- \macro{S\_IMMUTABLE} & 512 & impedisce che si possano modificare i file \\
- \macro{MS\_NOATIME} &1024 & non aggiorna gli \textit{access time} (vedi
+ \const{S\_IMMUTABLE} & 512 & impedisce che si possano modificare i file \\
+ \const{MS\_NOATIME} &1024 & non aggiorna gli \textit{access time} (vedi
\secref{sec:file_file_times})\\
- \macro{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
+ \const{MS\_NODIRATIME}&2048 & non aggiorna gli \textit{access time} delle
directory\\
- \macro{MS\_BIND} &4096 & monta il filesystem altrove\\
- \macro{MS\_MOVE} &8192 & sposta atomicamente il punto di montaggio \\
+ \const{MS\_BIND} &4096 & monta il filesystem altrove\\
+ \const{MS\_MOVE} &8192 & sposta atomicamente il punto di montaggio \\
\hline
\end{tabular}
\caption{Tabella dei codici dei flag di montaggio di un filesystem.}
\label{tab:sys_mount_flags}
\end{table}
-Per il settaggio delle caratteristiche particolari di ciascun filesystem si
+Per l'impostazione delle caratteristiche particolari di ciascun filesystem si
usa invece l'argomento \param{data} che serve per passare le ulteriori
informazioni necessarie, che ovviamente variano da filesystem a filesystem.
\textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo
alcune delle caratteristiche di funzionamento (ad esempio passare da sola
lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei
-bit di \param{mountflags}, \macro{MS\_REMOUNT}, che se settato specifica che
+bit di \param{mountflags}, \const{MS\_REMOUNT}, che se impostato specifica che
deve essere effettuato il rimontaggio del filesystem (con le opzioni
specificate dagli altri bit), anche in questo caso il valore di \param{source}
viene ignorato.
Smonta il filesystem montato sulla directory \param{target}.
\bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di
- fallimento, nel qual caso \var{errno} viene settata a:
+ fallimento, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
- \item[\macro{EBUSY}] \param{target} è la directory di lavoro di qualche
+ \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore.
+ \item[\errcode{EBUSY}] \param{target} è la directory di lavoro di qualche
processo, o contiene dei file aperti, o un altro mount point.
\end{errlist}
- ed inoltre \macro{ENOTDIR}, \macro{EFAULT}, \macro{ENOMEM},
- \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.}
+ ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM},
+ \errval{ENAMETOOLONG}, \errval{ENOENT} o \errval{ELOOP}.}
\end{prototype}
\noindent la funzione prende il nome della directory su cui il filesystem è
montato e non il file o il dispositivo che è stato montato,\footnote{questo è
\textsl{occupato}, questo avviene quando ci sono ancora file aperti sul
filesystem, se questo contiene la directory di lavoro corrente di un qualunque
processo o il mount point di un altro filesystem; in questo caso l'errore
-restituito è \macro{EBUSY}.
+restituito è \errcode{EBUSY}.
Linux provvede inoltre una seconda funzione, \func{umount2}, che in alcuni
casi permette di forzare lo smontaggio di un filesystem, anche quando questo
\end{prototype}
Il valore di \param{flags} è una maschera binaria, e al momento l'unico valore
-definito è il bit \macro{MNT\_FORCE}; gli altri bit devono essere nulli.
-Specificando \macro{MNT\_FORCE} la funzione cercherà di liberare il filesystem
+definito è il bit \const{MNT\_FORCE}; gli altri bit devono essere nulli.
+Specificando \const{MNT\_FORCE} la funzione cercherà di liberare il filesystem
anche se è occupato per via di una delle condizioni descritte in precedenza. A
seconda del tipo di filesystem alcune (o tutte) possono essere superate,
-evitando l'errore di \macro{EBUSY}. In tutti i casi prima dello smontaggio
+evitando l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio
viene eseguita una sincronizzazione dei dati.
Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD,
posto il file specificato.
\bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
- errore, nel qual caso \var{errno} viene settato ai valori:
+ errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\macro{ENOSYS}] il filesystem su cui si trova il file specificato non
+ \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato non
supporta la funzione.
\end{errlist}
- e \macro{EFAULT} ed \macro{EIO} per entrambe, \macro{EBADF} per
- \func{fstatfs}, \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
- \macro{EACCES}, \macro{ELOOP} per \func{statfs}.}
+ e \errval{EFAULT} ed \errval{EIO} per entrambe, \errval{EBADF} per
+ \func{fstatfs}, \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT},
+ \errval{EACCES}, \errval{ELOOP} per \func{statfs}.}
\end{functions}
Queste funzioni permettono di ottenere una serie di informazioni generali
riguardo al filesystem su cui si trova il file specificato; queste vengono
restituite una struttura \param{buf} di tipo \type{statfs} definita come in
-\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in
-esame sono settati a zero. I valori del campo \var{f\_type} sono definiti per
-i vari filesystem nei relativi file di header dei sorgenti del kernel da
-costanti del tipo \macro{XXX\_SUPER\_MAGIC}, dove \macro{XXX} in genere è il
+\figref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in
+esame sono impostati a zero. I valori del campo \var{f\_type} sono definiti
+per i vari filesystem nei relativi file di header dei sorgenti del kernel da
+costanti del tipo \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in genere è il
nome del filesystem stesso.
\begin{figure}[!htb]
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; /* inodes totali nel filesystem */
- long f_ffree; /* inodes liberi nel filesystem */
+ 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 */
Restituiscono le informazioni relative all'utente specificato.
\bodydesc{Le funzioni ritornano il puntatore alla struttura contenente le
- informazioni in caso di successo e \macro{NULL} nel caso non sia stato
+ informazioni in caso di successo e \val{null} nel caso non sia stato
trovato nessun utente corrispondente a quanto specificato.}
\end{functions}
Restituiscono le informazioni relative all'utente specificato.
\bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
- altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
+ altrimenti, nel qual caso \var{errno} sarà impostata opportunamente.}
\end{functions}
In questo caso l'uso è molto più complesso, in quanto bisogna prima allocare
\param{buflen} byte, sarà utilizzata per contenere le stringhe puntate dai
campi di \param{password}. Infine all'indirizzo puntato da \param{result}
viene restituito il puntatore ai dati ottenuti, cioè \param{buffer} nel caso
-l'utente esista, o \macro{NULL} altrimenti. Qualora i dati non possano essere
+l'utente esista, o \val{null} altrimenti. Qualora i dati non possano essere
contenuti nei byte specificati da \param{buflen}, la funzione fallirà
-restituendo \macro{ERANGE} (e \param{result} sarà comunque settato a
-\macro{NULL}).
+restituendo \errcode{ERANGE} (e \param{result} sarà comunque impostato a
+\val{null}).
Del tutto analoghe alle precedenti sono le funzioni \func{getgrnam} e
\func{getgrgid} (e le relative analoghe rientranti con la stessa estensione
Restituiscono le informazioni relative al gruppo specificato.
\bodydesc{Le funzioni ritornano 0 in caso di successo e un codice d'errore
- altrimenti, nel qual caso \var{errno} sarà settato opportunamente.}
+ altrimenti, nel qual caso \var{errno} sarà impostata opportunamente.}
\end{functions}
Il comportamento di tutte queste funzioni è assolutamente identico alle
Le funzioni viste finora sono in grado di leggere le informazioni sia dal file
delle password in \file{/etc/passwd} che con qualunque altro metodo sia stato
utilizzato per mantenere il database degli utenti. Non permettono però di
-settare direttamente le password; questo è possibile con un'altra interfaccia
+impostare direttamente le password; questo è possibile con un'altra interfaccia
al database degli utenti, derivata da SVID, che però funziona soltanto con un
database che sia tenuto su un file che abbia il formato classico di
\file{/etc/passwd}.
completa. Per questo motivo l'uso di queste funzioni è deprecato in favore
dell'uso di PAM, ci limiteremo pertanto ad elencarle in
\tabref{tab:sys_passwd_func}, rimandando chi fosse interessato alle rispettive
-man page e al manuale delle \acr{glibc} per i dettagli del loro funzionamento.
+pagine di manuale e al manuale delle \acr{glibc} per i dettagli del loro
+funzionamento.
\end{functions}
In caso questo non venga specificato nessun file viene usato il valore
-standard \macro{\_PATH\_UTMP} (che è definito in \file{paths.h}); in genere
+standard \const{\_PATH\_UTMP} (che è definito in \file{paths.h}); in genere
\func{utmpname} prevede due possibili valori:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\macro{\_PATH\_UTMP}] Specifica il database di accounting per gli utenti
+\item[\const{\_PATH\_UTMP}] Specifica il database di accounting per gli utenti
correntemente collegati.
-\item[\macro{\_PATH\_WTMP}] Specifica il database di accounting per l'archivio
+\item[\const{\_PATH\_WTMP}] Specifica il database di accounting per l'archivio
storico degli utenti collegati.
\end{basedescript}
corrispondenti ai file \file{/var/run/utmp} e \file{/var/log/wtmp} visti in
Scrive una voce nel database.
\bodydesc{Le funzioni ritornano il puntatore ad una struttura \var{utmp} in
- caso di successo e \macro{NULL} in caso di errore.}
+ caso di successo e \val{null} in caso di errore.}
\end{functions}
Tutte queste funzioni fanno riferimento ad una struttura di tipo \var{utmp},
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
-\macro{RUN\_LVL}, \macro{BOOT\_TIME}, \macro{OLD\_TIME}, \macro{NEW\_TIME},
+\const{RUN\_LVL}, \const{BOOT\_TIME}, \const{OLD\_TIME}, \const{NEW\_TIME},
verrà restituito la prima voce che corrisponde al tipo determinato; quando
-invece assume i valori \macro{INIT\_PROCESS}, \macro{LOGIN\_PROCESS},
-\macro{USER\_PROCESS} o \macro{DEAD\_PROCESS} verrà restituita la prima voce
+invece assume i valori \const{INIT\_PROCESS}, \const{LOGIN\_PROCESS},
+\const{USER\_PROCESS} o \const{DEAD\_PROCESS} verrà restituita la prima voce
corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}.
\begin{table}[htb]
\centering
\begin{tabular}[c]{|l|p{8cm}|}
\hline
- \textbf{Funzione} & \textbf{Significato}\\
+ \textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \macro{EMPTY} & Non contiene informazioni valide. \\
- \macro{RUN\_LVL} & Identica il runlevel del sistema. \\
- \macro{BOOT\_TIME} & Identifica il tempo di avvio del sistema \\
- \macro{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
+ \const{EMPTY} & Non contiene informazioni valide. \\
+ \const{RUN\_LVL} & Identica il runlevel del sistema. \\
+ \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema \\
+ \const{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
sistema. \\
- \macro{NEW\_TIME} & Identifica da quanto è stato modificato il
+ \const{NEW\_TIME} & Identifica da quanto è stato modificato il
sistema. \\
- \macro{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}. \\
- \macro{LOGIN\_PROCESS}& Identifica un processo di login. \\
- \macro{USER\_PROCESS} & Identifica un processo utente. \\
- \macro{DEAD\_PROCESS} & Identifica un processo terminato. \\
- \macro{ACCOUNTING} & ??? \\
+ \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}. \\
+ \const{LOGIN\_PROCESS}& Identifica un processo di login. \\
+ \const{USER\_PROCESS} & Identifica un processo utente. \\
+ \const{DEAD\_PROCESS} & Identifica un processo terminato. \\
+ \const{ACCOUNTING} & ??? \\
\hline
\end{tabular}
\caption{Classificazione delle voci del database di accounting a seconda dei
\end{table}
La funzione \func{getutline} esegue la ricerca sulle voci che hanno
-\var{ut\_type} uguale a \macro{LOGIN\_PROCESS} o \macro{USER\_PROCESS},
+\var{ut\_type} uguale a \const{LOGIN\_PROCESS} o \const{USER\_PROCESS},
restituendo la prima che corrisponde al valore di \var{ut\_line}, che
specifica il device\footnote{espresso senza il \file{/dev/} iniziale.} di
terminale che interessa. Lo stesso criterio di ricerca è usato da
specificati.
\bodydesc{Le funzioni ritornano il puntatore ad una struttura \var{utmp} in
- caso di successo e \macro{NULL} in caso di errore.}
+ 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
user space, e quello impiegato dal kernel nelle system call eseguite per conto
del processo.
-Gli altri tre campi servono a quantificare l'uso della memoria virtuale e
-corrispondono rispettivamente al numero di \textit{page fault}\index{page
- fault} (vedi \secref{sec:proc_mem_gen}) avvenuti senza richiedere I/O (i
-cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O
-(detti invece \textit{major page fault}) ed al numero di volte che il processo
-è stato completamente tolto dalla memoria per essere inserito nello swap.
+Gli altri tre campi servono a quantificare l'uso della memoria
+virtuale\index{memoria virtuale} e corrispondono rispettivamente al numero di
+\textit{page fault}\index{page fault} (vedi \secref{sec:proc_mem_gen})
+avvenuti senza richiedere I/O (i cosiddetti \textit{minor page fault}), a
+quelli che invece han richiesto I/O (detti invece \textit{major page fault})
+ed al numero di volte che il processo è stato completamente tolto dalla
+memoria per essere inserito nello swap.
In genere includere esplicitamente \file{<sys/time.h>} non è più necessario,
ma aumenta la portabilità, e serve comunque quando, come nella maggior parte
\bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
- nel qual caso \var{errno} può essere \macro{EINVAL} o \macro{EFAULT}.}
+ nel qual caso \var{errno} può essere \errval{EINVAL} o \errval{EFAULT}.}
\end{functions}
L'argomento \param{who} permette di specificare il processo di cui si vuole
leggere l'uso delle risorse; esso può assumere solo i due valori
-\macro{RUSAGE\_SELF} per indicare il processo corrente e
-\macro{RUSAGE\_CHILDREN} per indicare l'insieme dei processi figli di cui si è
+\const{RUSAGE\_SELF} per indicare il processo corrente e
+\const{RUSAGE\_CHILDREN} per indicare l'insieme dei processi figli di cui si è
ricevuto lo stato di terminazione.
\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 far leggere o settare
-i limiti di utilizzo delle risorse da parte di un processo le \acr{glibc}
-prevedono due funzioni, \func{getrlimit} e \func{setrlimit}, i cui prototipi
-sono:
+il fallimento della system call che lo ha provocato; per far leggere o
+impostare i limiti di utilizzo delle risorse da parte di un processo le
+\acr{glibc} prevedono due funzioni, \func{getrlimit} e \func{setrlimit}, i cui
+prototipi sono:
\begin{functions}
\headdecl{sys/time.h}
\headdecl{sys/resource.h}
\funcdecl{int setrlimit(int resource, const struct rlimit *rlim)}
- Setta il limite per la risorsa \param{resource}.
+ Imposta il limite per la risorsa \param{resource}.
\bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
- errore, nel qual caso \var{errno} viene settata ai valori:
+ errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\macro{EINVAL}] I valori per \param{resource} non sono validi.
- \item[\macro{EPERM}] Un processo senza i privilegi di amministratore ha
+ \item[\errcode{EINVAL}] I valori per \param{resource} non sono validi.
+ \item[\errcode{EPERM}] Un processo senza i privilegi di amministratore ha
cercato di innalzare i propri limiti.
\end{errlist}
- ed \macro{EFAULT}.}
+ ed \errval{EFAULT}.}
\end{functions}
Entrambe le funzioni permettono di specificare su quale risorsa si vuole
\textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \macro{RLIMIT\_CPU} & Il massimo tempo di CPU che il processo può
+ \const{RLIMIT\_CPU} & Il massimo tempo di CPU che il processo può
usare. Il superamento del limite comporta
- l'emissione di un segnale di \macro{SIGXCPU}.\\
- \macro{RLIMIT\_FSIZE} & La massima dimensione di un file che un processo
+ l'emissione di un segnale di \const{SIGXCPU}.\\
+ \const{RLIMIT\_FSIZE} & La massima dimensione di un file che un processo
può usare. Se il processo cerca di scrivere
oltre questa dimensione riceverà un segnale di
- \macro{SIGXFSZ}.\\
- \macro{RLIMIT\_DATA} & La massima dimensione della memoria dati di un
+ \const{SIGXFSZ}.\\
+ \const{RLIMIT\_DATA} & La massima dimensione della memoria dati di un
processo. Il tentativo di allocare più memoria
causa il fallimento della funzione di
allocazione. \\
- \macro{RLIMIT\_STACK} & La massima dimensione dello stack del
+ \const{RLIMIT\_STACK} & La massima dimensione dello stack del
processo. Se il processo esegue operazioni che
estendano lo stack oltre questa dimensione
- riceverà un segnale di \macro{SIGSEGV}.\\
- \macro{RLIMIT\_CORE} & La massima dimensione di un file di \textit{core
+ riceverà un segnale di \const{SIGSEGV}.\\
+ \const{RLIMIT\_CORE} & La massima dimensione di un file di \textit{core
dump} creato da un processo. Nel caso le
dimensioni dovessero essere maggiori il file non
verrebbe generato.\footnotemark\\
- \macro{RLIMIT\_RSS} & L'ammontare massimo di memoria fisica dato al
+ \const{RLIMIT\_RSS} & L'ammontare massimo di memoria fisica dato al
processo. Il limite è solo una indicazione per
il kernel, qualora ci fosse un surplus di
memoria questa verrebbe assegnata.\\
- \macro{RLIMIT\_NPROC} & Il numero massimo di processi che possono essere
+ \const{RLIMIT\_NPROC} & Il numero massimo di processi che possono essere
creati sullo stesso user id. Se il limite viene
raggiunto \func{fork} fallirà con un
- \macro{EAGAIN}.\\
- \macro{RLIMIT\_NOFILE} & Il numero massimo di file che il processo può
+ \errcode{EAGAIN}.\\
+ \const{RLIMIT\_NOFILE} & Il numero massimo di file che il processo può
aprire. L'apertura di un ulteriore file fallirà
- con un errore \macro{EMFILE}.\\
- \macro{RLIMIT\_MEMLOCK}& L'ammontare massimo di memoria che può essere
+ con un errore \errcode{EMFILE}.\\
+ \const{RLIMIT\_MEMLOCK}& L'ammontare massimo di memoria che può essere
bloccata (vedi \secref{sec:proc_mem_lock}).\\
- \macro{RLIMIT\_AS} & La dimensione massima di tutta la memoria che il
+ \const{RLIMIT\_AS} & La dimensione massima di tutta la memoria che il
processo può ottenere. Se il processo tenta di
allocarne di più funzioni come \func{brk},
\func{malloc} o \func{mmap} falliranno. \\
\label{tab:sys_rlimit_values}
\end{table}
-\footnotetext{Settare questo limite a zero è la maniera più semplice per
+\footnotetext{Impostare questo limite a zero è la maniera più semplice per
evitare la creazione di \file{core} file.}
-È inoltre definita la costante \macro{RLIM\_INFINITY} che permette di
+È inoltre definita la costante \const{RLIM\_INFINITY} che permette di
sbloccare l'uso di una risorsa, ma solo un processo con i privilegi di
amministratore può innalzare un limite al di sopra del valore corrente del
limite massimo. Si tenga conto infine che tutti i limiti vengono ereditati dal
La gestione della memoria è già stata affrontata in dettaglio in
\secref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il
-meccanismo della memoria virtuale attraverso la divisione della memoria fisica
-in pagine.
+meccanismo della memoria virtuale\index{memoria virtuale} attraverso la
+divisione della memoria fisica in pagine.
In genere questo è del tutto trasparente al singolo processo, ma in certi
-casi, come per l'I/O mappato in memoria (vedi \ref{sec:file_memory_map}) che
-usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
+casi, come per l'I/O mappato in memoria (vedi \secref{sec:file_memory_map})
+che usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
dimensioni delle pagine usate dal kernel. Lo stesso vale quando si vuole
gestire in maniera ottimale l'interazione della memoria allocata con il
meccanismo della paginazione.
utilizzare una funzione.
In genere questa dimensione può essere ottenuta attraverso una chiamata a
-\func{sysconf} come \func{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
+\func{sysconf} come \code{sysconf(\_SC\_PAGESIZE)}, ma in BSD 4.2 è stata
introdotta una apposita funzione, \func{getpagesize}, che restituisce la
dimensione delle pagine di memoria; il suo prototipo è:
\begin{prototype}{unistd.h}{int getpagesize(void)}
sono previsti errori.}
\end{prototype}
-La funzione è prevista in SVr4, 4.4BSD e SUSv2, anche se questo ultimo
+La funzione è prevista in SVr4, BSD 4.4 e SUSv2, anche se questo ultimo
standard la etichetta come obsoleta, mentre lo standard POSIX 1003.1-2001 la
ha eliminata. In Linux è implementata come una system call nelle architetture
in cui essa è necessaria, ed in genere restituisce il valore del simbolo
-\macro{PAGE\_SIZE} del kernel, anche se le versioni delle librerie del C
+\const{PAGE\_SIZE} del kernel, anche se le versioni delle librerie del C
precedenti le \acr{glibc} 2.1 implementavano questa funzione restituendo
sempre un valore statico.
\end{functions}
Queste funzioni sono equivalenti all'uso della funzione \func{sysconf}
-rispettivamente con i parametri \macro{\_SC\_PHYS\_PAGES} e
-\macro{\_SC\_AVPHYS\_PAGES}. La prima restituisce il numero totale di pagine
+rispettivamente con i parametri \const{\_SC\_PHYS\_PAGES} e
+\const{\_SC\_AVPHYS\_PAGES}. La prima restituisce il numero totale di pagine
corrispondenti alla RAM della macchina; la seconda invece la memoria
effettivamente disponibile per i processi.
restituiscono il numero di processori della macchina (e quello dei processori
attivi); anche queste sono informazioni comunque ottenibili attraverso
\func{sysconf} utilizzando rispettivamente i parametri
-\macro{\_SC\_NPROCESSORS\_CONF} e \macro{\_SC\_NPROCESSORS\_ONLN}.
+\const{\_SC\_NPROCESSORS\_CONF} e \const{\_SC\_NPROCESSORS\_ONLN}.
Infine le \acr{glibc} riprendono da BSD la funzione \func{getloadavg} che
permette di ottenere il carico di processore della macchina, in questo modo è
\end{prototype}
La funzione restituisce in ciascun elemento di \param{loadavg} il numero medio
-di processi attivi sulla coda dello scheduler, calcolato su un diverso
-intervalli di tempo. Il numero di intervalli che si vogliono leggere è
-specificato da \param{nelem}, dato che nel caso di Linux il carico viene
-valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti), questo è
-anche il massimo valore che può essere assegnato a questo argomento.
+di processi attivi sulla coda dello scheduler\index{scheduler}, calcolato su
+un diverso intervalli di tempo. Il numero di intervalli che si vogliono
+leggere è specificato da \param{nelem}, dato che nel caso di Linux il carico
+viene valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti),
+questo è anche il massimo valore che può essere assegnato a questo argomento.
Viene misurato in \textit{clock tick}. Un tempo questo corrispondeva al
numero di interruzioni effettuate dal timer di sistema, adesso lo standard
POSIX richiede che esso sia pari al valore della costante
- \macro{CLOCKS\_PER\_SEC}, che deve essere definita come 1000000, qualunque
+ \const{CLOCKS\_PER\_SEC}, che deve essere definita come 1000000, qualunque
sia la risoluzione reale dell'orologio di sistema e la frequenza delle
interruzioni del timer.\footnote{quest'ultima, come accennato in
- \secref{sec:proc_hierarchy}, è invece data dalla costante \macro{HZ}.} Il
+ \secref{sec:proc_hierarchy}, è invece data dalla costante \const{HZ}.} Il
dato primitivo usato per questo tempo è \type{clock\_t}, che ha quindi una
risoluzione del microsecondo. Il numero di tick al secondo può essere
ricavato anche attraverso \func{sysconf} (vedi \secref{sec:sys_sysconf}). Il
- vecchio simbolo \macro{CLK\_TCK} definito in \file{time.h} è ormai
+ vecchio simbolo \const{CLK\_TCK} definito in \file{time.h} è ormai
considerato obsoleto.
\end{description}
La funzione restituisce il tempo in tick, quindi se si vuole il tempo in
secondi occorre moltiplicare il risultato per la costante
-\macro{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard ANSI C,
- POSIX richiede che \macro{CLOCKS\_PER\_SEC} sia definito pari a 1000000
+\const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard ANSI C,
+ POSIX richiede che \const{CLOCKS\_PER\_SEC} sia definito pari a 1000000
indipendentemente dalla risoluzione del timer di sistema.} In genere
\type{clock\_t} viene rappresentato come intero a 32 bit, il che comporta un
valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore
Legge il valore corrente del \textit{calendar time}.
\bodydesc{La funzione ritorna il valore del \textit{calendar time} in caso
- di successo e -1 in caso di errore, che può essere solo \macro{EFAULT}.}
+ di successo e -1 in caso di errore, che può essere solo \errval{EFAULT}.}
\end{prototype}
\noindent dove \param{t}, se non nullo, deve essere l'indirizzo di una
variabile su cui duplicare il valore di ritorno.
Analoga a \func{time} è la funzione \func{stime} che serve per effettuare
-l'operazione inversa, e cioè per settare il tempo di sistema qualora questo
+l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo
sia necessario; il suo prototipo è:
\begin{prototype}{time.h}{int stime(time\_t *t)}
- Setta a \param{t} il valore corrente del \textit{calendar time}.
+ Imposta a \param{t} il valore corrente del \textit{calendar time}.
\bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
- che può essere \macro{EFAULT} o \macro{EPERM}.}
+ che può essere \errval{EFAULT} o \errval{EPERM}.}
\end{prototype}
\noindent dato che modificare l'ora ha un impatto su tutto il sistema
il cambiamento dell'orologio è una operazione privilegiata e questa funzione
può essere usata solo da un processo con i privilegi di amministratore,
-altrimenti la chiamata fallirà con un errore di \macro{EPERM}.
+altrimenti la chiamata fallirà con un errore di \errcode{EPERM}.
Data la scarsa precisione nell'uso di \type{time\_t} (che ha una risoluzione
massima di un secondo) quando si devono effettuare operazioni sui tempi di
\funcdecl{int settimeofday(const struct timeval *tv, const struct timezone
*tz)}
- Setta il tempo di sistema.
+ Imposta il tempo di sistema.
\bodydesc{Entrambe le funzioni restituiscono 0 in caso di successo e -1 in
- caso di errore, nel qual caso \var{errno} può assumere il valori
- \macro{EINVAL} \macro{EFAULT} e per \func{settimeofday} anche
- \macro{EPERM}.}
+ caso di errore, nel qual caso \var{errno} può assumere i valori
+ \errval{EINVAL} \errval{EFAULT} e per \func{settimeofday} anche
+ \errval{EPERM}.}
\end{functions}
Queste funzioni utilizzano una struttura di tipo \var{timeval}, la cui
seguito) può essere utilizzata solo da un processo coi privilegi di
amministratore. Il secondo parametro di entrambe le funzioni è una struttura
\var{timezone}, che storicamente veniva utilizzata per specificare appunto la
-\textit{timezone}, cioè l'insieme del fuso orario e delle convenzioni per
+\textit{time zone}, cioè l'insieme del fuso orario e delle convenzioni per
l'ora legale che permettevano il passaggio dal tempo universale all'ora
locale. Questo parametro è obsoleto e in Linux non è mai stato utilizzato e
non è supportato né dalle vecchie \textsl{libc5}, né dalle \textsl{glibc}:
-pertanto deve essere sempre settato a \macro{NULL}.
+pertanto deve essere sempre impostato a \val{null}.
Modificare l'orologio di sistema con queste funzioni è comunque problematico,
in quanto esse effettuano un cambiamento immediato. Questo può creare dei
buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con
conseguenze indesiderate; ad esempio se si porta avanti l'orologio si possono
perdere delle esecuzioni di \cmd{cron} programmate nell'intervallo che si è
-saltato. Per questo motivo la modalità più corretta per settare l'ora è quella
-di usare la funzione \func{adjtime}, il cui prototipo è:
+saltato. Per questo motivo la modalità più corretta per impostare l'ora è
+quella di usare la funzione \func{adjtime}, il cui prototipo è:
\begin{prototype}{sys/time.h}
{int adjtime(const struct timeval *delta, struct timeval *olddelta)}
Aggiusta del valore \param{delta} l'orologio di sistema.
\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
- errore, nel qual caso \var{errno} assumerà il valore \macro{EPERM}.}
+ errore, nel qual caso \var{errno} assumerà il valore \errcode{EPERM}.}
\end{prototype}
Questa funzione permette di avere un aggiustamento graduale del tempo di
\bodydesc{La funzione restituisce lo stato dell'orologio (un valore $>0$) in
caso di successo e -1 in caso di errore, nel qual caso \var{errno}
- assumerà i valori \macro{EFAULT}, \macro{EINVAL} ed \macro{EPERM}.}
+ assumerà i valori \errval{EFAULT}, \errval{EINVAL} ed \errval{EPERM}.}
\end{prototype}
La funzione richiede una struttura di tipo \var{timex}, la cui definizione,
così come effettuata in \file{sys/timex.h}, è riportata in
\figref{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 \var{timex}, deve essere settato. Un
+specificato in un opportuno campo di \var{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
\secref{tab:sys_timex_mode}.
\textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \macro{ADJ\_OFFSET} & 0x0001 & Setta la differenza fra il tempo
+ \const{ADJ\_OFFSET} & 0x0001 & Imposta la differenza fra il tempo
reale e l'orologio di sistema, che
deve essere indicata in microsecondi
nel campo \var{offset} di
\var{timex}.\\
- \macro{ADJ\_FREQUENCY} & 0x0002 & Setta la differenze in frequenza
+ \const{ADJ\_FREQUENCY} & 0x0002 & Imposta la differenze in frequenza
fra il tempo reale e l'orologio di
sistema, che deve essere indicata
in parti per milione nel campo
\var{frequency} di \var{timex}.\\
- \macro{ADJ\_MAXERROR} & 0x0004 & Setta il valore massimo dell'errore
+ \const{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo
+ dell'errore
sul tempo, espresso in microsecondi
nel campo \var{maxerror} di
\var{timex}.\\
- \macro{ADJ\_ESTERROR} & 0x0008 & Setta la stima dell'errore
+ \const{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore
sul tempo, espresso in microsecondi
nel campo \var{esterror} di
\var{timex}.\\
- \macro{ADJ\_STATUS} & 0x0010 & Setta alcuni
+ \const{ADJ\_STATUS} & 0x0010 & Imposta alcuni
valori di stato interni usati dal
sistema nella gestione
dell'orologio specificati nel campo
\var{status} di \var{timex}.\\
- \macro{ADJ\_TIMECONST} & 0x0020 & Setta la larghezza di banda del PLL
- implementato dal kernel,
+ \const{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del
+ PLL implementato dal kernel,
specificato nel campo
\var{constant} di \var{timex}.\\
- \macro{ADJ\_TICK} & 0x4000 & Setta il valore dei tick del timer
+ \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei tick del timer
in microsecondi, espresso nel campo
\var{tick} di \var{timex}.\\
- \macro{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Setta uno spostamento una tantum
+ \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Imposta uno spostamento una tantum
dell'orologio secondo il valore del
campo \var{offset} simulando il
comportamento di \func{adjtime}.\\
Il valore delle costanti per \var{mode} può essere anche espresso, secondo la
sintassi specificata per la forma equivalente di questa funzione definita come
-\func{ntp\_adjtime}, utilizzando il prefisso \macro{MOD} al posto di
-\macro{ADJ}.
+\func{ntp\_adjtime}, utilizzando il prefisso \code{MOD} al posto di
+\code{ADJ}.
\begin{table}[htb]
\footnotesize
\textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \macro{TIME\_OK} & 0 & L'orologio è sincronizzato.\\
- \macro{TIME\_INS} & 1 & insert leap second.\\
- \macro{TIME\_DEL} & 2 & delete leap second.\\
- \macro{TIME\_OOP} & 3 & leap second in progress.\\
- \macro{TIME\_WAIT} & 4 & leap second has occurred.\\
- \macro{TIME\_BAD} & 5 & L'orologio non è sincronizzato.\\
+ \const{TIME\_OK} & 0 & L'orologio è sincronizzato.\\
+ \const{TIME\_INS} & 1 & insert leap second.\\
+ \const{TIME\_DEL} & 2 & delete leap second.\\
+ \const{TIME\_OOP} & 3 & leap second in progress.\\
+ \const{TIME\_WAIT} & 4 & leap second has occurred.\\
+ \const{TIME\_BAD} & 5 & L'orologio non è sincronizzato.\\
\hline
\end{tabular}
\caption{Possibili valori di ritorno di \func{adjtimex}.}
\tabref{tab:sys_adjtimex_return}. Un valore di -1 viene usato per riportare
un errore; al solito se si cercherà di modificare l'orologio di sistema
(specificando un \var{mode} diverso da zero) senza avere i privilegi di
-amministratore si otterrà un errore di \macro{EPERM}.
+amministratore si otterrà un errore di \errcode{EPERM}.
\subsection{La gestione delle date.}
Converte il \textit{broken-down time} in formato \type{time\_t}.
\bodydesc{Tutte le funzioni restituiscono un puntatore al risultato in caso
- di successo e \macro{NULL} in caso di errore, tranne che \func{mktime} che
+ di successo e \val{null} in caso di errore, tranne che \func{mktime} che
restituisce direttamente il valore o -1 in caso di errore.}
\end{functions}
\begin{verbatim}
"Wed Jun 30 21:49:08 1993\n"
\end{verbatim}
-e settano anche la variabile \var{tzname} con l'informazione della \textit{time
- zone} corrente; \func{ctime} è banalmente definita in termini di
+e impostano anche la variabile \var{tzname} con l'informazione della
+\textit{time zone} corrente; \func{ctime} è banalmente definita in termini di
\func{asctime} come \code{asctime(localtime(t)}. Dato che l'uso di una stringa
statica rende le funzioni non rientranti POSIX.1c e SUSv2 prevedono due
sostitute rientranti, il cui nome è al solito ottenuto appendendo un
permette di tenere conto anche della differenza fra tempo universale e ora
locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre
variabili globali mostrate in \figref{fig:sys_tzname}, cui si accede quando si
-include \file{time.h}. Queste variabili vengono settate quando si chiama una
+include \file{time.h}. Queste variabili vengono impostate quando si chiama una
delle precedenti funzioni di conversione, oppure invocando direttamente la
funzione \func{tzset}, il cui prototipo è:
\begin{prototype}{sys/timex.h}
{void tzset(void)}
- Setta le variabili globali della \textit{time zone}.
+ Imposta le variabili globali della \textit{time zone}.
\bodydesc{La funzione non ritorna niente e non dà errori.}
\end{prototype}
La funzione inizializza le variabili di \figref{fig:sys_tzname} a partire dal
-valore della variabile di ambiente \macro{TZ}, se quest'ultima non è definita
+valore della variabile di ambiente \const{TZ}, se quest'ultima non è definita
verrà usato il file \file{/etc/localtime}.
\begin{figure}[!htb]
\textbf{Modificatore} & \textbf{Esempio} & \textbf{Significato}\\
\hline
\hline
- \macro{\%a}&\texttt{Wed} & Nome del giorno, abbreviato.\\
- \macro{\%A}&\texttt{Wednesday} & Nome del giorno, completo.\\
- \macro{\%b}&\texttt{Apr} & Nome del mese, abbreviato.\\
- \macro{\%B}&\texttt{April} & Nome del mese, completo.\\
- \macro{\%c}&\texttt{Wed Apr 24 18:40:50 2002}& Data e ora.\\
- \macro{\%d}&\texttt{24} & Giorno del mese.\\
- \macro{\%H}&\texttt{18} & Ora del giorno, da 0 a 24.\\
- \macro{\%I}&\texttt{06} & Ora del giorno, da 0 a 12.\\
- \macro{\%j}&\texttt{114} & Giorno dell'anno.\\
- \macro{\%m}&\texttt{04} & Mese dell'anno.\\
- \macro{\%M}&\texttt{40} & Minuto.\\
- \macro{\%p}&\texttt{PM} & AM/PM.\\
- \macro{\%S}&\texttt{50} & Secondo.\\
- \macro{\%U}&\texttt{16} & Settimana dell'anno (partendo dalla
- domenica).\\
- \macro{\%w}&\texttt{3} & Giorno della settimana. \\
- \macro{\%W}&\texttt{16} & Settimana dell'anno (partendo dal
- lunedì).\\
- \macro{\%x}&\texttt{04/24/02} & La data.\\
- \macro{\%X}&\texttt{18:40:50} & L'ora.\\
- \macro{\%y}&\texttt{02} & Anno nel secolo.\\
- \macro{\%Y}&\texttt{2002} & Anno.\\
- \macro{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\
- \macro{\%\%}&\texttt{\%} & Il carattere \%.\\
+ \var{\%a}&\texttt{Wed} & Nome del giorno, abbreviato.\\
+ \var{\%A}&\texttt{Wednesday} & Nome del giorno, completo.\\
+ \var{\%b}&\texttt{Apr} & Nome del mese, abbreviato.\\
+ \var{\%B}&\texttt{April} & Nome del mese, completo.\\
+ \var{\%c}&\texttt{Wed Apr 24 18:40:50 2002}& Data e ora.\\
+ \var{\%d}&\texttt{24} & Giorno del mese.\\
+ \var{\%H}&\texttt{18} & Ora del giorno, da 0 a 24.\\
+ \var{\%I}&\texttt{06} & Ora del giorno, da 0 a 12.\\
+ \var{\%j}&\texttt{114} & Giorno dell'anno.\\
+ \var{\%m}&\texttt{04} & Mese dell'anno.\\
+ \var{\%M}&\texttt{40} & Minuto.\\
+ \var{\%p}&\texttt{PM} & AM/PM.\\
+ \var{\%S}&\texttt{50} & Secondo.\\
+ \var{\%U}&\texttt{16} & Settimana dell'anno (partendo dalla
+ domenica).\\
+ \var{\%w}&\texttt{3} & Giorno della settimana. \\
+ \var{\%W}&\texttt{16} & Settimana dell'anno (partendo dal
+ lunedì).\\
+ \var{\%x}&\texttt{04/24/02} & La data.\\
+ \var{\%X}&\texttt{18:40:50} & L'ora.\\
+ \var{\%y}&\texttt{02} & Anno nel secolo.\\
+ \var{\%Y}&\texttt{2002} & Anno.\\
+ \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\
+ \var{\%\%}&\texttt{\%} & Il carattere \%.\\
\hline
\end{tabular}
\caption{Valori previsti dallo standard ANSI C per modificatore della
In genere le funzioni di libreria usano un valore speciale per indicare che
c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la
-costante \macro{EOF} (a seconda della funzione); ma questo valore segnala solo
-che c'è stato un errore, non il tipo di errore.
+costante \val{EOF} (a seconda della funzione); ma questo valore segnala solo
+che c'è stato un errore, non il tipo di errore.
Per riportare il tipo di errore il sistema usa la variabile globale
\var{errno},\footnote{L'uso di una variabile globale può comportare alcuni
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 thread.} definita nell'header \file{errno.h}; la
-variabile è in genere definita come \ctyp{volatile} dato che può essere
-cambiata in modo asincrono da un segnale (si veda \ref{sec:sig_sigchld} per un
-esempio, ricordando quanto trattato in \ref{sec:proc_race_cond}), ma dato che
-un manipolatore di segnale scritto bene salva e ripristina il valore della
-variabile, di questo non è necessario preoccuparsi nella programmazione
+variabile è in genere definita come \direct{volatile} dato che può essere
+cambiata in modo asincrono da un segnale (si veda \secref{sec:sig_sigchld} per
+un esempio, ricordando quanto trattato in \secref{sec:proc_race_cond}), ma
+dato che un manipolatore di segnale scritto bene salva e ripristina il valore
+della variabile, di questo non è necessario preoccuparsi nella programmazione
normale.
I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
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
+\var{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 settato a zero all'avvio di un
-programma, gran parte delle funzioni di libreria settano \var{errno} ad un
+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
valore diverso da zero in caso di errore. Il valore è invece indefinito in
caso di successo, perché anche se una funzione ha successo, può chiamarne
altre al suo interno che falliscono, modificando così \var{errno}.
\param{errnum}.
\bodydesc{La funzione ritorna il puntatore alla stringa col messaggio di
- errore in caso di successo e \macro{NULL} in caso di errore, nel qual caso
- \var{errno} sarà settata a \macro{EINVAL} se si è specificato un numero di
- errore non valido.}
+ 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.}
\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 \macro{EINVAL}. La
+errore sconosciuto, e la funzione restituirà come errore \errcode{EINVAL}. La
funzione tiene conto del valore della variabile di ambiente
-\macro{LC\_MESSAGES} per usare eventuali traduzioni dei messaggi d'errore
+\val{LC\_MESSAGES} per usare eventuali traduzioni dei messaggi d'errore
nella localizzazione presente.
La funzione utilizza una stringa statica che non deve essere modificata dal
\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 man page), che
+ 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:
\begin{prototype}{string.h}
(compreso il terminatore) \param{size}.
\bodydesc{La funzione restituisce il puntatore alla stringa; in caso di
- errore \var{errno} oltre a \macro{EINVAL} può assumere anche il valore
- \macro{ERANGE} per indicare che non c'è sufficiente memoria per contenere
+ 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.}
\end{prototype}
\noindent
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
-\macro{NUL}.
+\param{size}, nel qual caso la stringa sarebbe troncata e terminata con uno
+zero (il carattere NUL).
Una seconda funzione usata per riportare i codici di errore in maniera
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 settata ad un valore diverso da zero fa si
+\var{error\_one\_per\_line}, che impostata ad un valore diverso da zero fa si
che errori relativi alla stessa linea non vengano ripetuti.