Molte correzioni a giro e un po' di roba in piu` sui file.
[gapil.git] / intro.tex
index 0913f58fd9a0499786ff22adf9b14504d0c63ef9..4442d526fd6050c83b96009a0e245973212064db 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -217,7 +217,7 @@ In questo modo il sistema 
 dell'utente a cui appartiene ed impedire ad altri utenti di interferire con
 esso. Inoltre con questo sistema viene anche garantita una forma base di
 sicurezza interna in quanto anche l'accesso ai file (vedi
-\secref{sec:fileintr_access_ctrl}) è regolato da questo meccanismo di
+\secref{sec:filedir_access_control}) è regolato da questo meccanismo di
 identificazione.
 
 Un utente speciale del sistema è \textit{root}, il cui uid è zero. Esso
@@ -229,18 +229,112 @@ descritti in precedenza sono disattivati.
 \section{Gli standard di unix e GNU/Linux}
 \label{sec:intro_standard}
 
-
+In questa sezione prenderemo in esame alcune caratteristiche generali del
+sistema e gli standard adottati per le funzioni, i prototipi, gli errori, i
+tipi di dati.
+
+\subsection{Prototipi e puntatori}
+\label{sec:intro_function}
+
+\subsection{La misura del tempo in unix}
+\label{sec:intro_unix_time}
+
+Storicamente i sistemi unix-like hanno sempre mantenuto due distinti valori
+per i tempi all'interno del sistema, chiamati rispettivamente \textit{calendar
+  time} e \textit{process time}, secondo le definizioni:
+\begin{itemize}
+\item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
+  primo gennaio 1970, in tempo universale coordinato (o UTC, data che viene
+  usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
+    Epoch}). Viene chiamato anche GMT (Greenwich Mean Time) dato che l'UTC
+  corrisponde all'ora locale di Greenwich.  E' il tempo su cui viene mantenuto
+  l'orologio del calcolatore, e viene usato ad esempio per indicare le date di
+  modifica dei file o quelle di avvio dei processi. Per memorizzare questo
+  tempo è stato riservato il tipo primitivo \func{time\_t}.
+\item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato
+  in \textit{clock tick}, corripondenti al numero di interruzioni effettuate
+  dal timer di sistema, e che per Linux sono ogni centesimo di secondo
+  (eccetto per la piattaforma alpha). Il dato primitivo usato per questo tempo
+  è \func{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza
+  di operazione del timer, e corrisponde dunque al numero di tick al secondo
+  (Posix definisce allo stesso modo la costante \macro{CLK\_TCK}); questo
+  valore può comunque essere ottenuto con \func{sysconf} (vedi
+  \secref{sec:intro_limits}).
+\end{itemize}
+
+In genere si usa il \textit{calendar time} per tenere le date dei file e le
+informazioni analoghe che riguardano i tempi di ``orologio'' (usati ad esempio
+per i demoni che compiono lavori amministrativi ad ore definite, come
+\cmd{cron}). Di solito questo vene convertito automaticamente dal valore in
+UTC al tempo locale, utilizzando le opportune informazioni di localizzazione
+(specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
+mantenuto dal sistema e non corrisponde all'orologio hardware del calcolatore.
+
+Il \textit{process time} di solito si esprime in secondi e viene usato appunto
+per tenere conto dei tempi di esecuzione dei processi. Per ciascun processo il
+kernel tiene tre di questi tempi: 
+\begin{itemize}
+\item \textit{clock time}
+\item \textit{user time}
+\item \textit{system time}
+\end{itemize}
+il primo è il tempo ``reale'' (viene anche chiamato \textit{wall clock time})
+dall'avvio del processo, e misura il tempo trascorso fino alla sua
+conclusione; chiaramente un tale tempo dipede anche dal carico del sistema e
+da quanti altri processi stavano girando nello stesso periodo. Il secondo
+tempo è quello che la CPU ha speso nell'esecuzione delle istruzioni del
+processo in user space. Il terzo è il tempo impiegato dal kernel per eseguire
+delle system call per conto del processo medesimo (tipo quello usato per
+eseguire una \func{write} su un file). In genere la somma di user e system
+time viene chiamato \textit{CPU time}. 
 
 \subsection{Lo standard ANSI C}
 \label{sec:intro_ansiC}
 
+\subsection{Lo standard POSIX}
+\label{sec:intro_posix}
 
+\subsection{Valori e limiti del sistema}
+\label{sec:intro_limits}
 
-\subsection{Lo standard POSIX}
-\label{sec:intro_ansiC}
 
+\subsection{Tipi di dati primitivi}
+\label{sec:intro_data_types}
+
+\section{La gestione degli errori}
+\label{sec:intro_errors}
+
+La gestione degli errori è in genere una materia complessa. Inoltre il modello
+utilizzato dai sistema unix-like è basato sull'architettura a processi, e
+presenta una serie di problemi nel caso lo si debba usare con i thread.
+Esamineremo in questa sezione le sue caratteristiche principali.
+
+
+
+\subsection{La variabile \func{errno}}
+\label{sec:intro_errno}
+
+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.
 
+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. 
 
+Per riportare il tipo di errore il sistema usa la variabile globale
+\var{errno}\footnote{L'uso di una variabile globale può comportare alcuni
+  problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
+  anche di definire \var{errno} come un \textit{modifible 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 \var{volatile} dato che può essere cambiata in modo asincrono da
+un segnale (per una descrizione dei segnali si veda \secref{cha:signal}), ma
+dato che un manipolatore di segnale scritto bene salva e ripristina il valore
+della varibile, di questo non è necessario preoccuparsi nella programmazione
+normale.