X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=ca0510985e39fdad1f8b623e0fa648a8e47ada13;hp=68848c178adbe0f3d441ab49fff007b08bf0daf6;hb=7b43a7843d483c826a6ed13224208c615a23c4d6;hpb=8e1c72a56bbdf56f1b1590101495c5066e6cb247 diff --git a/system.tex b/system.tex index 68848c1..ca05109 100644 --- a/system.tex +++ b/system.tex @@ -344,11 +344,9 @@ relative spiegazioni, si può trovare nel manuale delle \acr{glibc}. Valore massimo del tipo di dato \type{ssize\_t}.\\ \texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} & - Il numero di \itindex{clock~tick} - \textit{clock tick} al secondo, + Il numero di \textit{clock tick} al secondo, cioè l'unità di misura del - \itindex{process~time} \textit{process - time} (vedi + \textit{process time} (vedi sez.~\ref{sec:sys_unix_time}).\\ \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}& Indica se è supportato il \textit{job @@ -409,7 +407,7 @@ riportate in tab.~\ref{tab:sys_file_macro}. \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\ \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\ \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ - \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe + \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una \textit{pipe} (vedi sez.~\ref{sec:ipc_pipes}).\\ \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo canonico (vedi sez.~\ref{sec:term_io_design}).\\ @@ -441,7 +439,7 @@ analoghe di tab.~\ref{tab:sys_posix1_general}. \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una - pipe.\\ + \textit{pipe}.\\ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di terminale in modo canonico.\\ \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input @@ -776,9 +774,9 @@ La struttura usata da entrambe le funzioni è allocata staticamente, per questo 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 \index{funzioni!rientranti} rientranti; per questo motivo ne esistono -anche due versioni alternative (denotate dalla solita estensione \code{\_r}), -i cui prototipi sono: +essere rientranti; per questo motivo ne esistono anche due versioni +alternative (denotate dalla solita estensione \code{\_r}), i cui prototipi +sono: \begin{funcproto}{ \fhead{pwd.h} @@ -838,8 +836,8 @@ i loro prototipi sono: \end{funcproto} Come per le precedenti per gli utenti esistono anche le analoghe versioni -\index{funzioni!rientranti} rientranti che di nuovo utilizzano la stessa -estensione \code{\_r}; i loro prototipi sono: +rientranti che di nuovo utilizzano la stessa estensione \code{\_r}; i loro +prototipi sono: \begin{funcproto}{ \fhead{grp.h} @@ -900,23 +898,19 @@ di utenti e gruppi, con il formato classico di \conffile{/etc/passwd} e \hline \funcm{fgetpwent} & Legge una voce dal file di registro degli utenti specificato.\\ - \funcm{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ + \funcm{fgetpwent\_r}& Come la precedente, ma rientrante.\\ \funcm{putpwent} & Immette una voce in un file di registro degli utenti.\\ \funcm{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\ - \funcm{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ + \funcm{getpwent\_r} & Come la precedente, ma rientrante.\\ \funcm{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\ \funcm{endpwent} & Chiude \conffile{/etc/passwd}.\\ \funcm{fgetgrent} & Legge una voce dal file di registro dei gruppi specificato.\\ - \funcm{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ + \funcm{fgetgrent\_r}& Come la precedente, ma rientrante.\\ \funcm{putgrent} & Immette una voce in un file di registro dei gruppi.\\ \funcm{getgrent} & Legge una voce da \conffile{/etc/group}.\\ - \funcm{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ + \funcm{getgrent\_r} & Come la precedente, ma rientrante.\\ \funcm{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\ \funcm{endgrent} & Chiude \conffile{/etc/group}.\\ \hline @@ -1134,11 +1128,10 @@ hanno lo stesso identico comportamento. Per completezza viene definita anche Come già visto in sez.~\ref{sec:sys_user_group}, l'uso di strutture allocate staticamente rende le funzioni di lettura dei dati appena illustrate 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, i rispettivi prototipi sono: +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, i rispettivi prototipi sono: \begin{funcproto}{ \fhead{utmp.h} @@ -1158,10 +1151,9 @@ aggiuntivi, i rispettivi prototipi sono: \end{funcproto} Le funzioni si comportano esattamente come le precedenti analoghe non -\index{funzioni!rientranti} rientranti, solo che restituiscono il risultato -all'indirizzo specificato dal primo argomento aggiuntivo \param{buffer} mentre -il secondo, \param{result)} viene usato per restituire il puntatore al buffer -stesso. +rientranti, solo che restituiscono il risultato all'indirizzo specificato dal +primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result)} +viene usato per restituire il puntatore al buffer stesso. Infine le \acr{glibc} forniscono altre due funzioni, \funcd{updwtmp} e \funcd{logwtmp}, come estensione per scrivere direttamente delle voci nel file @@ -1594,8 +1586,7 @@ specifico segnale o il fallimento della \textit{system call} che lo ha provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU} in cui si ha in comportamento diverso per il superamento dei due limiti e \const{RLIMIT\_CORE} che influenza soltanto la dimensione o l'eventuale -creazione dei file di \itindex{core~dump} \textit{core dump} (vedi -sez.~\ref{sec:sig_standard}). +creazione dei file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}). Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit} @@ -1667,19 +1658,18 @@ riportati nel seguente elenco: \textit{Address Space}, (vedi sez.~\ref{sec:proc_mem_gen}). Se il limite viene superato dall'uso di funzioni come \func{brk}, \func{mremap} o \func{mmap} esse falliranno con un errore di \errcode{ENOMEM}, mentre se il - superamento viene causato dalla crescita dello \itindex{stack} - \textit{stack} il processo riceverà un segnale di \signal{SIGSEGV}. Dato che - il valore usato è un intero di tipo \ctyp{long} nelle macchine a 32 bit - questo può assumere un valore massimo di 2Gb (anche se la memoria - disponibile può essere maggiore), in tal caso il limite massimo indicabile - resta 2Gb, altrimenti la risorsa si dà per non limitata. + superamento viene causato dalla crescita dello \textit{stack} il processo + riceverà un segnale di \signal{SIGSEGV}. Dato che il valore usato è un + intero di tipo \ctyp{long} nelle macchine a 32 bit questo può assumere un + valore massimo di 2Gb (anche se la memoria disponibile può essere maggiore), + in tal caso il limite massimo indicabile resta 2Gb, altrimenti la risorsa si + dà per non limitata. \item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima - dimensione per un file di \itindex{core~dump} \textit{core dump} (vedi + dimensione per un file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File di dimensioni maggiori verranno troncati a questo valore, mentre con un - valore nullo si bloccherà la creazione dei \itindex{core~dump} \textit{core - dump}. + valore nullo si bloccherà la creazione dei \textit{core dump}. \item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il @@ -1697,7 +1687,7 @@ riportati nel seguente elenco: processo con la prima ricezione. \item[\const{RLIMIT\_DATA}] Questa risorsa indica, in byte, la massima - dimensione del \index{segmento!dati} segmento dati di un processo (vedi + dimensione del segmento dati di un processo (vedi sez.~\ref{sec:proc_mem_layout}). Il tentativo di allocare più memoria di quanto indicato dal limite corrente causa il fallimento della funzione di allocazione eseguita (\func{brk} o \func{sbrk}) con un errore di @@ -1718,14 +1708,13 @@ riportati nel seguente elenco: \item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare massimo di memoria che può essere bloccata in RAM da un processo (vedi - sez.~\ref{sec:proc_mem_lock}). Dato che il \itindex{memory~locking} - \textit{memory locking} viene effettuato sulle pagine di memoria, il valore - indicato viene automaticamente arrotondato al primo multiplo successivo - della dimensione di una pagina di memoria. Il limite comporta il fallimento - delle \textit{system call} che eseguono il \textit{memory locking} - (\func{mlock}, \func{mlockall} ed anche, vedi - sez.~\ref{sec:file_memory_map}, \func{mmap} con l'operazione - \const{MAP\_LOCKED}). + sez.~\ref{sec:proc_mem_lock}). Dato che il \textit{memory locking} viene + effettuato sulle pagine di memoria, il valore indicato viene automaticamente + arrotondato al primo multiplo successivo della dimensione di una pagina di + memoria. Il limite comporta il fallimento delle \textit{system call} che + eseguono il \textit{memory locking} (\func{mlock}, \func{mlockall} ed anche, + vedi sez.~\ref{sec:file_memory_map}, \func{mmap} con l'operazione + \const{MAP\_LOCKED}). Dal kernel 2.6.9 questo limite comprende anche la memoria che può essere bloccata da ciascun utente nell'uso della memoria condivisa (vedi @@ -1771,10 +1760,10 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa \itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size}) cioè l'ammontare della memoria associata al processo che risiede effettivamente in RAM e non a quella eventualmente portata sulla \textit{swap} o non ancora - caricata dal filesystem per il \index{segmento!testo} segmento testo del - programma. Ha effetto solo sulle chiamate a \func{madvise} con - \const{MADV\_WILLNEED} (vedi sez.~\ref{sec:file_memory_map}). Presente solo - sui i kernel precedenti il 2.4.30. + caricata dal filesystem per il segmento testo del programma. Ha effetto + solo sulle chiamate a \func{madvise} con \const{MADV\_WILLNEED} (vedi + sez.~\ref{sec:file_memory_map}). Presente solo sui i kernel precedenti il + 2.4.30. \item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della priorità statica che un processo può assegnarsi o assegnare con @@ -1804,9 +1793,9 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa introdotto con il kernel 2.6.8. \item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima - dimensione dello \itindex{stack} \textit{stack} del processo. Se il processo - esegue operazioni che estendano lo \textit{stack} oltre questa dimensione - riceverà un segnale di \signal{SIGSEGV}. + dimensione dello \textit{stack} del processo. Se il processo esegue + operazioni che estendano lo \textit{stack} oltre questa dimensione riceverà + un segnale di \signal{SIGSEGV}. A partire dal kernel 2.6.23 questo stesso limite viene applicato per la gran parte delle architetture anche ai dati che possono essere passati come @@ -2141,29 +2130,31 @@ infatti calcola tre tempi: \end{basedescript} La somma di \textit{user time} e \textit{system time} indica il -\itindex{process~time} \textit{process time}, vale a dire il tempo di -processore totale che il sistema ha effettivamente utilizzato per eseguire il -programma di un certo processo. Si può ottenere un riassunto dei valori di -questi tempi quando si esegue un qualsiasi programma lanciando quest'ultimo -come argomento del comando \cmd{time}. - -Come accennato il \itindex{process~time} \textit{process time} viene misurato -nei cosiddetti \itindex{clock~tick} \textit{clock tick}. Un tempo questo -corrispondeva al numero di interruzioni effettuate dal timer di sistema, oggi -lo standard POSIX richiede che esso sia espresso come multiplo 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 che, come accennato in sez.~\ref{sec:proc_hierarchy} e -come vedremo a breve, è invece data dalla costante \const{HZ}. +\textit{process time}, vale a dire il tempo di processore totale che il +sistema ha effettivamente utilizzato per eseguire il programma di un certo +processo. Si può ottenere un riassunto dei valori di questi tempi quando si +esegue un qualsiasi programma lanciando quest'ultimo come argomento del +comando \cmd{time}. + +\itindbeg{clock~tick} + +Come accennato il \textit{process time} viene misurato nei cosiddetti +\textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni +effettuate dal timer di sistema, oggi lo standard POSIX richiede che esso sia +espresso come multiplo 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 che, come accennato in +sez.~\ref{sec:proc_hierarchy} e come vedremo a breve, è invece data dalla +costante \const{HZ}. Il tipo di dato usato per questo tempo, \type{clock\_t}, con questa convenzione ha una risoluzione del microsecondo. Ma non tutte le funzioni di sistema come vedremo seguono questa convenzione, in tal caso il numero di -\itindex{clock~tick} \textit{clock tick} al secondo può essere ricavato anche -attraverso \func{sysconf} richiedendo il valore della costante -\const{\_SC\_CLK\_TCK} (vedi sez.~\ref{sec:sys_limits}). Il vecchio simbolo -\const{CLK\_TCK} definito in \headfile{time.h} è ormai considerato obsoleto e -non deve essere usato. +\textit{clock tick} al secondo può essere ricavato anche attraverso +\func{sysconf} richiedendo il valore della costante \const{\_SC\_CLK\_TCK} +(vedi sez.~\ref{sec:sys_limits}). Il vecchio simbolo \const{CLK\_TCK} +definito in \headfile{time.h} è ormai considerato obsoleto e non deve essere +usato. In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e @@ -2179,9 +2170,9 @@ le architetture, ma dal 2.6.13 il valore è diventato una opzione di compilazione del kernel, con un default di 250 e valori possibili di 100, 250, 1000. Dal 2.6.20 è stato aggiunto anche il valore 300 che è divisibile per le frequenze di refresh della televisione (50 o 60 Hz). Si può pensare che questi -valori determinino anche la corrispondente durata dei \itindex{clock~tick} -\textit{clock tick}, ma in realtà questa granularità viene calcolata in -maniera indipendente usando la costante del kernel \const{USER\_HZ}. +valori determinino anche la corrispondente durata dei \textit{clock tick}, ma +in realtà questa granularità viene calcolata in maniera indipendente usando la +costante del kernel \const{USER\_HZ}. Fino al kernel 2.6.21 la durata di un \textit{jiffy} costituiva la risoluzione massima ottenibile nella misura dei tempi impiegabile in una \textit{system @@ -2191,6 +2182,7 @@ divenuto possibile ottenere, per le funzioni di attesa ed i timer, la massima risoluzione possibile fornita dall'hardware. Torneremo su questo in sez.~\ref{sec:sig_timer_adv}. +\itindend{clock~tick} \subsection{La gestione del \textit{process time}} @@ -2221,12 +2213,12 @@ utilizzato dallo stesso; il suo prototipo è: \var{errno} non viene usata.} \end{funcproto} -La funzione restituisce il tempo in \itindex{clock~tick} \textit{clock tick} -ma la \acr{glibc} segue lo standard POSIX e quindi se si vuole il tempo in -secondi occorre dividere il risultato per la costante -\const{CLOCKS\_PER\_SEC}. 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. +La funzione restituisce il tempo in \textit{clock tick} ma la \acr{glibc} +segue lo standard POSIX e quindi se si vuole il tempo in secondi occorre +dividere il risultato per la costante \const{CLOCKS\_PER\_SEC}. 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. La funzione è presente anche nello standard ANSI C, ma in tal caso non è previsto che il valore ritornato indichi un intervallo di tempo ma solo un @@ -2303,7 +2295,7 @@ il comportamento è stato adeguato allo standard a partire dalla versione 2.6.9. A differenza di quanto avviene per \func{clock} i valori restituiti nei campi -di una struttura \struct{tms} sono misurati in numero di \itindex{clock~tick} +di una struttura \struct{tms} sono misurati in numero di \textit{clock tick} effettivi e non in multipli di \const{CLOCKS\_PER\_SEC}, pertanto per ottenere il valore effettivo in secondi occorrerà dividere per il risultato di \code{sysconf(\_SC\_CLK\_TCK)}. @@ -2315,12 +2307,12 @@ versioni del kernel. Fino al kernel 2.4 si faceva infatti riferimento al momento dell'avvio del kernel. Con il kernel 2.6 si fa riferimento a $2^{32}/\mathtt{HZ}-300$ secondi prima dell'avvio. -Considerato che il numero dei \itindex{clock~tick} \textit{clock tick} per un -kernel che è attivo da molto tempo può eccedere le dimensioni per il tipo -\type{clock\_t} il comportamento più opportuno per i programmi è di ignorare -comunque il valore di ritorno della funzione e ricorrere alle funzioni per il -tempo di calendario del prossimo paragrafo qualora si voglia calcolare il -tempo effettivamente trascorso dall'inizio del programma. +Considerato che il numero dei \textit{clock tick} per un kernel che è attivo +da molto tempo può eccedere le dimensioni per il tipo \type{clock\_t} il +comportamento più opportuno per i programmi è di ignorare comunque il valore +di ritorno della funzione e ricorrere alle funzioni per il tempo di calendario +del prossimo paragrafo qualora si voglia calcolare il tempo effettivamente +trascorso dall'inizio del programma. Infine si tenga presente che per dei limiti nelle convenzioni per il ritorno dei valori delle \textit{system call} su alcune architetture hardware (ed in @@ -2593,7 +2585,7 @@ riportate in tab.~\ref{tab:sys_timex_mode}. specificato nel campo \var{constant} di \struct{timex}.\\ \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} - \itindex{clock~tick} del timer in + del timer in microsecondi, espresso nel campo \var{tick} di \struct{timex}.\\ \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum @@ -2723,9 +2715,8 @@ a \func{tzset} (che vedremo a breve), in modo che la data espressa tenga conto del fuso orario. In realtà \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 -\index{funzioni!rientranti} rientranti POSIX.1c e SUSv2 prevedono due -sostitute \index{funzioni!rientranti} rientranti, il cui nome è al solito +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). @@ -2762,12 +2753,11 @@ effettua una chiamata preventiva a \func{tzset}. Anche in questo caso le due funzioni restituiscono l'indirizzo di una struttura allocata staticamente, per questo sono state definite anche altre -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. La versione rientrante di \func{localtime} però non -effettua la chiamata preventiva a \func{tzset} che deve essere eseguita a cura -dell'utente. +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. La versione +rientrante di \func{localtime} però non effettua la chiamata preventiva a +\func{tzset} che deve essere eseguita a cura dell'utente. Infine \func{mktime} esegue la conversione di un \textit{broken-down time} a partire da una struttura \struct{tm} restituendo direttamente un valore di @@ -2783,12 +2773,11 @@ informazioni relative al proprio fuso orario per determinare lo stato dell'ora legale. La funzione inoltre modifica i valori della struttura \struct{tm} in forma di -\itindex{value~result~argument} \textit{value result argument}, normalizzando -i valori dei vari campi, impostando i valori risultanti per \var{tm\_wday} e -\var{tm\_yday} e assegnando a \var{tm\_isdst} il valore (positivo o nullo) -corrispondente allo stato dell'ora legale. La funzione inoltre provvede ad -impostare il valore della \index{variabili!globali} variabile globale -\var{tzname}. +\textit{value result argument}, normalizzando i valori dei vari campi, +impostando i valori risultanti per \var{tm\_wday} e \var{tm\_yday} e +assegnando a \var{tm\_isdst} il valore (positivo o nullo) corrispondente allo +stato dell'ora legale. La funzione inoltre provvede ad impostare il valore +della variabile globale \var{tzname}. \itindend{calendar~time} @@ -2799,8 +2788,8 @@ impostare il valore della \index{variabili!globali} variabile globale \includestruct{listati/time_zone_var.c} \end{minipage} \normalsize - \caption{Le \index{variabili!globali} variabili globali usate per la - gestione delle \itindex{timezone} \textit{timezone}.} + \caption{Le variabili globali usate per la gestione delle \itindex{timezone} + \textit{timezone}.} \label{fig:sys_tzname} \end{figure} @@ -2808,12 +2797,11 @@ Come accennato l'uso del \textit{broken-down time} permette di tenere conto anche della differenza fra tempo universale e ora locale, compresa l'eventuale ora legale. Questo viene fatto dalle funzioni di conversione grazie alle informazioni riguardo la propria \itindex{timezone} \textit{timezone} -mantenute nelle tre \index{variabili!globali} variabili globali mostrate in -fig.~\ref{fig:sys_tzname}, cui si si può accedere direttamente includendo -\headfile{time.h}. Come illustrato queste variabili vengono impostate -internamente da alcune delle delle precedenti funzioni di conversione, ma lo -si può fare esplicitamente chiamando direttamente la funzione \funcd{tzset}, -il cui prototipo è: +mantenute nelle tre variabili globali mostrate in fig.~\ref{fig:sys_tzname}, +cui si si può accedere direttamente includendo \headfile{time.h}. Come +illustrato queste variabili vengono impostate internamente da alcune delle +delle precedenti funzioni di conversione, ma lo si può fare esplicitamente +chiamando direttamente la funzione \funcd{tzset}, il cui prototipo è: \begin{funcproto}{ \fhead{sys/timex.h} @@ -2975,13 +2963,13 @@ c'è stato un errore. Di solito questo valore, a seconda della funzione, è $-1$ o un puntatore nullo o la costante \val{EOF}; ma questo valore segnala solo che c'è stato un errore, e non il tipo di errore. -Per riportare il tipo di errore il sistema usa \index{variabili!globali} la -variabile globale \var{errno}, definita nell'header \headfile{errno.h}. Come -accennato l'uso di una variabile globale può comportare problemi nel caso dei -\itindex{thread} \textit{thread}, ma lo standard ISO C consente anche di -definire \var{errno} come un cosiddetto ``\textit{modifiable lvalue}'', cosa -che consente di usare anche una macro, e questo è infatti il metodo usato da -Linux per renderla locale ai singoli \itindex{thread} \textit{thread}. +Per riportare il tipo di errore il sistema usa la variabile globale +\var{errno}, definita nell'header \headfile{errno.h}. Come accennato l'uso di +una variabile globale può comportare problemi nel caso dei \itindex{thread} +\textit{thread}, ma lo standard ISO C consente anche di definire \var{errno} +come un cosiddetto ``\textit{modifiable lvalue}'', cosa che consente di usare +anche una macro, e questo è infatti il metodo usato da Linux per renderla +locale ai singoli \itindex{thread} \textit{thread}. La variabile è in genere definita come \direct{volatile} dato che può essere cambiata in modo asincrono da un segnale, per un esempio si veda @@ -3054,10 +3042,9 @@ La funzione \func{strerror} 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} e nessun'altra funzione di libreria tocca questa stringa. In ogni caso l'uso di una stringa statica rende -la funzione non \index{funzioni!rientranti} rientrante, per cui nel caso si -usino i \itindex{thread} \textit{thread} la \acr{glibc} fornisce una apposita -versione \index{funzioni!rientranti} rientrante \funcd{strerror\_r}, il cui -prototipo è: +la funzione non rientrante, per cui nel caso si usino i \itindex{thread} +\textit{thread} la \acr{glibc} fornisce una apposita versione rientrante +\funcd{strerror\_r}, il cui prototipo è: \begin{funcproto}{ \fhead{string.h} @@ -3110,7 +3097,7 @@ riferiscono all'ultimo errore avvenuto. La stringa specificata con personalizzazione (ad esempio l'indicazione del contesto in cui si è verificato), seguita dai due punti e da uno spazio, il messaggio è terminato con un a capo. Il messaggio può essere riportato anche usando le due -\index{variabili!globali} variabili globali: +variabili globali: \includecodesnip{listati/errlist.c} dichiarate in \headfile{errno.h}. La prima contiene i puntatori alle stringhe di errore indicizzati da \var{errno}; la seconda esprime il valore più alto @@ -3185,12 +3172,11 @@ sez.~\ref{sec:file_formatted_io}), ed i relativi argomenti devono essere forniti allo stesso modo, mentre \param{errnum} indica l'errore che si vuole segnalare (non viene quindi usato il valore corrente di \var{errno}). -La funzione stampa sullo \itindex{standard~error} \textit{standard error} il -nome del programma, come indicato dalla \index{variabili!globali} variabile -globale \var{program\_name}, seguito da due punti ed uno spazio, poi dalla -stringa generata da \param{format} e dagli argomenti seguenti, seguita da due -punti ed uno spazio infine il messaggio di errore relativo ad \param{errnum}, -il tutto è terminato da un a capo. +La funzione stampa sullo \textit{standard error} il nome del programma, come +indicato dalla variabile globale \var{program\_name}, seguito da due punti ed +uno spazio, poi dalla stringa generata da \param{format} e dagli argomenti +seguenti, seguita da due punti ed uno spazio infine il messaggio di errore +relativo ad \param{errnum}, il tutto è terminato da un a capo. Il comportamento della funzione può essere ulteriormente controllato se si definisce una variabile \var{error\_print\_progname} come puntatore ad una @@ -3201,8 +3187,8 @@ L'argomento \param{status} può essere usato per terminare direttamente il programma in caso di errore, nel qual caso \func{error} dopo la stampa del messaggio di errore chiama \func{exit} con questo stato di uscita. Se invece il valore è nullo \func{error} ritorna normalmente ma viene incrementata -un'altra \index{variabili!globali} variabile globale, -\var{error\_message\_count}, che tiene conto di quanti errori ci sono stati. +un'altra variabile globale, \var{error\_message\_count}, che tiene conto di +quanti errori ci sono stati. Un'altra funzione per la stampa degli errori, ancora più sofisticata, che prende due argomenti aggiuntivi per indicare linea e file su cui è avvenuto @@ -3222,10 +3208,9 @@ l'errore è \funcd{error\_at\_line}; il suo prototipo è: \noindent ed il suo comportamento è identico a quello di \func{error} se non per il fatto che, separati con il solito due punti-spazio, vengono inseriti un nome di file indicato da \param{fname} ed un numero di linea subito dopo la -stampa del nome del programma. Inoltre essa usa un'altra -\index{variabili!globali} variabile globale, \var{error\_one\_per\_line}, che -impostata ad un valore diverso da zero fa si che errori relativi alla stessa -linea non vengano ripetuti. +stampa del nome del programma. Inoltre essa usa un'altra variabile globale, +\var{error\_one\_per\_line}, che impostata ad un valore diverso da zero fa si +che errori relativi alla stessa linea non vengano ripetuti. % LocalWords: filesystem like kernel saved header limits sysconf sez tab float