Finito, spero, con i tempi
[gapil.git] / system.tex
index 8b117142910ddc8788ecc267081272fbd9fcd01a..18cee493a4d73befeffd46495823ddb867ee9cd8 100644 (file)
@@ -1935,11 +1935,7 @@ effettuto.
 
 Linux poi prevede un'altra funzione, \func{adjtimex}, che consente un
 aggiustamento molto più dettagliato, permettendo ad esempio anche di
-modificare anche la velocità dell'orologio di sistema. La funzione utilizza il
-meccanismo di David L. Mills, descritto nell'RFC~1305, che è alla base del
-protocollo NTP; la funzione è specifica di Linux e non deve essere usata se la
-portabilità è un requisito, le \acr{glibc} provvedono anhe un suo omonimo
-\func{ntp\_adjtime}. Il suo prototipo è:
+modificare anche la velocità dell'orologio di sistema.  Il suo prototipo è:
 \begin{prototype}{sys/timex.h}
 {int adjtimex(struct timex *buf)} 
   
@@ -1947,7 +1943,7 @@ portabilit
   
   \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à il valore \macro{EPERM}.}
+    assumerà i valori \macro{EFAULT}, \macro{EINVAL} ed \macro{EPERM}.}
 \end{prototype}
 
 La funzione richiede una struttura di tipo \var{timex}, la cui definizione,
@@ -1991,11 +1987,15 @@ struct timex {
   \label{fig:sys_timex_struct}
 \end{figure}
 
-La trattazione completa di questa funzione necessita di una lettura
-approfondita del meccanismo descritto nell'RFC~1305, ci limitiamo a descrivere
-in \tabref{tab:sys_timex_mode} i principali valori utilizzabili, un elenco più
-dettagliato del significato dei vari campi può essere ritrovato in
-\cite{glibc}. 
+La funzione utilizza il meccanismo di David L. Mills, descritto nell'RFC~1305,
+che è alla base del protocollo NTP; la funzione è specifica di Linux e non
+deve essere usata se la portabilità è un requisito, le \acr{glibc} provvedono
+anche un suo omonimo \func{ntp\_adjtime}.  La trattazione completa di questa
+funzione necessita di una lettura approfondita del meccanismo descritto
+nell'RFC~1305, ci limitiamo a descrivere in \tabref{tab:sys_timex_mode} i
+principali valori utilizzabili per il campo \var{mode}, un elenco più
+dettagliato del significato dei vari campi della struttura \var{timex} può
+essere ritrovato in \cite{glibc}.
 
 \begin{table}[htb]
   \footnotesize
@@ -2046,14 +2046,183 @@ dettagliato del significato dei vari campi pu
   \label{tab:sys_timex_mode}
 \end{table}
 
-La funzione ritorna un valore positivo che esprime lo stato dell'orologio di
-sistema; questo può 
+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}.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|c| p{10cm}|}
+    \hline
+    \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.\\ 
+    \hline
+  \end{tabular}
+  \caption{Possibili valori di ritorno di \func{adjtimex}.} 
+  \label{tab:sys_adjtimex_return}
+\end{table}
 
+La funzione ritorna un valore positivo che esprime lo stato dell'orologio di
+sistema; questo può assumere i valori riportati in
+\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}.
 
 
 \subsection{La gestione delle date.}
 \label{sec:sys_date}
 
+Le funzioni viste al paragrafo precedente sono molto utili per trattare le
+operazioni elementari sui tempi, però le rappresentazioni del tempo ivi
+illustrate, se han senso per specificare un intervallo, non sono molto
+intuitive quando si deve esprimere un'ora o una data.  Per questo motivo è
+stata introdotta una ulteriore rappresentazione, detta \textit{broken-down
+  time}, che permette appunto di \textsl{suddividere} il \textit{calendar
+  time} usuale in ore, minuti, secondi, ecc.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct tm {
+        int     tm_sec;         /* seconds */
+        int     tm_min;         /* minutes */
+        int     tm_hour;        /* hours */
+        int     tm_mday;        /* day of the month */
+        int     tm_mon;         /* month */
+        int     tm_year;        /* year */
+        int     tm_wday;        /* day of the week */
+        int     tm_yday;        /* day in the year */
+        int     tm_isdst;       /* daylight saving time */
+        long int tm_gmtoff;     /* Seconds east of UTC.  */
+        cost char *tm_zone;     /* Timezone abbreviation.  */
+};
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \var{tm} per una rappresentazione del tempo in termini
+    di ora, minuti, secondi, ecc.}
+  \label{fig:sys_tm_struct}
+\end{figure}
+
+Questo viene effettuato attraverso una opportuna struttura \var{tm}, la cui
+definizione è riportata in \figref{fig:sys_tm_struct}, ed è in genere questa
+struttura che si utilizza quando si deve specificare un tempo a partire dai
+dati naturali (ora e data), dato che essa consente anche di trattare la
+gestione del fuso orario e dell'ora legale.\footnote{in realtà i due campi
+  \var{tm\_gmtoff} e \var{tm\_zone} sono estensioni previste per da BSD e
+  dalle \acr{glibc}, che, quando è definita \macro{\_BSD\_SOURCE}, hanno la
+  forma in \figref{fig:sys_tm_struct}.}
+
+Le funzioni per la gestione del \textit{broken-down time} sono varie e vanno
+da quelle usate per convertire gli altri formati in questo, usando o meno
+l'ora locale o il tempo universale, a quelle per trasformare il valore di un
+tempo in una stringa contenente data ed ora, i loro prototipi sono:
+\begin{functions}
+  \headdecl{time.h}
+  \funcdecl{char *asctime(const struct tm *tm)} 
+  Produce una stringa con data e ora partendo da un valore espresso in
+  \textit{broken-down time}.
+
+  \funcdecl{char *ctime(const time\_t *timep)} 
+  Produce una stringa con data e ora partendo da un valore espresso in
+  in formato \type{time\_t}.
+  
+  \funcdecl{struct tm *gmtime(const time\_t *timep)} 
+  Converte il \textit{calendar time} dato in formato \type{time\_t} in un
+  \textit{broken-down time} espresso in UTC.
+
+  \funcdecl{struct tm *localtime(const time\_t *timep)} 
+  Converte il \textit{calendar time} dato in formato \type{time\_t} in un
+  \textit{broken-down time} espresso nell'ora locale.
+
+  \funcdecl{time\_t mktime(struct tm *tm)}   
+  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
+  restitusce direttamente il valore o -1 in caso di errore.}
+\end{functions}
+
+Le prime due funzioni, \func{asctime} e \func{ctime} servono per poter
+stampare in forma leggibile un tempo; esse restituiscono il puntatore ad una
+stringa, allocata staticamente, nella forma:
+\begin{verbatim}
+"Wed Jun 30 21:49:08 1993\n"
+\end{verbatim}
+e settano anche la variabile \var{tzname} con l'infomazione 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
+\code{\_r}, che prendono un secondo parametro \code{char *buf}, in cui
+l'utente deve specificare il buffer su cui la stringa deve essere copiata
+(deve essere di almeno 26 caratteri).
+
+Le altre tre funzioni, \func{gmtime}, \func{localtime} e \func{mktime} servono
+per convertire il tempo dal formato \type{time\_t} a quello di \var{tm} e
+viceversa; \func{gmtime} effettua la conversione usando il tempo coordinato
+universale (UTC), cioè l'ora di Greenwich; mentre \func{localtime} usa l'ora
+locale; \func{mktime} esegue la conversione inversa.  
+
+Anche in questo caso le prime due funzioni restituiscono l'indirizzo di una
+struttura allocata staticamente, per questo sono state definite anche altre
+due versioni rientranti (con la solita estensione \code{\_r}), che prevedono
+un secondo parametro \code{struct tm *result}, fornito dal chiamante, che deve
+preallocare la struttura su cui sarà restituita la conversione.
+
+Come mostrato in \figref{fig:sys_tm_struct} il \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 attraverso le tre
+variabli globali mostrate in \figref{fig:sys_tzname}, cui si accede quando si
+include \file{time.h}. Queste variabili vengono settate 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}.
+  
+  \bodydesc{La funzione non ritorna niente e non dà errori.}
+\end{prototype}
+
+La funzione inizializza le varaibili di \figref{fig:sys_tzname} a partire dal
+valore della variabile di ambiente \macro{TZ}, se quest'ultima non è definita
+verrà usato il file \file{/etc/localtime}.
+
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+extern char *tzname[2];
+extern long timezone;
+extern int daylight;
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{Le variabili globali usate per la gestione delle \textit{time
+      zone}.}  
+  \label{fig:sys_tzname}
+\end{figure}
+
+La variabile \var{tzname} contiene due stringhe, che indicano i due nomi
+standard della \textit{time zone} corrente. La prima è il nome per l'ora
+solare, la seconda per l'ora legale.\footnote{anche se sono indicati 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. 
+
 
 
 \section{La gestione degli errori}
@@ -2068,7 +2237,7 @@ Esamineremo in questa sezione le sue caratteristiche principali.
 \subsection{La variabile \var{errno}}
 \label{sec:sys_errno}
 
-Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
+Quasi tutte le funzioni delle librerie del C sono in  grado di individuare e
 riportare condizioni di errore, ed è una buona norma di programmazione
 controllare sempre che le funzioni chiamate si siano concluse correttamente.