X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=intro.tex;h=f287e9c6b5e5503247913bca782c22d06c6b3250;hb=ce9c6c2650b8aeb8b5ada49220365741beff8ded;hp=6fc0fecac814ceb9b4196b500c9dcb81408232a4;hpb=056bbc90c8a0710b57fa7b13f5f0dfdad1b3ff3f;p=gapil.git diff --git a/intro.tex b/intro.tex index 6fc0fec..f287e9c 100644 --- a/intro.tex +++ b/intro.tex @@ -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{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 su + può anche usare +}, 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.