X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=63b46f6cbb6e2d4fb8332d327d67e2ad2eb789f5;hp=067dd5988013c51e770c2c6ae49ef273209ededf;hb=0c9d95dfc21869e96f8a3e3ab8111c842e85a1f9;hpb=56a7803a5e9f18850548c186b7aa9813b071107d diff --git a/system.tex b/system.tex index 067dd59..63b46f6 100644 --- a/system.tex +++ b/system.tex @@ -49,7 +49,7 @@ La prima funzionalit contengono le costanti necessarie definite come macro di preprocessore, per la seconda invece sono ovviamente necessarie delle funzioni. La situazione è complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti -sono fissi in una implementazione mentre possono variare in un altra. Tutto +sono fissi in un'implementazione mentre possono variare in un altra. Tutto questo crea una ambiguità che non è sempre possibile risolvere in maniera chiara; in generale quello che succede è che quando i limiti del sistema sono fissi essi vengono definiti come macro di preprocessore nel file @@ -78,21 +78,21 @@ avere un valore minimo di 8. \hline \macro{MB\_LEN\_MAX}& 16 & massima dimensione di un carattere esteso\\ - \macro{CHAR\_BIT} & 8 & bit di \type{char}\\ - \macro{UCHAR\_MAX}& 255 & massimo di \type{unsigned char}\\ - \macro{SCHAR\_MIN}& -128 & minimo di \type{signed char}\\ - \macro{SCHAR\_MAX}& 127 & massimo di \type{signed char}\\ - \macro{CHAR\_MIN} &\footnotemark& minimo di \type{char}\\ - \macro{CHAR\_MAX} &\footnotemark& massimo di \type{char}\\ - \macro{SHRT\_MIN} & -32768 & minimo di \type{short}\\ - \macro{SHRT\_MAX} & 32767 & massimo di \type{short}\\ - \macro{USHRT\_MAX}& 65535 & massimo di \type{unsigned short}\\ - \macro{INT\_MAX} & 2147483647 & minimo di \type{int}\\ - \macro{INT\_MIN} &-2147483648 & minimo di \type{int}\\ - \macro{UINT\_MAX} & 4294967295 & massimo di \type{unsigned int}\\ - \macro{LONG\_MAX} & 2147483647 & massimo di \type{long}\\ - \macro{LONG\_MIN} &-2147483648 & minimo di \type{long}\\ - \macro{ULONG\_MAX}& 4294967295 & massimo di \type{unsigned long}\\ + \macro{CHAR\_BIT} & 8 & bit di \ctyp{char}\\ + \macro{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\ + \macro{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\ + \macro{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\ + \macro{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\ + \macro{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\ + \macro{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\ + \macro{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\ + \macro{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\ + \macro{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\ + \macro{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\ + \macro{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\ + \macro{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\ + \macro{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\ + \macro{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\ \hline \end{tabular} \caption{Costanti definite in \file{limits.h} in conformità allo standard @@ -107,7 +107,7 @@ avere un valore minimo di 8. a seconda che il sistema usi caratteri con segno o meno.} A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo -\type{long long} introdotto con il nuovo standard, i relativi valori sono in +\ctyp{long long} introdotto con il nuovo standard, i relativi valori sono in \tabref{tab:sys_isoc90_macro}. \begin{table}[htb] @@ -118,10 +118,10 @@ A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \macro{LLONG\_MAX}& 9223372036854775807& massimo di \type{long long}\\ - \macro{LLONG\_MIN}&-9223372036854775808& minimo di \type{long long}\\ + \macro{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\ + \macro{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\ \macro{ULLONG\_MAX}&18446744073709551615& - massimo di \type{unsigned long long}\\ + massimo di \ctyp{unsigned long long}\\ \hline \end{tabular} \caption{Macro definite in \file{limits.h} in conformità allo standard @@ -168,7 +168,7 @@ file, riportate in \tabref{tab:sys_file_macro}). \hline \hline \end{tabular} - \caption{Macro .} + \caption{Costanti per i limiti del sistema.} \label{tab:sys_generic_macro} \end{table} @@ -476,7 +476,7 @@ suo prototipo \subsection{La funzione \func{uname}} \label{sec:sys_uname} -Una altra funzione che si può utilizzare per raccogliere informazioni sia +Un'altra funzione che si può utilizzare per raccogliere informazioni sia riguardo al sistema che al computer su cui esso sta girando è \func{uname}, il suo prototipo è: \begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)} @@ -582,7 +582,7 @@ attraverso l'array \param{name}, di lunghezza \param{nlen}, che contiene la sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un formato specifico chee può essere un intero, una stringa o anche una struttura complessa, per questo motivo il valori vengono passati come puntatori -\type{void}. +\ctyp{void}. L'indirizzo a cui il valore corrente del parametro deve essere letto è specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da @@ -636,7 +636,7 @@ Come accennato in \secref{sec:file_organization} per poter accedere ai file occorre prima rendere disponibile al sistema il filesystem su cui essi sono memorizzati; l'operazione di attivazione del filesystem è chiamata \textsl{montaggio}, per far questo in Linux\footnote{la funzione è specifica - di Linux e non è portabile} si usa la funzione \func{mount} il cui prototipo + di Linux e non è portabile.} si usa la funzione \func{mount} il cui prototipo è: \begin{prototype}{sys/mount.h} {mount(const char *source, const char *target, const char *filesystemtype, @@ -660,8 +660,8 @@ sulla directory \param{target}. \item[\macro{EINVAL}] il device \param{source} presenta un \textit{superblock} non valido, o si è cercato di rimontare un filesystem non ancora montato, o di montarlo senza che \param{target} sia un - \type{mount point} o di spostarlo quando \param{target} non è un - \type{mount point} o è \file{/}. + \textit{mount point} o di spostarlo quando \param{target} non è un + \textit{mount point} o è \file{/}. \item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti del pathname, o si è cercato di montare un filesystem disponibile in sola lettura senza averlo specificato o il device \param{source} è su un @@ -780,13 +780,13 @@ Una volta che non si voglia pi \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.} \end{prototype} \noindent la funzione prende il nome della directory su cui il filesystem è -montato e non il file o il dispositivo che è stato montato\footnote{questo è +montato e non il file o il dispositivo che è stato montato,\footnote{questo è vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate separate e la funzione poteva essere usata anche specificando il file di - dispositivo.}, in quanto con il kernel 2.4.x è possibile montare lo stesso + dispositivo.} in quanto con il kernel 2.4.x è possibile montare lo stesso dispositivo in più punti. Nel caso più di un filesystem sia stato montato sullo stesso \textit{mount point} viene smontato quello che è stato montato -per ultimo. +per ultimo. Si tenga presente che la funzione fallisce quando il filesystem è \textsl{occupato}, questo avviene quando ci sono ancora file aperti sul @@ -811,8 +811,8 @@ seconda del tipo di filesystem alcune (o tutte) possono essere superate, evitando l'errore di \macro{EBUSY}. In tutti i casi prima dello smontaggio viene eseguita una sincronizzazione dei dati. -Altre due funzioni specifiche di Linux\footnote{esse si trovano anche su BSD, - ma con una struttura diversa}, utili per ottenere in maniera diretta +Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD, + ma con una struttura diversa.} utili per ottenere in maniera diretta informazioni riguardo al filesystem su cui si trova un certo file, sono \func{statfs} e \func{fstatfs}, i cui prototipi sono: \begin{functions} @@ -868,7 +868,7 @@ relative a \file{/etc/mtab}), quando si debba scrivere un programma che effettua il montaggio di un filesystem; in realtà in questi casi è molto più semplice invocare direttamente il programma \cmd{mount}, per cui ne tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} -\cite{libc} per la documentazione completa. +\cite{glibc} per la documentazione completa. \subsection{La gestione di utenti e gruppi} @@ -964,13 +964,13 @@ date e del tempo in un sistema unix-like, e quelle per convertire i vari tempi nelle differenti rappresentazioni che vengono utilizzate. -\subsection{La misura del tempo in unix} +\subsection{La misura del tempo in Unix} \label{sec:sys_unix_time} -Storicamente i sistemi unix-like hanno sempre mantenuto due distinti -valori per i tempi all'interno del sistema, essi sono rispettivamente -chiamati \textit{calendar time} e \textit{process time}, secondo le -definizioni: +Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di +dati per la misure dei tempi all'interno del sistema: essi sono +rispettivamente chiamati \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 @@ -980,11 +980,11 @@ definizioni: 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 \type{time\_t}. -\item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato +\item \textit{process time}: detto anche tempo di processore. Viene misurato in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate dal timer di sistema, e che per Linux avvengono ogni centesimo di - secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni - millesimo di secondo}. Il dato primitivo usato per questo tempo è + secondo.\footnote{eccetto per la piattaforma alpha dove avvengono ogni + millesimo di secondo.} Il dato primitivo usato per questo tempo è \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di operazione del timer, e corrisponde dunque al numero di tick al secondo. Lo standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK}); @@ -992,32 +992,35 @@ definizioni: \secref{sec:sys_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 +In genere si usa il \textit{calendar time} per esprimere le date dei file e le +informazioni analoghe che riguardano i cosiddetti \textsl{tempi di orologio}, +che vengono usati ad esempio per i demoni che compiono lavori amministrativi +ad ore definite, come \cmd{cron}. + +Di solito questo tempo viene 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. +mantenuto dal sistema e non è detto che corrisponda al tempo tenuto +dall'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 dipende 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}. +Anche il \textit{process time} di solito si esprime in secondi, ma provvede una +precisione ovviamente superiore al \textit{calendar time} (la cui granularità +minima è il secondo) e viene usato per tenere conto dei tempi di esecuzione +dei processi. Per ciascun processo il kernel calcola tre tempi diversi: +\begin{description*} +\item[\textit{clock time}]: il tempo \textsl{reale} (viene chiamato anche + \textit{wall clock time}) passato dall'avvio del processo. Chiaramente tale + tempo dipende anche dal carico del sistema e da quanti altri processi + stavano girando nello stesso periodo. +\item[\textit{user time}]: il tempo che la CPU ha impiegato nell'esecuzione + delle istruzioni del processo in user space. +\item[\textit{system time}]: il tempo che la CPU ha impiegato nel kernel per + eseguire delle system call per conto del processo. +\end{description*} +In genere la somma di \textit{user time} e \textit{system time} indica il +tempo di processore totale in cui il sistema è stato effettivamente impegnato +nell'eseguire un certo processo e viene chiamato \textit{CPU time}. @@ -1044,16 +1047,17 @@ 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 +\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{modifiable 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 \type{volatile} dato che può essere -cambiata in modo asincrono da un segnale (per una descrizione dei segnali si -veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto -bene salva e ripristina il valore della variabile, di questo non è necessario -preoccuparsi nella programmazione normale. + renderla locale ai singoli thread.} definita nell'header \file{errno.h}; la +variabile è in genere definita come \ctyp{volatile} dato che può essere +cambiata in modo asincrono da un segnale (si veda \ref{sec:sig_sigchld} per un +esempio, ricordando quanto trattato in \ref{sec:proc_race_cond}), ma dato che +un manipolatore di segnale scritto bene salva e ripristina il valore della +variabile, di questo non è necessario preoccuparsi nella programmazione +normale. I valori che può assumere \var{errno} sono riportati in \capref{cha:errors}, nell'header \file{errno.h} sono anche definiti i nomi simbolici per le @@ -1095,7 +1099,7 @@ errore sconosciuto. La funzione utilizza una stringa statica che non deve essere modificata dal programma e che è utilizzabile solo fino ad una chiamata successiva a \func{strerror}; nel caso si usino i thread è provvista\footnote{questa funzione è una estensione GNU, non fa parte dello - standard POSIX} una versione apposita: + standard POSIX.} una versione apposita: \begin{prototype}{string.h} {char *strerror\_r(int errnum, char *buff, size\_t size)} Analoga a \func{strerror} ma ritorna il messaggio in un buffer @@ -1106,7 +1110,7 @@ provvista\footnote{questa funzione che utilizza un buffer che il singolo thread deve allocare, per evitare i problemi connessi alla condivisione del buffer statico. Infine, per completare la caratterizzazione dell'errore, si può usare anche la variabile -globale\footnote{anche questa è una estensione GNU} +globale\footnote{anche questa è un'estensione GNU.} \var{program\_invocation\_short\_name} che riporta il nome del programma attualmente in esecuzione.