X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=664c26afc4bc375b48f00bbfa8e42135b19e5e43;hp=ddd77b8d37d9ffa32a2be91d48f87bc02d9de116;hb=50b469ec4e7bba4d52eaaa51edd77b18967079c2;hpb=250b32a55733b307d2eae8afb50b64af1b7c0bc8 diff --git a/system.tex b/system.tex index ddd77b8..664c26a 100644 --- a/system.tex +++ b/system.tex @@ -1,6 +1,6 @@ %% system.tex %% -%% Copyright (C) 2000-2007 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2010 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -88,23 +88,23 @@ avere un valore minimo di 8. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{MB\_LEN\_MAX}& 16 & massima dimensione di un - carattere esteso\\ - \const{CHAR\_BIT} & 8 & bit di \ctyp{char}\\ - \const{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\ - \const{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\ - \const{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\ - \const{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\ - \const{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\ - \const{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\ - \const{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\ - \const{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\ - \const{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\ - \const{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\ - \const{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\ - \const{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\ - \const{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\ - \const{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\ + \const{MB\_LEN\_MAX}& 16 & Massima dimensione di un + carattere esteso.\\ + \const{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\ + \const{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\ + \const{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\ + \const{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\ + \const{CHAR\_MIN} &\footnotemark& Minimo di \ctyp{char}.\\ + \const{CHAR\_MAX} &\footnotemark& Massimo di \ctyp{char}.\\ + \const{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\ + \const{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\ + \const{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\ + \const{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\ + \const{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\ + \const{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\ + \const{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\ + \const{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\ + \const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\ \hline \end{tabular} \caption{Costanti definite in \file{limits.h} in conformità allo standard @@ -130,10 +130,10 @@ tab.~\ref{tab:sys_isoc90_macro}. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\ - \const{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\ + \const{LLONG\_MAX}& 9223372036854775807& Massimo di \ctyp{long long}.\\ + \const{LLONG\_MIN}&-9223372036854775808& Minimo di \ctyp{long long}.\\ \const{ULLONG\_MAX}&18446744073709551615& - massimo di \ctyp{unsigned long long}\\ + Massimo di \ctyp{unsigned long long}.\\ \hline \end{tabular} \caption{Macro definite in \file{limits.h} in conformità allo standard @@ -341,7 +341,8 @@ relative spiegazioni, si pu Valore massimo del tipo di dato \type{ssize\_t}.\\ \texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} & - Il numero di \textit{clock tick} al secondo, + Il numero di \itindex{clock~tick} + \textit{clock tick} al secondo, cioè l'unità di misura del \itindex{process~time} \textit{process time} (vedi @@ -527,9 +528,9 @@ fig.~\ref{fig:sys_utsname}, solo definendo \macro{\_GNU\_SOURCE}. \label{fig:sys_utsname} \end{figure} -In generale si tenga presente che le dimensioni delle stringe di una -\struct{utsname} non è specificata, e che esse sono sempre terminate con NUL; -il manuale delle \acr{glibc} indica due diverse dimensioni, +In generale si tenga presente che le dimensioni delle stringhe di una +struttura \struct{utsname} non è specificata, e che esse sono sempre terminate +con NUL; il manuale delle \acr{glibc} indica due diverse dimensioni, \const{\_UTSNAME\_LENGTH} per i campi standard e \const{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio; altri sistemi usano nomi diversi come \const{SYS\_NMLN} o \const{\_SYS\_NMLN} @@ -558,6 +559,7 @@ lettura. Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si usano per il controllo di altre caratteristiche generali del sistema, come quelle per la gestione dei filesystem e di utenti e gruppi. +% TODO ristrutturare e aggiungere \func{prctl} \subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}} \label{sec:sys_sysctl} @@ -660,8 +662,8 @@ inclusa nei sorgenti del kernel, nella directory \file{Documentation/sysctl}. Ma oltre alle informazioni ottenibili da \func{sysctl} dentro \file{proc} sono disponibili moltissime altre informazioni, fra cui ad esempio anche quelle -fornite da \func{uname} (vedi sez.~\ref{sec:sys_config}) che sono mantenute -nei file \procrelfile{/proc/sys/kernel}{ostype}, +fornite da \func{uname} (vedi sez.~\ref{sec:sys_uname}) che sono mantenute nei +file \procrelfile{/proc/sys/kernel}{ostype}, \procrelfile{/proc/sys/kernel}{hostname}, \procrelfile{/proc/sys/kernel}{osrelease}, \procrelfile{/proc/sys/kernel}{version} e @@ -707,8 +709,8 @@ sulla directory \param{target}. di montare un filesystem disponibile in sola lettura senza averlo specificato o il device \param{source} è su un filesystem montato con l'opzione \const{MS\_NODEV}. - \item[\errcode{ENXIO}] il \textit{major number} del device \param{source} è - sbagliato. + \item[\errcode{ENXIO}] il \itindex{major~number} \textit{major number} del + device \param{source} è sbagliato. \item[\errcode{EMFILE}] la tabella dei device \textit{dummy} è piena. \end{errlist} ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM}, @@ -796,6 +798,8 @@ valori riportati in tab.~\ref{tab:sys_mount_flags}. \end{table} % TODO aggiornare con i nuovi flag di man mount +% gli S_* non esistono più come segnalato da Alessio... +% verificare i readonly mount bind del 2.6.26 Per l'impostazione delle caratteristiche particolari di ciascun filesystem si usa invece l'argomento \param{data} che serve per passare le ulteriori @@ -919,9 +923,16 @@ semplice invocare direttamente il programma \cmd{mount}, per cui ne tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} \cite{glibc} per la documentazione completa. +% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C) +% TODO documentare swapon e swapoff (man 2 ...) + + +% TODO documentare keyctl ???? +% (fare sezione dedicata ????) +%\subsection{La gestione delle chiavi} +%\label{sec:keyctl_management} -% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C) \subsection{La gestione delle informazioni su utenti e gruppi} \label{sec:sys_user_group} @@ -1017,9 +1028,9 @@ La struttura usata da entrambe le funzioni 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 possono -essere rientranti; per questo motivo ne esistono anche due versioni -alternative (denotate dalla solita estensione \code{\_r}), i cui prototipi -sono: +essere \index{funzioni!rientranti} rientranti; per questo motivo ne esistono +anche due versioni alternative (denotate dalla solita estensione \code{\_r}), +i cui prototipi sono: \begin{functions} \headdecl{pwd.h} @@ -1050,9 +1061,9 @@ funzione fallir impostato a \val{NULL}). Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e -\funcd{getgrgid} (e le relative analoghe rientranti con la stessa estensione -\code{\_r}) che permettono di leggere le informazioni relative ai gruppi, i -loro prototipi sono: +\funcd{getgrgid} (e le relative analoghe \index{funzioni!rientranti} +rientranti con la stessa estensione \code{\_r}) che permettono di leggere le +informazioni relative ai gruppi, i loro prototipi sono: \begin{functions} \headdecl{grp.h} \headdecl{sys/types.h} @@ -1113,19 +1124,23 @@ file di \textsl{registro} di utenti e gruppi, con il formato classico di \hline \func{fgetpwent} & Legge una voce dal file di registro degli utenti specificato.\\ - \func{fgetpwent\_r}& Come la precedente, ma rientrante.\\ + \func{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ \func{putpwent} & Immette una voce in un file di registro degli utenti.\\ \func{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\ - \func{getpwent\_r} & Come la precedente, ma rientrante.\\ + \func{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ \func{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\ \func{endpwent} & Chiude \conffile{/etc/passwd}.\\ \func{fgetgrent} & Legge una voce dal file di registro dei gruppi specificato.\\ - \func{fgetgrent\_r}& Come la precedente, ma rientrante.\\ + \func{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ \func{putgrent} & Immette una voce in un file di registro dei gruppi.\\ \func{getgrent} & Legge una voce da \conffile{/etc/group}.\\ - \func{getgrent\_r} & Come la precedente, ma rientrante.\\ + \func{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ \func{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\ \func{endgrent} & Chiude \conffile{/etc/group}.\\ \hline @@ -1327,14 +1342,16 @@ gestione (\func{getutxent}, \func{getutxid}, \func{getutxline}, sinonimi delle funzioni appena viste. Come visto in sez.~\ref{sec:sys_user_group}, l'uso di strutture allocate -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 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. +staticamente rende le funzioni di lettura non \index{funzioni!rientranti} +rientranti; per questo motivo le \acr{glibc} forniscono anche delle versioni +\index{funzioni!rientranti} 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 analoghe non \index{funzioni!rientranti} 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. Infine le \acr{glibc} forniscono come estensione per la scrittura delle voci in \file{wmtp} altre due funzioni, \funcd{updwtmp} e \funcd{logwtmp}, i cui @@ -1411,7 +1428,7 @@ In genere includere esplicitamente \file{} non necessario, ma aumenta la portabilità, e serve comunque quando, come nella maggior parte dei casi, si debba accedere ai campi di \struct{rusage} relativi ai tempi di utilizzo del processore, che sono definiti come strutture di tipo -\struct{timeval}. +\struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}). Questa è la stessa struttura utilizzata da \func{wait4} (si ricordi quando visto in sez.~\ref{sec:proc_wait}) per ricavare la quantità di risorse @@ -1437,6 +1454,7 @@ leggere l'uso delle risorse; esso pu \const{RUSAGE\_CHILDREN} per indicare l'insieme dei processi figli di cui si è ricevuto lo stato di terminazione. +% TODO previsto in futuro \const{RUSAGE\_THREAD}, verificare. \subsection{Limiti sulle risorse} \label{sec:sys_resource_limit} @@ -1473,7 +1491,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard esse falliranno con un errore di \errcode{ENOMEM}, mentre se il superamento viene causato dalla crescita dello \itindex{stack} - stack il processo riceverà un segnale di + \textit{stack} il processo riceverà un segnale di \const{SIGSEGV}.\\ \const{RLIMIT\_CORE} & La massima dimensione per di un file di \itindex{core~dump} \textit{core dump} (vedi @@ -1486,9 +1504,11 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il superamento del limite corrente comporta l'emissione di un segnale di - \const{SIGXCPU} la cui azione predefinita (vedi + \const{SIGXCPU}, la cui azione predefinita (vedi sez.~\ref{sec:sig_classification}) è terminare - il processo. Il superamento del limite massimo + il processo, una volta al secondo fino al + raggiungimento del limite massimo. Il + superamento del limite massimo comporta l'emissione di un segnale di \const{SIGKILL}.\footnotemark\\ \const{RLIMIT\_DATA} & La massima dimensione del \index{segmento!dati} @@ -1519,6 +1539,12 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard sez.~\ref{sec:ipc_sysv_shm}) che viene contabilizzata separatamente ma sulla quale viene applicato questo stesso limite.\\ +% TODO trattare i seguenti... +% \const{RLIMIT\_MSGQUEUE}& Il numero massimo di \\ +% \const{RLIMIT\_NICE}& Il numero massimo di \\ +% \const{RLIMIT\_RTPRIO}& Il numero massimo di \\ +% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25 +% vedi file include/asm-generic/resource.h \const{RLIMIT\_NOFILE} & Il numero massimo di file che il processo può aprire. L'apertura di un ulteriore file farà fallire la funzione (\func{open}, \func{dup} o @@ -1535,9 +1561,9 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard si potrà sempre inviare un segnale che non sia già presente su una coda.\footnotemark\\ \const{RLIMIT\_STACK} & La massima dimensione dello \itindex{stack} - stack del - processo. Se il processo esegue operazioni che - estendano lo stack oltre questa dimensione + \textit{stack} del processo. Se il processo + esegue operazioni che estendano lo + \textit{stack} oltre questa dimensione riceverà un segnale di \const{SIGSEGV}.\\ \const{RLIMIT\_RSS} & L'ammontare massimo di pagine di memoria dato al \index{segmento!testo} testo del processo. Il @@ -1545,6 +1571,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard qualora ci fosse un surplus di memoria questa verrebbe assegnata.\\ % TODO integrare con la roba di madvise +% TODO integrare con le ultime aggiunte, vedi pagina di manuale \hline \end{tabular} \caption{Valori possibili dell'argomento \param{resource} delle funzioni @@ -1555,12 +1582,13 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard \footnotetext[18]{questo è quanto avviene per i kernel dalla serie 2.2 fino ad oggi (la 2.6.x); altri kernel possono avere comportamenti diversi per quanto avviene quando viene superato il \textit{soft limit}; perciò per avere - operazioni portabili è sempre opportuno intercettare \const{SIGXCPU} e - terminare in maniera ordinata il processo.} + operazioni portabili è sempre opportuno intercettare il primo + \const{SIGXCPU} e terminare in maniera ordinata il processo.} \footnotetext{il limite su questa risorsa è stato introdotto con il kernel 2.6.8.} + In generale il superamento di un limite corrente\footnote{di norma quanto riportato in tab.~\ref{tab:sys_rlimit_values} fa riferimento a quanto avviene al superamento del limite corrente, con l'eccezione @@ -1588,8 +1616,8 @@ parte di un processo sono previste due funzioni, \funcd{getrlimit} e \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EINVAL}] I valori per \param{resource} non sono validi. - \item[\errcode{EPERM}] Un processo senza i privilegi di amministratore ha + \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi. + \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha cercato di innalzare i propri limiti. \end{errlist} ed \errval{EFAULT}.} @@ -1623,12 +1651,13 @@ Nello specificare un limite, oltre a fornire dei valori specifici, si pu anche usare la costante \const{RLIM\_INFINITY} che permette di sbloccare l'uso di una risorsa; ma si ricordi che solo un processo con i privilegi di amministratore\footnote{per essere precisi in questo caso quello che serve è - la \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_RESOURCE}.} -può innalzare un limite al di sopra del valore corrente del limite massimo ed -usare un valore qualsiasi per entrambi i limiti. Si tenga conto infine che -tutti i limiti vengono ereditati dal processo padre attraverso una \func{fork} -(vedi sez.~\ref{sec:proc_fork}) e mantenuti per gli altri programmi eseguiti -attraverso una \func{exec} (vedi sez.~\ref{sec:proc_exec}). + la \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_RESOURCE} + (vedi sez.~\ref{sec:proc_capabilities}).} può innalzare un limite al di +sopra del valore corrente del limite massimo ed usare un valore qualsiasi per +entrambi i limiti. Si tenga conto infine che tutti i limiti vengono ereditati +dal processo padre attraverso una \func{fork} (vedi sez.~\ref{sec:proc_fork}) +e mantenuti per gli altri programmi eseguiti attraverso una \func{exec} (vedi +sez.~\ref{sec:proc_exec}). \subsection{Le risorse di memoria e processore} @@ -1747,7 +1776,7 @@ prototipo \begin{errlist} \item[\errcode{EACCESS}] non si hanno i permessi per accedere a \param{pathname}. - \item[\errcode{EPERM}] Il processo non ha privilegi sufficienti ad + \item[\errcode{EPERM}] il processo non ha privilegi sufficienti ad abilitare il \textit{BSD accounting}. \item[\errcode{ENOSYS}] il kernel non supporta il \textit{BSD accounting}. \item[\errcode{EUSER}] non sono disponibili nel kernel strutture per il @@ -1784,6 +1813,10 @@ minimo indicato dal secondo valore (sempre in percentuale di spazio disco libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve essere controllata detta percentuale. +% TODO trattare quote disco +% vedi man quotactl +%\section{La gestione delle quote disco} +%\label{sec:disk_quota} @@ -1803,10 +1836,10 @@ gestione di data e ora. 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 \itindend{calendar~time} \textit{calendar time} e +rispettivamente chiamati \itindex{calendar~time} \textit{calendar time} e \itindex{process~time} \textit{process time}, secondo le definizioni: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\textit{calendar time}] \itindend{calendar~time} detto anche +\item[\textit{calendar time}] \itindex{calendar~time} detto anche \textsl{tempo di calendario}. È 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 @@ -1816,21 +1849,22 @@ rispettivamente chiamati \itindend{calendar~time} \textit{calendar time} e 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}] \itindex{process~time} detto talvolta - \textsl{tempo di processore}. Viene misurato in \textit{clock tick}. Un - tempo questo corrispondeva al numero di interruzioni effettuate dal timer di - sistema, adesso lo standard POSIX richiede che esso sia pari al valore della - costante \const{CLOCKS\_PER\_SEC}, che deve essere definita come 1000000, - qualunque sia la risoluzione reale dell'orologio di sistema e la frequenza - delle interruzioni del timer.\footnote{quest'ultima, come accennato in - sez.~\ref{sec:proc_hierarchy}, è invece data dalla costante \const{HZ}.} - Il dato primitivo usato per questo tempo è \type{clock\_t}, che ha quindi - una risoluzione del microsecondo. Il numero di tick al secondo può essere - ricavato anche attraverso \func{sysconf} (vedi sez.~\ref{sec:sys_sysconf}). - Il vecchio simbolo \const{CLK\_TCK} definito in \file{time.h} è ormai - considerato obsoleto. + \textsl{tempo di processore}. Viene misurato in \itindex{clock~tick} + \textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni + effettuate dal timer di sistema, adesso lo standard POSIX richiede che esso + sia pari al valore della costante \const{CLOCKS\_PER\_SEC}, che deve essere + definita come 1000000, qualunque sia la risoluzione reale dell'orologio di + sistema e la frequenza delle interruzioni del timer.\footnote{quest'ultima, + come accennato in sez.~\ref{sec:proc_hierarchy}, è invece data dalla + costante \const{HZ}.} Il dato primitivo usato per questo tempo è + \type{clock\_t}, che ha quindi una risoluzione del microsecondo. Il numero + di \itindex{clock~tick} \textit{tick} al secondo può essere ricavato anche + attraverso \func{sysconf} (vedi sez.~\ref{sec:sys_sysconf}). Il vecchio + simbolo \const{CLK\_TCK} definito in \file{time.h} è ormai considerato + obsoleto. \end{basedescript} -In genere si usa il \itindend{calendar~time} \textit{calendar time} per +In genere si usa il \itindex{calendar~time} \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}. @@ -1878,7 +1912,7 @@ del comando \cmd{time}. \itindbeg{process~time} Di norma tutte le operazioni del sistema fanno sempre riferimento al -\itindend{calendar~time} \textit{calendar time}, l'uso del \textit{process +\itindex{calendar~time} \textit{calendar time}, l'uso del \textit{process time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere @@ -1895,11 +1929,11 @@ utilizzato dallo stesso; il suo prototipo caso di errore.} \end{prototype} -La funzione restituisce il tempo in tick, quindi se si vuole il tempo in -secondi occorre dividere il risultato per la costante -\const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard ANSI C, - POSIX richiede che \const{CLOCKS\_PER\_SEC} sia definito pari a 1000000 - indipendentemente dalla risoluzione del timer di sistema.} In genere +La funzione restituisce il tempo in \itindex{clock~tick} \texttt{clock tick}, +quindi se si vuole il tempo in secondi occorre dividere il risultato per la +costante \const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard + ANSI C, POSIX richiede che \const{CLOCKS\_PER\_SEC} sia definito pari a + 1000000 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. @@ -1911,8 +1945,9 @@ possono essere letti attraverso la funzione \funcd{times}, il cui prototipo \begin{prototype}{sys/times.h}{clock\_t times(struct tms *buf)} Legge in \param{buf} il valore corrente dei tempi di processore. - \bodydesc{La funzione ritorna il numero di clock tick dall'avvio del sistema - in caso di successo e -1 in caso di errore.} + \bodydesc{La funzione ritorna il numero di \itindex{clock~tick} + \textit{clock tick} dall'avvio del sistema in caso di successo e -1 in + caso di errore.} \end{prototype} La funzione restituisce i valori di \textit{process time} del processo @@ -1955,7 +1990,10 @@ lo stato di terminazione di tutti i suoi figli, questi processi \itindbeg{calendar~time} Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time} è -mantenuto dal kernel in una variabile di tipo \type{time\_t}, che usualmente +mantenuto dal kernel in una variabile di tipo \type{time\_t},\footnote{in + realtà il kernel usa una rappresentazione interna di che fornisce una + precisione molto maggiore, e consente per questo anche di usare + rappresentazioni diverse del \textit{calendar time}.} che usualmente corrisponde ad un tipo elementare (in Linux è definito come \ctyp{long int}, che di norma corrisponde a 32 bit). Il valore corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di sistema}, può essere ottenuto @@ -2011,30 +2049,19 @@ sono: \errval{EPERM}.} \end{functions} -Queste funzioni utilizzano una struttura di tipo \struct{timeval}, la cui -definizione, insieme a quella della analoga \struct{timespec}, è riportata in -fig.~\ref{fig:sys_timeval_struct}. Le \acr{glibc} infatti forniscono queste due -rappresentazioni alternative del \textit{calendar time} che rispetto a -\type{time\_t} consentono rispettivamente precisioni del microsecondo e del -nanosecondo.\footnote{la precisione è solo teorica, la precisione reale della - misura del tempo dell'orologio di sistema non dipende dall'uso di queste - strutture.} - -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15cm} - \includestruct{listati/timeval.h} - \end{minipage} - \normalsize - \caption{Le strutture \structd{timeval} e \structd{timespec} usate per una - rappresentazione ad alta risoluzione del \textit{calendar time}.} - \label{fig:sys_timeval_struct} -\end{figure} +Si noti come queste funzioni utilizzino per indicare il tempo una struttura di +tipo \struct{timeval}, la cui definizione si è già vista in +fig.~\ref{fig:sys_timeval_struct}, questa infatti permette una espressione +alternativa dei valori del \textit{calendar time}, con una precisione, +rispetto a \type{time\_t}, fino al microsecondo.\footnote{la precisione è solo + teorica, la precisione reale della misura del tempo dell'orologio di sistema + non dipende dall'uso di queste strutture.} Come nel caso di \func{stime} anche \func{settimeofday} (la cosa continua a valere per qualunque funzione che vada a modificare l'orologio di sistema, quindi anche per quelle che tratteremo in seguito) può essere utilizzata solo -da un processo coi privilegi di amministratore. +da un processo coi privilegi di amministratore.\footnote{più precisamente la + capabitity \const{CAP\_SYS\_TIME}.} Il secondo argomento di entrambe le funzioni è una struttura \struct{timezone}, che storicamente veniva utilizzata per specificare appunto @@ -2153,9 +2180,10 @@ campi della struttura \struct{timex} pu PLL implementato dal kernel, specificato nel campo \var{constant} di \struct{timex}.\\ - \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei tick del timer - in microsecondi, espresso nel campo - \var{tick} di \struct{timex}.\\ + \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} + \itindex{clock~tick} del timer in + microsecondi, espresso nel campo + \var{tick} di \struct{timex}.\\ \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Imposta uno spostamento una tantum dell'orologio secondo il valore del campo \var{offset} simulando il @@ -2273,11 +2301,11 @@ stringa, allocata staticamente, nella forma: e impostano 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 -sostitute rientranti, il cui nome è al solito ottenuto aggiungendo un -\code{\_r}, che prendono un secondo argomento \code{char *buf}, in cui -l'utente deve specificare il buffer su cui la stringa deve essere copiata -(deve essere di almeno 26 caratteri). +statica rende le funzioni non \index{funzioni!rientranti} rientranti POSIX.1c +e SUSv2 prevedono due sostitute \index{funzioni!rientranti} rientranti, il cui +nome è al solito ottenuto aggiungendo un \code{\_r}, che prendono un secondo +argomento \code{char *buf}, in cui l'utente deve specificare il buffer su cui +la stringa deve essere copiata (deve essere di almeno 26 caratteri). Le altre tre funzioni, \func{gmtime}, \func{localtime} e \func{mktime} servono per convertire il tempo dal formato \type{time\_t} a quello di \struct{tm} e @@ -2287,9 +2315,10 @@ locale; \func{mktime} esegue la conversione inversa. Anche in questo caso le prime due funzioni restituiscono l'indirizzo di una struttura allocata staticamente, per questo sono state definite anche altre -due versioni rientranti (con la solita estensione \code{\_r}), che prevedono -un secondo argomento \code{struct tm *result}, fornito dal chiamante, che deve -preallocare la struttura su cui sarà restituita la conversione. +due versioni \index{funzioni!rientranti} rientranti (con la solita estensione +\code{\_r}), che prevedono un secondo argomento \code{struct tm *result}, +fornito dal chiamante, che deve preallocare la struttura su cui sarà +restituita la conversione. Come mostrato in fig.~\ref{fig:sys_tm_struct} il \textit{broken-down time} permette di tenere conto anche della differenza fra tempo universale e ora @@ -2417,7 +2446,7 @@ un errore nell'esecuzione di una funzione, ma di norma questo viene riportato semplicemente usando un opportuno valore di ritorno della funzione invocata. Inoltre il sistema di classificazione degli errori è basato sull'architettura a processi, e presenta una serie di problemi nel caso lo si debba usare con i -thread. +\itindex{thread} \textit{thread}. \subsection{La variabile \var{errno}} @@ -2435,10 +2464,11 @@ che c' 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{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 + problemi (ad esempio nel caso dei \itindex{thread} \textit{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 + \itindex{thread} \textit{thread}.} definita nell'header \file{errno.h}; la variabile è in genere definita come \direct{volatile} dato che può essere cambiata in modo asincrono da un segnale (si veda sez.~\ref{sec:sig_sigchld} per un esempio, ricordando quanto trattato in sez.~\ref{sec:proc_race_cond}), @@ -2498,13 +2528,14 @@ La funzione utilizza una stringa statica che non deve essere modificata dal programma; essa è utilizzabile solo fino ad una chiamata successiva a \func{strerror} o \func{perror}, nessun'altra funzione di libreria tocca questa stringa. In ogni caso l'uso di una stringa statica rende la funzione -non rientrante, per cui nel caso si usino i thread le librerie -forniscono\footnote{questa funzione è la versione prevista dalle \acr{glibc}, - ed effettivamente definita in \file{string.h}, ne esiste una analoga nello - standard SUSv3 (quella riportata dalla pagina di manuale), che restituisce - \code{int} al posto di \code{char *}, e che tronca la stringa restituita a - \param{size}.} una apposita versione rientrante \func{strerror\_r}, il cui -prototipo è: +non \index{funzioni!rientranti} rientrante, per cui nel caso si usino i +\itindex{thread} \textit{thread} le librerie forniscono\footnote{questa + funzione è la versione prevista dalle \acr{glibc}, ed effettivamente + definita in \file{string.h}, ne esiste una analoga nello standard SUSv3 + (quella riportata dalla pagina di manuale), che restituisce \code{int} al + posto di \code{char *}, e che tronca la stringa restituita a + \param{size}.} una apposita versione \index{funzioni!rientranti} rientrante +\func{strerror\_r}, il cui prototipo è: \begin{prototype}{string.h} {char * strerror\_r(int errnum, char *buf, size\_t size)} @@ -2524,9 +2555,10 @@ prototipo \noindent La funzione è analoga a \func{strerror} ma restituisce la stringa di errore -nel buffer \param{buf} che il singolo thread deve allocare autonomamente per -evitare i problemi connessi alla condivisione del buffer statico. Il messaggio -è copiato fino alla dimensione massima del buffer, specificata dall'argomento +nel buffer \param{buf} che il singolo \itindex{thread} \textit{thread} deve +allocare autonomamente per evitare i problemi connessi alla condivisione del +buffer statico. Il messaggio è copiato fino alla dimensione massima del +buffer, specificata dall'argomento \param{size}, che deve comprendere pure il carattere di terminazione; altrimenti la stringa viene troncata. @@ -2696,7 +2728,7 @@ che errori relativi alla stessa linea non vengano ripetuti. % LocalWords: strftime thread EOF modifiable lvalue app errcode strerror LC at % LocalWords: perror string errnum MESSAGES error message ErrCode strtol log % LocalWords: program invocation argv printf print progname exit count fname -% LocalWords: lineno one standardese Di +% LocalWords: lineno one standardese Di page Wed Wednesday Apr April PM AM @@ -2704,3 +2736,4 @@ che errori relativi alla stessa linea non vengano ripetuti. %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: CEST