Sistemato HTML del sito, quasi completato l'I/O asincrono
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 29 Jul 2002 17:34:59 +0000 (17:34 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 29 Jul 2002 17:34:59 +0000 (17:34 +0000)
fileadv.tex
gapil.tex
html/index.html
html/stampa.html

index 578f867..a0c5f05 100644 (file)
@@ -424,7 +424,7 @@ struct aiocb
 
 Le operazioni di I/O asincrono possono essere effettuate solo su un file già
 aperto, il cui file descriptor deve essere specificato tramite il campo
-\var{aio\_fildes}; il file deve inolte supportare la funzione \func{lseek},
+\var{aio\_fildes}; il file deve inoltre supportare la funzione \func{lseek},
 pertanto terminali e pipe sono esclusi. Non c'è limite al numero di operazioni
 contemporanee effettuabili su un singolo file.
 
@@ -444,9 +444,9 @@ da quella del processo chiamante (vedi \secref{sec:proc_priority}), cui viene
 sottratto il valore di questo campo.
 
 Il campo \var{aio\_lio\_opcode} è usato dalla funzione \func{lio\_listio}, che
-permette di attivare far partire una serie di operazioni in contemporanea su
-una lista di file. Tramite questo campo si specifica quale è la natura di
-ciascuna di esse.
+permette di far partire una serie di operazioni in contemporanea su una lista
+di file. Tramite questo campo si specifica quale è la natura di ciascuna di
+esse.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -463,50 +463,283 @@ struct sigevent
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \type{sigevent}, usata per .}
+  \caption{La struttura \type{sigevent}, usata per specificare le modailtà di
+    notifica degli eventi relativi alle operazioni di I/O asincrono.}
   \label{fig:file_sigevent}
 \end{figure}
 
-Infine il campo \var{aio\_sigevent} serve a specificare il modo in cui si
-vuole che la notifica del completamento delle operazioni richieste venga
-effettuata. La struttura è riportata in \secref{fig:file_sigevent}; il campo
-\var{sigev\_notify} è quello che indica le modalità della notifica, esso può
-assumere i tre valori:
+Infine il campo \var{aio\_sigevent} è una struttura di tipo \type{sigevent}
+che serve a specificare il modo in cui si vuole che venga effettuata la
+notifica del completamento delle operazioni richieste. La struttura è
+riportata in \secref{fig:file_sigevent}; il campo \var{sigev\_notify} è quello
+che indica le modalità della notifica, esso può assumere i tre valori:
 \begin{basedescript}{\desclabelwidth{3.0cm}}
 \item[\macro{SIGEV\_NONE}]   Non viene inviata nessuna notifica.
-\item[\macro{SIGEV\_SIGNAL}] La notifica viene effettuata usando il segnale
-  specificato nel campo \var{sigev\_signo}.
+\item[\macro{SIGEV\_SIGNAL}] La notifica viene effettuata inviando al processo
+  chiamante il segnale specificato nel campo \var{sigev\_signo}, se il
+  manipolatore è installato con \macro{SA\_SIGINFO}, il gli verrà restituito
+  il valore di \var{sigev\_value} in come valore del campo \var{si\_value} per
+  \type{siginfo\_t}.
 \item[\macro{SIGEV\_THREAD}] La notifica viene effettuata creando un nuovo
   thread che esegue la funzione specificata da \var{sigev\_notify\_function},
   con gli attributi specificati da \var{sigev\_notify\_attribute}.
 \end{basedescript}
 
-
-Le due funzioni principali dell'interfaccia sono quelle per la lettura e
-scrittura, \func{aio\_read} e \func{aio\_write}, i cui prototipi sono:
+Le due funzioni base dell'interfaccia POSIX.1b per l'I/O asincrono sono
+\func{aio\_read} e \func{aio\_write}.  Esse servono a richiedere una lettura
+od una scrittura asincrona di dati usando la struttura \type{aiocb} appena
+descritta; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{aio.h}
 
   \funcdecl{int aio\_read(struct aiocb *aiocbp)}
-  Richiede una lettura asincrona sul file specificato tramite \param{aiocbp}.
+  Richiede una lettura asincrona secondo quanto specificato con \param{aiocbp}.
 
   \funcdecl{int aio\_write(struct aiocb *aiocbp)}
-  Richiede una scrittura asincrona sul file specificato tramite
+  Richiede una scrittura asincrona secondo quanto specificato con
   \param{aiocbp}.
   
   \bodydesc{Le funzioni restituiscono 0 in caso di successo, e -1 in caso di
     errore, nel qual caso \var{errno} viene settata ai valori:
   \begin{errlist}
-  \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
-    degli insiemi.
-  \item[\macro{ENOSYS}] La funzione è implementata.
-  \item[\macro{EINVAL}] Si è specificato un valore negativo non valido per i
-    campi \var{aio\_offset} o \var{aio\_reqprio}, di \param{aiocbp}.
+  \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato.
+  \item[\macro{ENOSYS}] La funzione non è implementata.
+  \item[\macro{EINVAL}] Si è specificato un valore non valido per i campi
+    \var{aio\_offset} o \var{aio\_reqprio} di \param{aiocbp}.
+  \item[\macro{EAGAIN}] La coda delle richieste è momentaneamente piena.
   \end{errlist}
-  ed inoltre \macro{ENOMEM}.}
-
+}
 \end{functions}
 
+Entrambe le funzioni ritornano immediatamente dopo aver messo in coda la
+richiesta, o in caso di errore. Non è detto che gli errori \macro{EBADF} ed
+\macro{EINVAL} siano rilevati immediatamente al momento della chiamata,
+potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e
+scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che
+il file non sia stato aperto in \textit{append mode} (vedi
+\secref{sec:file_open}), nel qual caso le scritture vengono effettuate
+comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}.
+
+Si tenga inoltre presente che deallocare la memoria indirizzata da
+\param{aiocbp} o modificarne i valori prima della conclusione di una
+operazione può dar luogo a risultati impredicibili, perché l'accesso ai vari
+campi per eseguire l'operazione può avvenire in un momento qualsiasi dopo la
+richiesta.  Questo comporta che occorre evitare di usare per \param{aiocbp}
+variabili automatiche, effettuando le chiamate all'interno di una subroutine,
+e che non si deve riutilizzare la stessa struttura per un'ulteriore operazione
+fintanto che la precedente non si sia ultimata. In generale per ogni
+operazione di I/O asincrono si deve utilizzare una ed una sola struttura
+\type{aiocb}.
+
+Si ricordi che, operando in modalità asincrona, il successo di queste funzioni
+non implica che le operazioni richieste siano state effettivamente eseguite in
+maniera corretta.  Per verificare l'esito delle operazioni l'interfaccia
+prevede altre due funzioni, che permettono di controllare lo stato di
+esecuzione. La prima è \func{aio\_error}, che serve a determinare un eventuale
+stato di errore; il suo prototipo è:
+\begin{prototype}{aio.h}
+  {int aio\_error(const struct aiocb *aiocbp)}  
+
+  Determina lo stato di errore delle operazioni di I/O associate a
+  \param{aiocbp}.
+  
+  \bodydesc{La funzione restituisce 0 se le operazioni si sono concluse con
+    successo, altrimenti restituisce il codice di errore.}
+% }, che viene salvato  
+%     anche in \var{errno}, i valori possibili sono:
+%   \begin{errlist}
+%   \item[\macro{ENOSYS}] La funzione non è implementata.
+%   \item[\macro{EINPROGRESS}] L'operazione è ancora in corso.
+%   \item[\macro{EINVAL}] Si è specificato un valore non valido per i campi
+%     \var{aio\_offset} o \var{aio\_reqprio} di \param{aiocbp}.
+%   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato.
+%   \end{errlist}
+%   più tutti quelli possibili per le sottostanti operazioni, .}
+\end{prototype}
+
+Se l'operazione non si è ancora completata viene restituito l'errore di
+\macro{EINPROGRESS}. La funzione ritorna zero quando l'operazione si è
+conclusa con successo, altrimenti restituisce il codice di errore, ed esegue
+il settaggio di \var{errno}. In caso caso di errore esso può essere sia uno
+dei precedentemente specificati \macro{EINVAL} ed \macro{EBADF}, dovuti ad un
+valore errato per \param{aiocbp} che uno dei possibili errori dovuti alle
+chiamate al sistema sottostanti l'esecuzione dell'operazione di I/O richiesta,
+relativi alle funzioni \func{read}, \func{write} e \func{fsync}.
+
+
+Una volta che si sia certi che le operazioni si siano concluse (cioè dopo che
+una chiamata ad \func{aio\_error} non ha restituito \macro{EINPROGRESS}, si
+può usare la seconda funzione dell'interfaccia, \func{aio\_return}, per
+verificare il completamento delle operazioni di I/O asincrono, il cui
+prototipo è:
+\begin{prototype}{aio.h}
+{ssize\_t aio\_return(const struct aiocb *aiocbp)} 
+
+Recupera il valore dello stato di ritorno delle operazioni di I/O associate a
+\param{aiocbp}.
+  
+\bodydesc{La funzione restituisce lo stato di uscita dell'operazione
+  eseguita.}
+\end{prototype}
+
+La funzione deve essere chiamata una sola volte per ciascuna operazione
+asincrona, essa infatti fa sì che il sistema rilasci le risorse associate a
+ciascuna operazione. Per questo motivo occorre chiamare la funzione solo dopo
+che l'operazione cui \param{aiocbp} fa riferimento si è completata. 
+
+La funzione restituisce il valore di ritorno relativa all'operazione eseguita,
+così come ricavato dalla sottostante system call (il numero di byte letti,
+scritti o il valore di ritorno di \func{fsync}).  É importante chiamare sempre
+questa funzione, altrimenti le risorse disponibili per le operazioni di I/O
+asincrono non verrebbero liberate, rischiando di arrivare ad un loro
+esaurimento.
+
+Oltre alle operazioni di lettura e scrittura l'interfaccia POSIX.1b mette a
+disposizione un'altra operazione, quella di sincronizzazione delll'I/O, essa è
+compiuta dalla funzione \func{aio\_fsync}, che ha lo stesso effetto della
+analoga \func{fsync}, ma viene esguita in maniera asincrona; il suo prototipo
+è:
+\begin{prototype}{aio.h}
+{ssize\_t aio\_return(int op, struct aiocb *aiocbp)} 
+
+Richiede la sincronizzazione dei dati per il file indicato da \param{aiocbp}.
+  
+\bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+  errore, che può essere, con le stesse modalità di \func{aio\_read},
+  \macro{EAGAIN}, \macro{EBADF} o \macro{EINVAL}.}
+\end{prototype}
+
+La funzione richiede la sincronizzazione delle operazioni di I/O, essendo la
+richiesta asincrona, ritornando immediatamente. L'esecuzione effettiva della
+sincronizzazione dovrà essere verificata con \func{aio\_error} e
+\func{aio\_return} come per le operazioni di lettura e scrittura. L'argomento
+\param{op} permette di indicare la modalità di esecuzione, se si specifica il
+valore \macro{O\_DSYNC} le operazioni saranno completate con una chiamata a
+\func{fdatasync}, se si specifica \macro{O\_SYNC} con una chiamata a
+\func{fsync} (vedi \secref{sec:file_sync}).
+
+Il successo della chiamata assicura la sincronizzazione delle operazioni fino
+allora richieste, niente è garantito riguardo la sincronizzazione dei dati
+relativi ad eventuali operazioni richieste successivamente. Se si è
+specificato un meccanismo di notifica questo sarà innescato una volta che le
+operazioni di sincronizzazione dei dati saranno completate.
+
+In alcuni casi può essere necessario interrompere le operazioni (in genere
+quando viene richiesta un'uscita immediata dal programam), per questo lo
+standard POSIX.1b prevede una funzioni apposita, \func{aio\_cancel}, che
+permette di cancellare una operazione richiesta in precedenza; il suo
+prototipo è:
+\begin{prototype}{aio.h}
+{int aio\_cancel(int fildes, struct aiocb *aiocbp)} 
+
+Richiede la cancellazione delle operazioni sul file \param{fildes} specificate
+da \param{aiocbp}.
+  
+\bodydesc{La funzione restituisce il risultato dell'operazione con un codice
+  di positivo, e -1 in caso di errore, che avviene qualora si sia specificato
+  un valore non valido di \param{fildes}, setta \var{errno} al valore
+  \macro{EBADF}.}
+\end{prototype}
+
+La funzione permette di cancellare una operazione specifica sul file
+\param{fildes}, o tutte le operazioni pendenti, specificando \macro{NULL} come
+valore di \param{aiocbp}.  Quando una operazione viene cancellata
+\func{aio\_error} riporterà \macro{ECANCELED} come codice di errore, ed il suo
+codice di ritorno sarà -1, inoltre il meccanismo di notifica non verrà
+invocato.
+
+I possibili valori di ritorno di \func{aio\_cancel} sono tre:
+\macro{AIO\_ALLDONE} indica che le operazioni di cui si è richiesta la
+cancellazione sono state già completate, \macro{AIO\_CANCELED} indica che
+tutte le operazioni richieste sono state cancellate, e
+\macro{AIO\_NOTCANCELED} che alcune delle operazioni erano in corso e non sono
+state cancellate.  
+
+In quest'ultimo caso occorre chiamare \func{aio\_error} per determinare quali
+sono le operazioni cancellate. Le operazioni che non sono state cancellate
+proseguono il loro corso normale, compreso quanto relativo al meccanismo di
+notifica del loro avvenuto completamento.
+
+Benché l'I/O asincrono preveda un meccanismo di notifica, che permette di
+bloccare un processo in maniera relativamente semplice fino al completamento
+di una determinata operazione, lo standard fornisce anche una apposita
+funzione, \func{aio\_suspend}, che permette di sospendere l'esecuzione di un
+processo fino al completamento di una specifica operazione; il suo prototipo
+è:
+\begin{prototype}{aio.h}
+{int aio\_suspend(const struct aiocb * const list[], int nent, const struct
+    timespec *timeout)}
+  
+  Attende, per un massimo di \param{timeout}, il completamento di una delle
+  operazioni specificate da \param{list}.
+  
+  \bodydesc{La funzione restituisce 0 se una (o più) operazioni sono state
+    completate, e -1 in caso di errorem nel qual caso \var{errno} viene
+    settata ai valori:
+    \begin{errlist}
+    \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
+      \param{timeout}.
+    \item[\macro{ENOSYS}] La funzione non è implementata.
+    \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
+    \end{errlist}
+  }
+\end{prototype}
+
+La funzione permette di bloccare il processo chiamante fintanto che almeno una
+delle \param{nent} operazioni specificate nella lista \param{list} è
+completata, per un tempo massimo specificato da \param{timout}, o fintanto che
+non arrivi un segnale.\footnote{si tenga conto che questo segnale può anche
+  essere quello utilizzato come meccanismo di notifica.} La lista deve essere
+inizializzata con delle strutture \var{aiocb} relative ad operazioni
+effettivamente richieste, ma può contenere puntatori nulli, che saranno
+ignorati. In caso si siano specificati valori non validi l'effetto è
+indefinito.  Un valore \macro{NULL} per \param{timout} comporta una attesa
+infinita.
+
+Lo standard infine ha previsto pure una funzione, \func{lio\_listio}, che
+permette di effettuare la richiesta di una intera lista di operazioni di
+lettura o scrittura; il suo prototipo è: 
+\begin{prototype}{aio.h}
+  {int lio\_listio(int mode, struct aiocb * const list[], int nent, struct
+    sigevent *sig)}
+  
+  Richiede l'esecuzione delle operazioni di I/O elencata da \param{list},
+  secondo la modalità \param{mode}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
+    errorem nel qual caso \var{errno} viene settata ai valori:
+    \begin{errlist}
+    \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
+      \param{timeout}.
+    \item[\macro{ENOSYS}] La funzione non è implementata.
+    \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
+    \end{errlist}
+  }
+\end{prototype}
+
+La funzione esegue la richiesta delle \param{nent} operazioni indicate dalla
+lista \param{list}; questa deve contenere gli indirizzi di altrettanti control
+block, opportunamente inizializzati; in particolare nel caso dovrà essere
+specificato il tipo di operazione tramite il campo \var{aio\_lio\_opcode}, che
+può prendere i tre valori:
+\begin{description*}
+\item[\macro{LIO\_READ}]  richiede una operazione di lettura.
+\item[\macro{LIO\_WRITE}] richiede una operazione di scrittura.
+\item[\macro{LIO\_NOP}] non effettua nessuna operazione.
+\end{description*}
+l'ultimo viene usato quando si ha a che fare con un vettore di dimensione
+fissa, per poter specificare solo alcune operazioni, o quando si è dovuto
+cancellare delle operazioni e si deve ripetere la richiesta per quelle non
+completate.
+
+L'argomento \param{mode} permette di stabilire il comportamento della
+funzione, se viene specificato il valore \macro{LIO\_WAIT} la funzione si
+blocca fino al completamento di tutte le operazioni richieste; se invece si
+spercifica \macro{LIO\_NOWAIT} la funzione ritorna immediatamente dopo aver
+messo in coda tutte le richieste. In questo caso il chiamante può richiedere
+una notifica del completamento di tutte le richieste settando \param{sig}. 
+
+
 
 
 \subsection{I/O multiplo}
index 8e59179..2eeaa99 100644 (file)
--- a/gapil.tex
+++ b/gapil.tex
@@ -21,8 +21,8 @@
 \usepackage{listings}
 \lstloadlanguages{C++}
 \usepackage{color} 
-%\usepackage{mdwlist}              % scommentare per la stampa (PS e PDF)
-%\usepackage{boxedminipage}        % scommentare per la stampa (PS e PDF)
+\usepackage{mdwlist}              % scommentare per la stampa (PS e PDF)
+\usepackage{boxedminipage}        % scommentare per la stampa (PS e PDF)
 %\usepackage{footnote} 
 %\usepackage{mdwtab} 
 %
@@ -73,7 +73,7 @@
 \tableofcontents
 \clearemptydoublepage
 
-\include{compatib}    % commentare per la stampa PS e PDF
+%\include{compatib}    % commentare per la stampa PS e PDF
 
 \include{macro}
 \setcounter{secnumdepth}{-2}
index b8e3e11..33fbd2c 100644 (file)
 <HTML>
-<HEAD>
+  <HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
-   <TITLE>GaPiL -- Guida alla Programmazione in Linux</TITLE>
-<style type="text/css">
+    <TITLE>GaPiL -- Guida alla Programmazione in Linux</TITLE>
+    <style type="text/css">
 <!--
  a {text-decoration: none;}
  td {font-family: sans-serif}
 -->
-</style>
-</HEAD>
-<BODY link="mediumslateblue" vlink="mediumblue" alink="red" bgcolor="white">
-
-<table cellspacing=0 cellpadding=0 border=0 width=900>
-<tr>
-<td><img src="gapil.png" width="160" border=0 align=right></td>
-<td valign=bottom align=left height=125 width=400 bgcolor="white">
-
-<table cellspacing=10><tr><td>
-<font face="sans-serif" size="+4" color="darkred" style="font-size: 22pt"><b>
-Guida alla Programmazione in Linux<br>
-<font color="midnightblue">Simone Piccardi</b></font>
-</table>
-
-<table width=750 align="left" border=0 cellpadding=3 cellspacing=0 
-bgcolor="#dddddd"><tr>
-<td width=80 align="center"><A target="_parent"  HREF="index.html">
-<font face="sans-serif"><b>Home</b></font></A> </td> 
-<td width=150 align="center"><A target="_parent"  HREF="stampa.html">
-<font face="sans-serif"><b>Download</b></font></A>
-<td width=150 align="center"><A target="_parent"  href="html/index.html">
-<font face="sans-serif"><b>Versione online</b></font></A> </td>
-<td width=150 align="center"><A target="_parent"  HREF="http://cvs.firenze.linux.it/cgi-bin/viewcvs.cgi/gapil/">
-<font face="sans-serif"><b>CVS</b></font></A> </td>
-</table>
-
-</td>
-</tr></table>
+    </style>
+  </HEAD>
+  <BODY link="mediumslateblue" vlink="mediumblue" alink="red" bgcolor="white">
+
+    <table cellspacing=0 cellpadding=0 border=0 width=800>
+      <tbody>
+       <tr>
+         <td width="170" align=center>
+           <img src="gapil.png" width="160" border=0>
+         </td>
+         <td valign=bottom align=left bgcolor="white">
+           <table cellspacing=0>
+               <tr>
+                 <td>
+                   <font face="sans-serif" size="+4" 
+                     color="darkred" style="font-size: 22pt">
+                     <b>Guida alla Programmazione in Linux</b>
+                     <br>
+                     <font color="midnightblue">
+                       <b>Simone Piccardi</b>
+                     </font>
+                   </font>
+                 </td>
+               </tr>
+           </table>
+       </tr>
+      </tbody>
+    </table>
+
+    <table width="790" cellspacing="0" cellpadding="3" border="0">
+      <tbody>
+         <td width=164 align="center" >
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  HREF="index.html">
+             <font face="sans-serif">
+               <b>Home</b>
+             </font>
+           </A> 
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  href="stampa.html">
+             <font face="sans-serif">
+               <b>Download</b>
+             </font>
+           </A> 
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  HREF="html/index.html">
+             <font face="sans-serif" color="darkred">
+               <b>Versione online</b>
+             </font>
+           </A>
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  
+             HREF="http://cvs.firenze.linux.it/cgi-bin/viewcvs.cgi/gapil/">
+             <font face="sans-serif">
+               <b>CVS</b>
+             </font>
+           </A> 
+         </td>
+       </tr>
+      </tbody>
+    </table>
 
 <!-- CUT HERE -->
-<table width="920" cellspacing="10" cellpadding="10" border="0">
-<tbody><tr>
-<td width="125" valign="top"><b>
-<font color="#0000aa">
-
-</font>
-</b></td>
-
-<tr>
-<td width="125" valign="top"><b>
-
-<font color="#0000aa">
-Il progetto
-</font>
-
-</b></td>
-
-<td bgcolor="lightblue"> 
-
-<p> <b>GaPiL</b> nasce dalla mia convinzione profonda che la <A
-HREF="http://www.gnu.org/philosophy/philosophy.it.html">filosofia</a> che
-ispira il software libero si applichi anche ad altri campi che non siano
-necessariamente quelli della scrittura di programmi per computer. In
-particolare ritengo che possa assumere una grande rilevanza in ambiti come
-quelli dell'educazione e della formazione.  
-
-<p>Ma se trovare della buona documentazione libera, specie per quanto riguarda
-i programmi che girano sul sistema GNU/Linux, è ormai relativamente facile, la
-produzione di buoni testi didattici è ancora molto limitata, soprattutto se li
-si cerca in lingua italiana.</P>
-
-<p> <b>GaPiL</b> è un tentativo di scrivere un manuale di programmazione di
-sistema per Linux e le GNU libc.  L'obiettivo è quello di riuscire a produrre
-una testo rilasciato sotto <A HREF="http://www.gnu.org/copyleft/fdl.html">GNU
-FDL</a>, che possa servire a chi si accosta per la prima volta alla
-programmazione di sistema sotto Unix, con la speranza di poter un giorno
-raggiungere la qualità dei testi del compianto R. W. Stevens. <P>
-
-</td>
-</tr>
-
-<tr>
-<td width="125" valign="top"><b>
-
-<font color="#0000aa">
-News
-</font>
-
-</b></td>
-
-<td bgcolor="lightblue"> 
-
-<b>3 - luglio - 2002</b><br> Prima versione del sito, con rilascio della prima
-      versione di GaPiL in un HTML decente.
-<p>
-<b>22 - luglio - 2002</b><br> Nuova versione, aggiunte su I/O avanzato, IPC, 
-segnali real-time.
-
-
-</td>
-
-
-
-</tr>
-
-
-
-
-</tbody></table>
-                                
-
+    <table width="800" cellspacing="10" cellpadding="10" border="0">
+      <tbody>
+       <tr>
+         <td width="130" valign="top"><b>
+             <font color="#0000aa">
+               Il progetto
+             </font>
+           </b>
+         </td>
+         <td bgcolor="lightblue"> 
+           
+           <p> <b>GaPiL</b> nasce dalla mia convinzione profonda che la <A
+               HREF="http://www.gnu.org/philosophy/philosophy.it.html">
+               "filosofia"</a> che ispira il software libero si applichi
+               anche ad altri campi che non siano necessariamente quelli
+               della scrittura di programmi per computer. In particolare
+               ritengo che possa assumere una grande rilevanza in ambiti come
+               quelli dell'educazione e della formazione.
+           </p>
+           <p> Ma se trovare della buona documentazione libera, specie per
+               quanto riguarda i programmi che girano sul sistema GNU/Linux,
+               è ormai relativamente facile, la produzione di buoni testi
+               didattici è ancora molto limitata, soprattutto se li si cerca
+               in lingua italiana.
+           </p>
+           <p> <b>GaPiL</b> è un tentativo di scrivere un manuale di
+               programmazione di sistema per Linux e le GNU libc.
+               L'obiettivo è quello di riuscire a produrre una testo
+               rilasciato sotto <A
+               HREF="http://www.gnu.org/copyleft/fdl.html">GNU FDL</a>, che
+               possa servire a chi si accosta per la prima volta alla
+               programmazione di sistema sotto Unix, con la speranza di poter
+               un giorno raggiungere la qualità dei testi del compianto
+               R. W. Stevens. 
+           </p>
+         </td>
+       </tr>
+       <tr>
+         <td width="130" valign="top">
+           <b>
+             <font color="#0000aa">
+               News
+             </font>
+           </b>
+         </td>
+         <td bgcolor="lightblue"> 
+           <b>3 - luglio - 2002</b> 
+           <br> 
+           Prima versione del sito, con rilascio della prima versione di
+           GaPiL in un HTML decente.
+           <p>
+             <b>22 - luglio - 2002</b><br> 
+             Nuova versione, aggiunte su I/O avanzato, IPC, segnali
+             real-time.
+         </td>
+       </tr>
+      </tbody>
+    </table>
 <!-- CUT HERE -->
-</body>
+  </body>
 </html>
index 4b8f006..82ad0e1 100644 (file)
 <HTML>
-<HEAD>
-   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
-   <TITLE>GaPiL -- Guida alla Programmazione in Linux</TITLE>
-<style type="text/css">
+  <HEAD>
+    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+    <TITLE>GaPiL -- Guida alla Programmazione in Linux</TITLE>
+    <style type="text/css">
 <!--
  a {text-decoration: none;}
  td {font-family: sans-serif}
 -->
-</style>
-</HEAD>
-<BODY link="mediumslateblue" vlink="mediumblue" alink="red" bgcolor="white">
-
-<table cellspacing=0 cellpadding=0 border=0 width=900>
-<tr>
-<td><img src="gapil.png" width="160" border=0 align=right></td>
-<td valign=bottom align=left height=125 width=400 bgcolor="white">
-
-<table cellspacing=10><tr><td>
-<font face="sans-serif" size="+4" color="darkred" style="font-size: 22pt"><b>
-Guida alla Programmazione in Linux<br>
-<font color="midnightblue">Simone Piccardi</b></font>
-</table>
-
-<table width=750 align="left" border=0 cellpadding=3 cellspacing=0 
-bgcolor="#dddddd"><tr>
-<td width=80 align="center"><A target="_parent"  HREF="index.html">
-<font face="sans-serif"><b>Home</b></font></A> </td> 
-<td width=150 align="center"><A target="_parent"  HREF="stampa.html">
-<font face="sans-serif"><b>Download</b></font></A>
-<td width=150 align="center"><A target="_parent"  href="html/index.html">
-<font face="sans-serif"><b>Versione online</b></font></A> </td>
-<td width=150 align="center"><A target="_parent" HREF="http://cvs.firenze.linux.it/cgi-bin/viewcvs.cgi/gapil/">
-<font face="sans-serif"><b>CVS</b></font></A> </td>
-<td></td>
-</table>
-
-</td>
-</tr></table>
+    </style>
+  </HEAD>
+  <BODY link="mediumslateblue" vlink="mediumblue" alink="red" bgcolor="white">
+
+    <table cellspacing=0 cellpadding=0 border=0 width=800>
+      <tbody>
+       <tr>
+         <td width="170" align=center>
+           <img src="gapil.png" width="160" border=0>
+         </td>
+         <td valign=bottom align=left bgcolor="white">
+           <table cellspacing=0>
+               <tr>
+                 <td>
+                   <font face="sans-serif" size="+4" 
+                     color="darkred" style="font-size: 22pt">
+                     <b>Guida alla Programmazione in Linux</b>
+                     <br>
+                     <font color="midnightblue">
+                       <b>Simone Piccardi</b>
+                     </font>
+                   </font>
+                 </td>
+               </tr>
+           </table>
+       </tr>
+      </tbody>
+    </table>
+
+    <table width="790" cellspacing="0" cellpadding="3" border="0">
+      <tbody>
+         <td width=164 align="center" >
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  HREF="index.html">
+             <font face="sans-serif">
+               <b>Home</b>
+             </font>
+           </A> 
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  href="stampa.html">
+             <font face="sans-serif">
+               <b>Download</b>
+             </font>
+           </A> 
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  HREF="html/index.html">
+             <font face="sans-serif" color="darkred">
+               <b>Versione online</b>
+             </font>
+           </A>
+         </td>
+         <td align="center" bgcolor="#dddddd">
+           <A target="_parent"  
+             HREF="http://cvs.firenze.linux.it/cgi-bin/viewcvs.cgi/gapil/">
+             <font face="sans-serif">
+               <b>CVS</b>
+             </font>
+           </A> 
+         </td>
+       </tr>
+      </tbody>
+    </table>
 
 <!-- CUT HERE -->
-<table width="920" cellspacing="10" cellpadding="10" border="0">
-<tbody><tr>
-<td width="125" valign="top"><b>
-<font color="#0000aa">
-
-</font>
-</b></td>
-
-<tr>
-<td width="125" valign="top"><b>
-
-<font color="#0000aa">
-GaPiL
-</font>
-</b></td>
-
-<td bgcolor="lightblue"> 
-
-<p> <b>GaPiL</b> è scritta in LaTeX, la versione aggiornata di tutti i file è
-disponibile in tempo reale sul CVS del <A HREF="http://cvs.firenze.linux.it/">
-FLUG</a>, a cui potete accedere direttamente. La versione online è pubblicata
-su questo sito, e viene periodicamente aggiornata. </P>
-
-<p> Dato che la resa della conversione da LaTeX in HTML non è delle migliori
-ed il programma di conversione (latex2html) fa alcuni errori, ho provveduto a
-mettere in linea delle versioni stampabili, la cui qualità è nettamente
-superiore alla versione on line; esse sono liberamente scaricabili dagli
-indirizzi seguenti, insieme all'archivio compresso di tutti i sorgenti:
-<ul>
-
-<li> <A HREF="http://gapil.firenze.linux.it/gapil.pdf">Versione PDF</a></li>
-<li> <A HREF="http://gapil.firenze.linux.it/gapil.ps">Versione PS</a></li>
-<li> <A HREF="http://gapil.firenze.linux.it/gapil_source.tgz">Archivio dei
-sorgenti</a> </li>
-</li>
-
-</td>
-</tr>
-
-<tr>
-<td width="125" valign="top"><b>
-
-<font color="#0000aa">
-Altro materiale
-</font>
-
-</b></td>
-
-<td bgcolor="lightblue"> 
-
-Per chi può interessare potete trovare altra documentazione libera che ho
-prodotto a questo indirizzo: <A
-HREF="http://firenze.linux.it/~piccardi/pubblicazioni.html">http://firenze.linux.it/~piccardi/pubblicazioni.html</a>
-
-</td>
-</tr>
-
-
-
-
-</tbody></table>
-                                
-
+    <table width="800" cellspacing="10" cellpadding="10" border="0">
+      <tbody>
+       <tr>
+         <td width="130" valign="top">
+           <b>
+             <font color="#0000aa">
+               GaPiL
+             </font>
+           </b>
+         </td>
+         <td bgcolor="lightblue"> 
+
+           <p> <b>GaPiL</b> è scritta in LaTeX, la versione aggiornata di
+               tutti i file è disponibile in tempo reale sul CVS del <A
+               HREF="http://cvs.firenze.linux.it/"> FLUG</a>, a cui potete
+               accedere direttamente. La versione online è pubblicata su
+               questo sito, e viene periodicamente aggiornata. </P>
+
+           <p> Dato che la resa della conversione da LaTeX in HTML non è
+               delle migliori ed il programma di conversione (latex2html) fa
+               alcuni errori, ho provveduto a mettere in linea delle versioni
+               stampabili, la cui qualità è nettamente superiore alla
+               versione on line; esse sono liberamente scaricabili dagli
+               indirizzi seguenti, insieme all'archivio compresso di tutti i
+               sorgenti:
+           <ul>
+             <li> 
+               <A HREF="http://gapil.firenze.linux.it/gapil.pdf">Versione
+               PDF</a>
+             </li>
+             <li> 
+               <A HREF="http://gapil.firenze.linux.it/gapil.ps">Versione
+               PS</a>
+             </li>
+             <li> 
+               <A HREF="http://gapil.firenze.linux.it/gapil_source.tgz">
+                 Archivio dei sorgenti</a>
+             </li>
+           </ul>
+         </td>
+       </tr>
+       <tr>
+         <td width="130" valign="top">
+           <b>
+             <font color="#0000aa">
+               Altro materiale
+             </font>
+           </b>
+         </td>
+         <td bgcolor="lightblue"> 
+           Per chi può interessare potete trovare altra documentazione libera
+            che ho prodotto a questo indirizzo: 
+           <A HREF="http://firenze.linux.it/~piccardi/pubblicazioni.html">
+             http://firenze.linux.it/~piccardi/pubblicazioni.html</a>
+         </td>
+       </tr>
+      </tbody>
+    </table>
 <!-- CUT HERE -->
-</body>
+  </body>
 </html>