Aggiunta strftime.
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 21 May 2002 22:32:35 +0000 (22:32 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 21 May 2002 22:32:35 +0000 (22:32 +0000)
fileadv.tex
system.tex

index b930909f5271ca5ecee576483942a2f57a139e51..697a9416cf93005221f75de6979b84bcef1733eb 100644 (file)
@@ -1,11 +1,12 @@
 \chapter{I/O avanzato}
 \label{cha:file_advanced}
 
+In questo capitolo affronteremo le tematiche della gestione avanzata delle
+funzioni di input/ouput, prenderemo in esame il \textit{file locking}, la
+gestione dell'I/O non bloccante e multiplexato, per concludere con la gestione
+dei file mappati in memoria.
 
 
-\section{I/O non bloccante}
-\label{sec:file_noblocking}
-
 
 
 \section{File locking}
@@ -17,6 +18,9 @@
 \label{sec:file_mand_locking}
 
 
+\section{I/O non bloccante}
+\label{sec:file_noblocking}
+
 
 \section{I/O multiplexato}
 \label{sec:file_multiplexing}
index 1e5a20f878d802c0e87002f56354df4d592b8d25..4ce46aaf47452f58cf243a3364a34b508924a5ca 100644 (file)
@@ -317,7 +317,8 @@ relative spiegazioni, si pu
       contemporanea. Questo limite previsto anche dallo standard ANSI C, che
       specifica la macro {FOPEN\_MAX}.\\
       \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
-      La dimensione massima di un nome di una \texttt{timezone} (vedi ).\\
+      La dimensione massima di un nome di una \texttt{timezone} (vedi
+      \secref{sec:sys_date}).\\ 
       \texttt{\_SC\_NGROUPS\_MAX}&\macro{NGROUP\_MAX}&
       Massimo numero di gruppi supplementari che può avere un processo (vedi
       \secref{sec:proc_access_id}).\\ 
@@ -531,7 +532,7 @@ In generale si tenga presente che le dimensioni delle stringe di una
 \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}
-or \macro{UTSLEN} che possono avere valori diversi. Nel caso di Linux
+o \macro{UTSLEN} che possono avere valori diversi. 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
@@ -989,7 +990,7 @@ struct passwd {
 La struttura usata da entrambe le funzioni è allocata staticamente, per questo
 motivo viene sovrascritta ad ogni nuova invocazione, lo stesso dicasi per la
 memoria dove sono scritte le stringhe a cui i puntatori in essa contenuti
-fanno riferimento. Ovviamente questo implica che dette funzioni non posono
+fanno riferimento. Ovviamente questo implica che dette funzioni non possono
 essere rientranti, per cui ne esistono anche due versioni alternative
 (denotate dalla solita estensione \code{\_r}), i cui prototipi sono:
 \begin{functions}
@@ -1252,8 +1253,8 @@ riportati in \tabref{tab:sys_ut_type}, quando assume i valori
 \macro{RUN\_LVL}, \macro{BOOT\_TIME}, \macro{OLD\_TIME}, \macro{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à restiuita la prima voce
-corripondente al valore del campo \var{ut\_id} specificato in \param{ut}.
+\macro{USER\_PROCESS} o \macro{DEAD\_PROCESS} verrà restituita la prima voce
+corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}.
 
 \begin{table}[htb]
   \footnotesize
@@ -1309,7 +1310,7 @@ staticamente rende le funzioni di lettura non rientranti; per questo motivo le
 \acr{glibc} forniscono anche delle versioni rientranti: \func{getutent\_r},
 \func{getutid\_r}, \func{getutline\_r}, che invece di restituire un puntatore
 restituiscono un intero e prendono due argomenti aggiuntivi. Le funzioni si
-comportano esattamente come le analoge non rientranti, solo che restituiscono
+comportano esattamente come le analoghe non rientranti, solo che restituiscono
 il risultato all'indirizzo specificato dal primo argomento aggiuntivo (di tipo
 \code{struct utmp *buffer}) mentre il secondo (di tipo \code{struct utmp
   **result)} viene usato per restituire il puntatore allo stesso buffer.
@@ -1488,7 +1489,7 @@ sono:
   \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
     errore, nel qual caso \var{errno} viene settata ai valori:
     \begin{errlist}
-    \item[\macro{INVAL}] I valori per \param{resource} non sono validi.
+    \item[\macro{EINVAL}] I valori per \param{resource} non sono validi.
     \item[\macro{EPERM}] Un processo senza i privilegi di amministratore ha
     cercato di innalzare i propri limiti.
     \end{errlist}
@@ -1516,7 +1517,7 @@ specificarne i valori.
                               oltre questa dimensione riceverà un segnale di
                               \macro{SIGXFSZ}.\\
     \macro{RLIMIT\_DATA}   &  La massima dimensione della memoria dati di un
-                              processo. Il tentatico di allocare più memoria
+                              processo. Il tentativo di allocare più memoria
                               causa il fallimento della funzione di
                               allocazione. \\
     \macro{RLIMIT\_STACK}  &  La massima dimensione dello stack del
@@ -1626,7 +1627,7 @@ rispettivamente con i parametri \macro{\_SC\_PHYS\_PAGES} e
 corrispondenti alla RAM della macchina; la seconda invece la memoria
 effettivamente disponibile per i processi.
 
-Le \acr{glibc} supportano inoltre, come estenzioni GNU, due funzioni che
+Le \acr{glibc} supportano inoltre, come estensioni GNU, due funzioni che
 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
@@ -1754,7 +1755,7 @@ 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
-  indipendetemente dalla risoluzione del timer di sistema.} In genere
+  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
 riprenderà lo stesso valore iniziale.
@@ -1805,7 +1806,7 @@ ricevuto lo stato di terminazione, e lo stesso vale per \var{tms\_cstime}.
 Si tenga conto che l'aggiornamento di \var{tms\_cutime} e \var{tms\_cstime}
 viene eseguito solo quando una chiamata a \func{wait} o \func{waitpid} è
 ritornata. Per questo motivo se un processo figlio termina prima di ricevere
-lo stato di teminazione di tutti i suoi figli, questi processi ``nipoti'' non
+lo stato di terminazione di tutti i suoi figli, questi processi ``nipoti'' non
 verranno considerati nel calcolo di questi tempi.
 
 
@@ -1932,7 +1933,7 @@ di \param{delta} esprime il valore di cui si vuole spostare l'orologio; se 
 positivo l'orologio sarà accelerato per un certo tempo in modo da guadagnare
 il tempo richiesto, altrimenti sarà rallentato. Il secondo parametro viene
 usato, se non nullo, per ricevere il valore dell'ultimo aggiustamento
-effettuto.
+effettuato.
 
 Linux poi prevede un'altra funzione, \func{adjtimex}, che consente un
 aggiustamento molto più dettagliato, permettendo ad esempio anche di
@@ -2121,9 +2122,9 @@ definizione 
 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}.}
+  \var{tm\_gmtoff} e \var{tm\_zone} sono estensioni previste 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
@@ -2152,7 +2153,7 @@ tempo in una stringa contenente data ed ora, i loro prototipi sono:
   
   \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.}
+  restituisce direttamente il valore o -1 in caso di errore.}
 \end{functions}
 
 Le prime due funzioni, \func{asctime} e \func{ctime} servono per poter
@@ -2161,7 +2162,7 @@ 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
+e settano 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
@@ -2185,7 +2186,7 @@ preallocare la struttura su cui sar
 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
+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
 delle precedenti funzioni di conversione, oppure invocando direttamente la
 funzione \func{tzset}, il cui prototipo è:
@@ -2197,7 +2198,7 @@ funzione \func{tzset}, il cui prototipo 
   \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
+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
 verrà usato il file \file{/etc/localtime}.
 
@@ -2224,6 +2225,79 @@ solare, la seconda per l'ora legale.\footnote{anche se sono indicati come
 \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
+caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il
+gionrno) di un tempo si può ricorrere alla più sofisticata \func{strftime}, il
+cui prototipo è:
+\begin{prototype}{time.h}
+{size\_t strftime(char *s, size\_t max, const char *format, 
+  const struct tm *tm)}
+  
+Stampa il tempo \param{tm} nella stringa \param{s} secondo il formato
+\param{format}.
+  
+  \bodydesc{La funzione ritorna il numero di caratteri stampati in \param{s},
+  altrimenti restuisce 0.}
+\end{prototype}
+
+La funzione converte opportunamente il tempo \param{tm} in una stringa di
+testo da salvare in \param{s}, purché essa sia di dimensione, indicata da
+\param{size}, sufficiente. I caratteri generati dalla funzione vengono
+restituiti come valore di ritorno, ma non tengono conto del terminatore
+finale, che invece viene considerato nel computo della dimensione; se
+quest'ultima è eccessiva viene restituito 0 e lo stato di \param{s} è
+indefinito.
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|c|l|p{6cm}|}
+    \hline
+    \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 \%.\\ 
+    \hline
+  \end{tabular}
+  \caption{Valori previsti dallo standard ANSI C per modificatore della
+    stringa di formato di \func{strftime}.}  
+  \label{tab:sys_strftime_format}
+\end{table}
+
+Il risultato della funzione è controllato dalla stringa di formato
+\param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che
+viene utilizzato come modificatore; alcuni\footnote{per la precisione quelli
+  definiti dallo standard ANSI C, che sono anche quelli riportati da POSIX.1;
+  le \acr{glibc} provvedono tutte le estensioni introdotte da POSIX.2 per il
+  comando \cmd{date}, i valori introdotti da SVID3 e ulteriori estensioni GNU;
+  l'elenco completo dei possibili valori è riportato nella pagina di manuale
+  della funzione.} dei possibili valori che esso può assumere sono ripotati in
+\tabref{tab:sys_strftime_format}. La funzione tiene conto anche della presenza
+di una localizzazione per stampare in maniera adeguata i vari nomi.
 
 
 \section{La gestione degli errori}
@@ -2320,7 +2394,7 @@ thread 
   Analoga a \func{strerror} ma usa il buffer \param{buf} di lunghezza massima
   (compreso il terminatore) \param{size}.
   
-  \bodydesc{La funzione restitusce il puntatore alla stringa; in caso di
+  \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
     la stringa di descrizione.}
@@ -2406,7 +2480,7 @@ Le precedenti funzioni sono quelle definite ed usate nei vari standard; le
 forniscono alcune funzionalità aggiuntive per una gestione degli errori
 semplificata e più efficiente. 
 
-La prima estenzione consiste in due variabili, \code{char *
+La prima estensione consiste in due variabili, \code{char *
   program\_invocation\_name} e \code{char * program\_invocation\_short\_name}
 servono per ricavare il nome del programma; queste sono utili quando si deve
 aggiungere il nome del programma (cosa comune quando si ha un programma che