\const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
processo in contemporanea.\\
\const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
- \itindex{timezone} \textit{timezone} (vedi
+ \textit{timezone} (vedi
sez.~\ref{sec:sys_time_base})).\\
\const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
processo (vedi sez.~\ref{sec:proc_access_id}).\\
\const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
processo in contemporanea.\\
\const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una
- \itindex{timezone} \textit{timezone}
+ \textit{timezone}
(vedi sez.~\ref{sec:sys_date}). \\
\const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali
\textit{real-time} (vedi
che specifica la macro {FOPEN\_MAX}.\\
\texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}&
La dimensione massima di un nome di una
- \itindex{timezone} \texttt{timezone} (vedi
+ \texttt{timezone} (vedi
sez.~\ref{sec:sys_date}).\\
\texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}&
Massimo numero di gruppi supplementari che
all'interno di una stessa organizzazione, in modo da mantenere coerenti i
dati, ha portato anche alla necessità di poter recuperare e memorizzare dette
informazioni su supporti diversi dai file citati, introducendo il sistema del
-\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} (che
-tratteremo brevemente in sez.~\ref{sec:sock_resolver}) dato che la sua
-applicazione è cruciale nella procedura di risoluzione di nomi di rete.
+\textit{Name Service Switch} (che tratteremo brevemente in
+sez.~\ref{sec:sock_resolver}) dato che la sua applicazione è cruciale nella
+procedura di risoluzione 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
interrotto da un processo a priorità maggiore. I campi \var{ru\_inblock} e
\var{ru\_oublock} indicano invece il numero di volte che è stata eseguita una
attività di I/O su un filesystem (rispettivamente in lettura e scrittura) ed
-infine \var{ru\_maxrss} indica il valore più alto della
-\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size} raggiunto dal
-processo stesso o, nel caso sia stato usato \const{RUSAGE\_CHILDREN}, da uno
-dei suoi figli.
+infine \var{ru\_maxrss} indica il valore più alto della \textit{Resident Set
+ Size} raggiunto dal processo stesso o, nel caso sia stato usato
+\const{RUSAGE\_CHILDREN}, da uno dei suoi figli.
Si tenga conto che per un errore di implementazione nei i kernel precedenti il
2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1,
con un errore di \errcode{EFBIG}.
\item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di
- \itindex{file~locking} \textit{file lock} (vedi sez.~\ref{sec:file_locking})
- e di \textit{file lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un
- processo poteva effettuare. È un limite presente solo nelle prime versioni
- del kernel 2.4, pertanto non deve essere più utilizzato.
+ \textit{file lock} (vedi sez.~\ref{sec:file_locking}) e di \textit{file
+ lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un processo poteva
+ effettuare. È un limite presente solo nelle prime versioni del kernel 2.4,
+ pertanto non deve essere più utilizzato.
\item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare
massimo di memoria che può essere bloccata in RAM da un processo (vedi
\label{sec:sys_unix_time}
\itindbeg{calendar~time}
+\itindbeg{process~time}
Tradizionalmente nei sistemi unix-like sono sempre stati previsti due tipi
distinti di tempi, caratterizzati da altrettante modalità di misura ed
tradizionalmente misurato in secondi a partire dalla mezzanotte del
primo gennaio 1970, data che viene chiamata \textit{the Epoch}.
-\item[\textit{process time}] \itindex{process~time} detto anche \textsl{tempo
- di processore} o \textsl{tempo di CPU}. Si tratta del tempo impiegato da
- un processore nell'esecuzione del codice di un programma all'interno di un
- processo. Per esprimere questo tempo è stato riservato il tipo
- \type{clock\_t}, e viene misurato nei cosiddetti \itindex{clock~tick}
- \textit{clock tick}, tradizionalmente corrispondenti al numero di
- interruzioni del processore da parte del timer di sistema. A differenza del
- precedente indica soltanto un intervallo di durata.
+\item[\textit{process time}] detto anche \textsl{tempo di processore} o
+ \textsl{tempo di CPU}. Si tratta del tempo impiegato da un processore
+ nell'esecuzione del codice di un programma all'interno di un processo. Per
+ esprimere questo tempo è stato riservato il tipo \type{clock\_t}, e viene
+ misurato nei cosiddetti \textit{clock tick}, tradizionalmente corrispondenti
+ al numero di interruzioni del processore da parte del timer di sistema. A
+ differenza del precedente indica soltanto un intervallo di durata.
\end{basedescript}
Il \textit{calendar time} viene sempre mantenuto facendo riferimento
\itindend{calendar~time}
-Il \itindex{process~time} \textit{process time} invece indica sempre una
-misura di un lasso di tempo e viene usato per tenere conto dei tempi di
-esecuzione dei processi. Esso viene sempre diviso in \textit{user time} e
-\textit{system time}, per misurare la durata di ciascun processo il kernel
-infatti calcola tre tempi:
+Il \textit{process time} invece indica sempre una misura di un lasso di tempo
+e viene usato per tenere conto dei tempi di esecuzione dei processi. Esso
+viene sempre diviso in \textit{user time} e \textit{system time}, per misurare
+la durata di ciascun processo il kernel infatti calcola tre tempi:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
\item[\textit{clock time}] il tempo \textsl{reale}, viene chiamato anche
\textit{wall clock time} o \textit{elapsed time}, passato dall'avvio del
esegue un qualsiasi programma lanciando quest'ultimo come argomento del
comando \cmd{time}.
+\itindend{process~time}
\itindbeg{clock~tick}
Come accennato il \textit{process time} viene misurato nei cosiddetti
usato.
\constbeg{HZ}
+
In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il
cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e
facendo i conti in base al numero delle interruzioni generate dello stesso, i
Fino al kernel 2.6.21 la durata di un \textit{jiffy} costituiva la risoluzione
massima ottenibile nella misura dei tempi impiegabile in una \textit{system
call} (ad esempio per i timeout). Con il 2.6.21 e l'introduzione degli
-\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timers} (HRT) è
-divenuto possibile ottenere, per le funzioni di attesa ed i timer, la massima
-risoluzione possibile fornita dall'hardware. Torneremo su questo in
-sez.~\ref{sec:sig_timer_adv}.
+\textit{high-resolution timers} (HRT) è divenuto possibile ottenere, per le
+funzioni di attesa ed i timer, la massima risoluzione possibile fornita
+dall'hardware. Torneremo su questo in sez.~\ref{sec:sig_timer_adv}.
\itindend{clock~tick}
\subsection{La gestione del \textit{process time}}
\label{sec:sys_cpu_times}
-\itindbeg{process~time}
-
Di norma tutte le operazioni del sistema fanno sempre riferimento al
\textit{calendar time}, l'uso del \textit{process time} è riservato a
quei casi in cui serve conoscere i tempi di esecuzione di un processo
primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo
\type{clock\_t}.
-\itindend{process~time}
-
\subsection{Le funzioni per il \textit{calendar time}}
\label{sec:sys_time_base}
che continua a valere per qualunque funzione che vada a modificare l'orologio
di sistema, comprese tutte quelle che tratteremo in seguito.
+\itindbeg{timezone}
+
Il secondo argomento di entrambe le funzioni è una struttura
\struct{timezone}, che storicamente veniva utilizzata per specificare appunto
-la \itindex{timezone} \textit{timezone}, cioè l'insieme del fuso orario e
-delle convenzioni per l'ora legale che permettevano il passaggio dal tempo
+la cosiddetta \textit{timezone}, cioè l'insieme del fuso orario e delle
+convenzioni per l'ora legale che permettevano il passaggio dal tempo
universale all'ora locale. Questo argomento oggi è obsoleto ed in Linux non è
mai stato utilizzato; esso non è supportato né dalle vecchie \textsl{libc5},
né dalle \textsl{glibc}: pertanto quando si chiama questa funzione deve essere
sempre impostato a \val{NULL}.
+\itindbeg{timezone}
+
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
\code{ADJ}.
Si tenga presente infine che con l'introduzione a partire dal kernel 2.6.21
-degli \itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} ed
-il supporto per i cosiddetti POSIX \textit{real-time clock}, si può ottenere
-il \textit{calendar time} direttamente da questi, come vedremo in
-sez.~\ref{sec:sig_timer_adv}, con la massima risoluzione possibile per
-l'hardware della macchina.
+degli \textit{high-resolution timer} ed il supporto per i cosiddetti POSIX
+\textit{real-time clock}, si può ottenere il \textit{calendar time}
+direttamente da questi, come vedremo in sez.~\ref{sec:sig_timer_adv}, con la
+massima risoluzione possibile per l'hardware della macchina.
\end{Example}
Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione
-di una \itindex{timezone} \textit{timezone} e effettua una chiamata preventiva
-a \func{tzset} (che vedremo a breve), in modo che la data espressa tenga conto
-del fuso orario. In realtà \func{ctime} è banalmente definita in termini di
+di una \textit{timezone} e effettua una chiamata preventiva a \func{tzset}
+(che vedremo a breve), in modo che la data espressa tenga conto del fuso
+orario. In realtà \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
\includestruct{listati/time_zone_var.c}
\end{minipage}
\normalsize
- \caption{Le variabili globali usate per la gestione delle \itindex{timezone}
+ \caption{Le variabili globali usate per la gestione delle
\textit{timezone}.}
\label{fig:sys_tzname}
\end{figure}
Come accennato l'uso del \textit{broken-down time} permette di tenere conto
anche della differenza fra tempo universale e ora locale, compresa l'eventuale
ora legale. Questo viene fatto dalle funzioni di conversione grazie alle
-informazioni riguardo la propria \itindex{timezone} \textit{timezone}
-mantenute nelle tre variabili globali mostrate in fig.~\ref{fig:sys_tzname},
-cui si si può accedere direttamente includendo \headfile{time.h}. Come
-illustrato queste variabili vengono impostate internamente da alcune delle
-delle precedenti funzioni di conversione, ma lo si può fare esplicitamente
-chiamando direttamente la funzione \funcd{tzset}, il cui prototipo è:
+informazioni riguardo la propria \textit{timezone} mantenute nelle tre
+variabili globali mostrate in fig.~\ref{fig:sys_tzname}, cui si si può
+accedere direttamente includendo \headfile{time.h}. Come illustrato queste
+variabili vengono impostate internamente da alcune delle delle precedenti
+funzioni di conversione, ma lo si può fare esplicitamente chiamando
+direttamente la funzione \funcd{tzset}, il cui prototipo è:
\begin{funcproto}{
\fhead{time.h}
dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è
definita verrà usato il file \conffiled{/etc/localtime}. La variabile
\var{tzname} contiene due stringhe, che indicano i due nomi standard della
-\itindex{timezone} \textit{timezone} corrente. La prima è il nome per l'ora
-solare, la seconda per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname}
-sono indicate come \code{char *} non è il caso di modificare queste
-stringhe. La variabile \var{timezone} indica la differenza di fuso orario in
-secondi, mentre \var{daylight} indica se è attiva o meno l'ora legale.
+\textit{timezone} corrente. La prima è il nome per l'ora solare, la seconda
+per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come
+\code{char *} non è il caso di modificare queste stringhe. La variabile
+\var{timezone} indica la differenza di fuso orario in secondi, mentre
+\var{daylight} indica se è attiva o meno l'ora legale.
Benché la funzione \func{asctime} fornisca la modalità più immediata per
stampare un tempo o una data, la flessibilità non fa parte delle sue
\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 \itindex{timezone}
- \textit{timezone}.\\
+ \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\
\var{\%\%}&\texttt{\%} & Il carattere \%.\\
\hline
\end{tabular}
semplicemente usando un opportuno valore di ritorno della funzione invocata.
Inoltre il sistema di classificazione degli errori è stato progettato
sull'architettura a processi, e presenta una serie di problemi nel caso lo si
-debba usare con i \itindex{thread} \textit{thread}.
+debba usare con i \textit{thread}.
\subsection{La variabile \var{errno}}
Per riportare il tipo di errore il sistema usa la variabile globale
\var{errno}, definita nell'header \headfile{errno.h}. Come accennato l'uso di
-una variabile globale può comportare problemi nel caso dei \itindex{thread}
-\textit{thread}, ma lo standard ISO C consente anche di definire \var{errno}
-come un cosiddetto ``\textit{modifiable lvalue}'', cosa che consente di usare
-anche una macro, e questo è infatti il metodo usato da Linux per renderla
-locale ai singoli \itindex{thread} \textit{thread}.
+una variabile globale può comportare problemi nel caso dei \textit{thread}, ma
+lo standard ISO C consente anche di definire \var{errno} come un cosiddetto
+``\textit{modifiable lvalue}'', cosa che consente di usare anche una macro, e
+questo è infatti il metodo usato da Linux per renderla locale ai singoli
+\textit{thread}.
La variabile è in genere definita come \dirct{volatile} dato che può essere
cambiata in modo asincrono da un segnale, per un esempio si veda
modificata dal programma; essa è utilizzabile solo fino ad una chiamata
successiva a \func{strerror} o \func{perror} e nessun'altra funzione di
libreria tocca questa stringa. In ogni caso l'uso di una stringa statica rende
-la funzione non rientrante, per cui nel caso si usino i \itindex{thread}
-\textit{thread} la \acr{glibc} fornisce una apposita versione rientrante
-\funcd{strerror\_r}, il cui prototipo è:
+la funzione non rientrante, per cui nel caso si usino i \textit{thread} la
+\acr{glibc} fornisce una apposita versione rientrante \funcd{strerror\_r}, il
+cui prototipo è:
\begin{funcproto}{
\fhead{string.h}
le quali si rimanda alla lettura della pagina di manuale).
La funzione è analoga a \func{strerror} ma restituisce la stringa di errore
-nel buffer \param{buf} che il singolo \itindex{thread} \textit{thread} deve
-allocare autonomamente per evitare i problemi connessi alla condivisione del
-buffer statico. Il messaggio è copiato fino alla dimensione massima del
-buffer, specificata dall'argomento \param{size}, che deve comprendere pure il
+nel buffer \param{buf} che il singolo \textit{thread} deve allocare
+autonomamente per evitare i problemi connessi alla condivisione del buffer
+statico. Il messaggio è copiato fino alla dimensione massima del buffer,
+specificata dall'argomento \param{size}, che deve comprendere pure il
carattere di terminazione; altrimenti la stringa risulterà troncata.
Una seconda funzione usata per riportare i codici di errore in maniera