X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=a761b4dcd31e2431c3ea9f19294975863f1ee21f;hp=84dad32d73be5035e83741fbb7dc9fd75fca43e2;hb=26f7a8bb19c6cb198c213757a97b6ac79e40db4b;hpb=fa15a3f1ecd64efd8440e46d398fd9976abc3d25 diff --git a/system.tex b/system.tex index 84dad32..a761b4d 100644 --- a/system.tex +++ b/system.tex @@ -1158,7 +1158,7 @@ argomenti aggiuntivi, i rispettivi prototipi sono: Le funzioni si comportano esattamente come le precedenti analoghe non rientranti, solo che restituiscono il risultato all'indirizzo specificato dal -primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result)} +primo argomento aggiuntivo \param{buffer} mentre il secondo, \param{result}, viene usato per restituire il puntatore al buffer stesso. Infine la \acr{glibc} fornisce altre due funzioni, \funcd{updwtmp} e @@ -1282,15 +1282,16 @@ illustra i comandi attualmente disponibili: \item[\constd{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata immediatamente la procedura di riavvio usando il comando fornito - nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'} + nell'argomento \param{arg} che viene stampato al posto di \texttt{'\%s'} (veniva usato per lanciare un altro programma al posto di \cmd{init}). Nelle versioni recenti questo argomento viene ignorato ed il riavvio può essere controllato dall'argomento di avvio del kernel \texttt{reboot=...} Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi saranno perduti. + % TODO: trattare LINUX_REBOOT_CMD_SW_SUSPEND + % TODO: rimandare agli effetti di reboot sui namespace \end{basedescript} - Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si può eseguire un riavvio immediato pre-caricando una immagine del kernel, che verrà eseguita direttamente. Questo meccanismo consente di evitare la @@ -1364,14 +1365,14 @@ che sia effettivamente eseguibile sul proprio processore. \hline \constd{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito automaticamente in caso di crollo del - sistema.\\ + sistema (dal kernel 2.6.13).\\ \constd{KEXEC\_PRESERVE\_CONTEXT}& Viene preservato lo stato dei programmi e dei dispositivi prima dell'esecuzione del nuovo kernel. Viene usato principalmente per l'ibernazione del sistema ed ha senso solo se si è indicato un numero di segmento maggiore - di zero.\\ + di zero (dal kernel 2.6.27).\\ \hline \constd{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella architettura corrente. \\ @@ -1401,30 +1402,14 @@ più in grado di essere eseguito in maniera coerente. Il secondo valore, programmi e dei dispositivi, e viene in genere usato per realizzare la cosiddetta ibernazione in RAM. -% TODO: introdotta con il kernel 3.17 è stata introdotta -% kexec_file_load, per caricare immagine firmate per il secure boot, -% vedi anche http://lwn.net/Articles/603116/ - -% TODO documentare keyctl ???? -% (fare sezione dedicata ????) - -% TODO documentare la Crypto API del kernel - -% TODO documentare la syscall getrandom, introdotta con il kernel 3.17, vedi -% http://lwn.net/Articles/606141/, ed introdotta con le glibc solo con la -% versione 2.25, vedi https://lwn.net/Articles/711013/ - -%\subsection{La gestione delle chiavi crittografiche} -%\label{sec:keyctl_management} +% TODO: con il kernel 3.17 è stata introdotta kexec_file_load, per caricare +% immagine firmate per il secure boot, vedi anche +% http://lwn.net/Articles/603116/ -%TODO non è chiaro se farlo qui, ma documentare la syscall bpf aggiunta con il -% kernel 3.18, vedi http://lwn.net/Articles/612878/; al riguardo vedi anche -% https://lwn.net/Articles/660331/ \section{Il controllo dell'uso delle risorse} \label{sec:sys_res_limits} - Dopo aver esaminato in sez.~\ref{sec:sys_management} le funzioni che permettono di controllare le varie caratteristiche, capacità e limiti del sistema a livello globale, in questa sezione tratteremo le varie funzioni che @@ -1540,7 +1525,7 @@ sez.~\ref{sec:sys_unix_time}). I campi \var{ru\_minflt} e \var{ru\_majflt} servono a quantificare l'uso della memoria virtuale e corrispondono rispettivamente al numero di \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen}) avvenuti senza richiedere I/O su disco (i -cosiddetti \textit{minor page fault}), a quelli che invece han richiesto I/O +cosiddetti \textit{minor page fault}), e a quelli che invece han richiesto I/O su disco (detti invece \textit{major page fault}).% mentre \var{ru\_nswap} ed al numero di volte che % il processo è stato completamente tolto dalla memoria per essere inserito @@ -1642,13 +1627,13 @@ limite corrente e limite massimo. \label{fig:sys_rlimit_struct} \end{figure} -Come accennato processo ordinario può alzare il proprio limite corrente fino -al valore del limite massimo, può anche ridurre, irreversibilmente, il valore -di quest'ultimo. Nello specificare un limite, oltre a fornire dei valori -specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette -di sbloccare completamente l'uso di una risorsa. Si ricordi però che solo un -processo con i privilegi di amministratore\footnote{per essere precisi in - questo caso quello che serve è la \textit{capability} +Come accennato un processo ordinario può alzare il proprio limite corrente +fino al valore del limite massimo, e può anche ridurre, irreversibilmente, il +valore di quest'ultimo. Nello specificare un limite, oltre a fornire dei +valori specifici, si può anche usare la costante \const{RLIM\_INFINITY} che +permette di sbloccare completamente l'uso di una risorsa. Si ricordi però che +solo un processo con i privilegi di amministratore\footnote{per essere precisi + in questo caso quello che serve è la \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. @@ -1657,7 +1642,7 @@ Ciascuna risorsa su cui si possono applicare dei limiti è identificata da uno specifico valore dell'argomento \param{resource}, i valori possibili per questo argomento, ed il significato della risorsa corrispondente, dei rispettivi limiti e gli effetti causati dal superamento degli stessi sono -riportati nel seguente elenco: +riportati nel seguente elenco. \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}} \item[\constd{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione @@ -1697,8 +1682,8 @@ riportati nel seguente elenco: 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 - \errcode{ENOMEM}. + allocazione eseguita (\func{brk} o \func{sbrk} e dal kernel 4.7 anche + \func{mmap}) con un errore di \errcode{ENOMEM}. \item[\constd{RLIMIT\_FSIZE}] Questa risorsa indica, in byte, la massima dimensione di un file che un processo può usare. Se il processo cerca di @@ -1756,6 +1741,13 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa descriptor farà fallire la funzione (\func{open}, \func{dup}, \func{pipe}, ecc.) con un errore \errcode{EMFILE}. + % TODO: aggiungere Dal 4.5 definisce anche il limite sul numero massimo di + % file descriptor che un processo non privilegiato (senza la capacità + % \const{CAP\_SYS\_RESOURCE}, vedi sez.~\ref{sec:proc_capabilities}) può + % avere in corso di trasmissione verso altri + % processi usando i socket Unix-domain (vedi sez.XXX), il limite si applica + % si applica a \func{sendmsg}. + \item[\constd{RLIMIT\_NPROC}] Questa risorsa indica il numero massimo di processi che possono essere creati dallo stesso utente, che viene identificato con l'\ids{UID} reale (vedi sez.~\ref{sec:proc_access_id}) del @@ -1825,12 +1817,12 @@ Si noti come le due funzioni \func{getrlimit} e \func{setrlimit} consentano di operare solo sul processo corrente. Per questo motivo a partire dal kernel 2.6.36 (e dalla \acr{glibc} 2.13) è stata introdotta un'altra funzione di sistema \funcd{prlimit} il cui scopo è quello di estendere e sostituire le -precedenti. Il suo prototipo è: +precedenti; il suo prototipo è: \begin{funcproto}{ \fhead{sys/resource.h} \fdecl{int prlimit(pid\_t pid, int resource, const struct rlimit *new\_limit,\\ -\phantom{int prlimit(}struct rlimit *old\_limit} +\phantom{int prlimit(}struct rlimit *old\_limit)} \fdesc{Legge e imposta i limiti di una risorsa.} } @@ -1849,7 +1841,7 @@ precedenti. Il suo prototipo è: } \end{funcproto} -La funzione è specifica di Linux e non portabile; per essere usata richiede +La funzione è specifica di Linux e non portabile, per essere usata richiede che sia stata definita la macro \macro{\_GNU\_SOURCE}. Il primo argomento indica il \ids{PID} del processo di cui si vogliono cambiare i limiti e si può usare un valore nullo per indicare il processo chiamante. Per modificare i @@ -1868,6 +1860,8 @@ possibile sia leggere che scrivere, anche in contemporanea, i valori dei limiti. Il significato dell'argomento \param{resource} resta identico rispetto a \func{getrlimit} e \func{setrlimit}, così come i restanti requisiti. +% TODO: a bassa priorità, documentare i vari problemi e cambiamenti nella +% implementazione di queste funzioni dettagliati nella pagina di manuale \subsection{Le informazioni sulle risorse di memoria e processore} \label{sec:sys_memory_res} @@ -1953,8 +1947,8 @@ attivi); anche queste sono informazioni comunque ottenibili attraverso Infine la \acr{glibc} riprende da BSD la funzione \funcd{getloadavg} che permette di ottenere il carico di processore della macchina, in questo modo è -possibile prendere decisioni su quando far partire eventuali nuovi processi. -Il suo prototipo è: +possibile prendere decisioni su quando far partire eventuali nuovi processi, +il suo prototipo è: \begin{funcproto}{ \fhead{stdlib.h} @@ -2013,7 +2007,7 @@ prototipo è: \end{funcproto} La funzione attiva il salvataggio dei dati sul file indicato dal -\textit{pathname} contenuti nella stringa puntata da \param{filename}; la +\textit{pathname} contenuto nella stringa puntata da \param{filename}; la funzione richiede che il processo abbia i privilegi di amministratore (è necessaria la \textit{capability} \const{CAP\_SYS\_PACCT}, vedi sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per @@ -2340,10 +2334,12 @@ primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time} viene espresso normalmente con una variabile di tipo \type{time\_t}, 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 con la funzione \funcd{time} che lo restituisce nel suddetto -formato, il suo prototipo è: +\ctyp{long int}, che di norma corrisponde a 32 bit, cosa che pone un limite al +valore massimo esprimibile al 19 gennaio 2038, per ovviare alla cosa nelle +versioni più recenti viene usato un valore di dimensioni maggiori. Il valore +corrente del \textit{calendar time}, che indicheremo come \textsl{tempo di + sistema}, può essere ottenuto con la funzione \funcd{time} che lo +restituisce nel suddetto formato, il suo prototipo è: \begin{funcproto}{ \fhead{time.h} @@ -2357,7 +2353,9 @@ formato, il suo prototipo è: \end{funcproto} L'argomento \param{t}, se non nullo, deve essere l'indirizzo di una variabile -su cui duplicare il valore di ritorno. +su cui duplicare il valore di ritorno, ma il suo uso è considerato obsoleto e +deve essere sempre specificato come \val{NULL}, nel qual caso la funzione non +può fallire. Analoga a \func{time} è la funzione \funcd{stime} che serve per effettuare l'operazione inversa, e cioè per impostare il tempo di sistema qualora questo @@ -2381,14 +2379,15 @@ sia necessario; il suo prototipo è: Dato che modificare l'ora ha un impatto su tutto il sistema il cambiamento dell'orologio è una operazione privilegiata e questa funzione può essere usata solo da un processo con i privilegi di amministratore (per la precisione la -\textit{capability} \const{CAP\_SYS\_TIME}), altrimenti la chiamata fallirà -con un errore di \errcode{EPERM}. +\textit{capability} \const{CAP\_SYS\_TIME}, vedi +sez.~\ref{sec:proc_capabilities}), altrimenti la chiamata fallirà con un +errore di \errcode{EPERM}. Data la scarsa precisione nell'uso di \type{time\_t}, che ha una risoluzione -massima di un secondo, quando si devono effettuare operazioni sui tempi di -norma l'uso delle due funzioni precedenti è sconsigliato, ed esse sono di -solito sostituite da \funcd{gettimeofday} e \funcd{settimeofday},\footnote{le - due funzioni \func{time} e \func{stime} sono più antiche e derivano da SVr4, +di un secondo, quando si devono effettuare operazioni sui tempi l'uso delle +due funzioni precedenti è sconsigliato, ed esse sono di solito sostituite da +\funcd{gettimeofday} e \funcd{settimeofday},\footnote{le due funzioni + \func{time} e \func{stime} sono più antiche e derivano da SVr4, \func{gettimeofday} e \func{settimeofday} sono state introdotte da BSD, ed in BSD4.3 sono indicate come sostitute delle precedenti, \func{gettimeofday} viene descritta anche in POSIX.1-2001.} i cui prototipi sono: @@ -2462,7 +2461,6 @@ usare la funzione \funcd{adjtime}, il cui prototipo è: } \end{funcproto} - Questa funzione permette di avere un aggiustamento graduale del tempo di sistema in modo che esso sia sempre crescente in maniera monotona. Il valore indicato nella struttura \struct{timeval} puntata da \param{delta} esprime il @@ -2538,9 +2536,10 @@ delle costanti elencate in tab.~\ref{tab:adjtimex_return}. La funzione richiede come argomento il puntatore ad una struttura di tipo \struct{timex}, la cui definizione, effettuata in \headfiled{sys/timex.h}, è riportata in fig.~\ref{fig:sys_timex_struct} per i campi che interessano la -possibilità di essere modificati documentati anche nella pagina di manuale. In -realtà la struttura è stata estesa con ulteriori campi, i cui valori sono -utilizzabili solo in lettura, la cui definizione si può trovare direttamente +possibilità di essere modificati. In realtà la struttura è stata estesa con +ulteriori campi, i cui valori sono utilizzabili solo in lettura, non riportati +in fig.~\ref{fig:sys_timex_struct}, i dettagli di questi campi si possono +recuperare dalla pagina di manuale di \func{adjtimex}. \begin{figure}[!htb] \footnotesize \centering @@ -2563,46 +2562,46 @@ riportate in tab.~\ref{tab:sys_timex_mode}. \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|c|p{8cm}|} + \begin{tabular}[c]{|l|p{8cm}|} \hline - \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\ + \textbf{Nome} & \textbf{Significato}\\ \hline \hline - \constd{ADJ\_OFFSET} & 0x0001 & Imposta la differenza fra il tempo - reale e l'orologio di sistema: - deve essere indicata in microsecondi - nel campo \var{offset} di - \struct{timex}.\\ - \constd{ADJ\_FREQUENCY} & 0x0002 & Imposta la differenza in frequenza - fra il tempo reale e l'orologio di - sistema: deve essere indicata - in parti per milione nel campo - \var{frequency} di \struct{timex}.\\ - \constd{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo - dell'errore sul tempo, espresso in - microsecondi nel campo - \var{maxerror} di \struct{timex}.\\ - \constd{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore - sul tempo, espresso in microsecondi - nel campo \var{esterror} di - \struct{timex}.\\ - \constd{ADJ\_STATUS} & 0x0010 & Imposta alcuni valori di stato - interni usati dal - sistema nella gestione - dell'orologio specificati nel campo - \var{status} di \struct{timex}.\\ - \constd{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del - PLL implementato dal kernel, - specificato nel campo - \var{constant} di \struct{timex}.\\ - \constd{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} - del timer in - microsecondi, espresso nel campo - \var{tick} di \struct{timex}.\\ - \constd{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum - dell'orologio secondo il valore del - campo \var{offset} simulando il - comportamento di \func{adjtime}.\\ + \constd{ADJ\_OFFSET} & Imposta la differenza fra il tempo + reale e l'orologio di sistema: + deve essere indicata in microsecondi + nel campo \var{offset} di + \struct{timex}.\\ + \constd{ADJ\_FREQUENCY} & Imposta la differenza in frequenza + fra il tempo reale e l'orologio di + sistema: deve essere indicata + in parti per milione nel campo + \var{frequency} di \struct{timex}.\\ + \constd{ADJ\_MAXERROR} & Imposta il valore massimo + dell'errore sul tempo, espresso in + microsecondi nel campo + \var{maxerror} di \struct{timex}.\\ + \constd{ADJ\_ESTERROR} & Imposta la stima dell'errore + sul tempo, espresso in microsecondi + nel campo \var{esterror} di + \struct{timex}.\\ + \constd{ADJ\_STATUS} & Imposta alcuni valori di stato + interni usati dal + sistema nella gestione + dell'orologio specificati nel campo + \var{status} di \struct{timex}.\\ + \constd{ADJ\_TIMECONST} & Imposta la larghezza di banda del + PLL implementato dal kernel, + specificato nel campo + \var{constant} di \struct{timex}.\\ + \constd{ADJ\_TICK} & Imposta il valore dei \textit{tick} + del timer in + microsecondi, espresso nel campo + \var{tick} di \struct{timex}.\\ + \constd{ADJ\_OFFSET\_SINGLESHOT}&Chiede uno spostamento una tantum + dell'orologio secondo il valore del + campo \var{offset} simulando il + comportamento di \func{adjtime}.\\ \hline \end{tabular} \caption{Costanti per l'assegnazione del valore del campo \var{mode} della @@ -2675,7 +2674,7 @@ dell'orologio per effettuare gli aggiustamenti del calendario per tenere conto del disallineamento con il tempo solare.\footnote{per dettagli si consulti \url{http://it.wikipedia.org/wiki/Leap_second}.} -I campi \var{tm\_min} e\var{tm\_hour} che indicano rispettivamente minuti ed +I campi \var{tm\_min} e \var{tm\_hour} che indicano rispettivamente minuti ed ore hanno valori compresi rispettivamente fra 0 e 59 e fra 0 e 23. Il campo \var{tm\_mday} che indica il giorno del mese prevede invece un valore compreso fra 1 e 31, ma la \acr{glibc} supporta pure il valore 0 come indicazione @@ -2723,7 +2722,7 @@ Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione di una \textit{timezone} e effettua una chiamata preventiva 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)}. +\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 @@ -2769,40 +2768,30 @@ 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 -tipo \type{time\_t} con il \textit{calendar time}. La funzione ignora i campi -\var{tm\_wday} e \var{tm\_yday} e per gli altri campi normalizza eventuali -valori fuori degli intervalli specificati in precedenza: se cioè si indica un -12 per \var{tm\_mon} si prenderà il gennaio dell'anno successivo. Inoltre la -funzione tiene conto del valore di \var{tm\_isdst} per effettuare le -correzioni relative al fuso orario: un valore positivo indica che deve essere -tenuta in conto l'ora legale, un valore nullo che non deve essere applicata -nessuna correzione, un valore negativo che si deve far ricorso alle +La funzione \func{mktime} esegue invece la conversione di un +\textit{broken-down time} a partire da una struttura \struct{tm} restituendo +direttamente un valore di tipo \type{time\_t} con il \textit{calendar + time}. La funzione ignora i campi \var{tm\_wday} e \var{tm\_yday} e per gli +altri campi normalizza eventuali valori fuori degli intervalli specificati in +precedenza: se cioè si indica un 12 per \var{tm\_mon} si prenderà il gennaio +dell'anno successivo. + +Inoltre la funzione tiene conto del valore di \var{tm\_isdst} per effettuare +le correzioni relative al fuso orario: un valore positivo indica che deve +essere tenuta in conto l'ora legale, un valore nullo che non deve essere +applicata nessuna correzione, un valore negativo che si deve far ricorso alle informazioni relative al proprio fuso orario per determinare lo stato dell'ora -legale. +legale. -La funzione inoltre modifica i valori della struttura \struct{tm} in forma di +La funzione infine modifica i valori della struttura \struct{tm} in forma di \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}. +stato dell'ora legale. La funzione provvede anche ad impostare il valore della +variabile globale \var{tzname}. \itindend{calendar~time} -\begin{figure}[!htb] - \footnotesize - \centering - \begin{minipage}[c]{.75\textwidth} - \includestruct{listati/time_zone_var.c} - \end{minipage} - \normalsize - \caption{Le variabili globali usate per la gestione delle - \textit{timezone}.} - \label{fig:sys_tzname} -\end{figure} - 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 @@ -2832,6 +2821,18 @@ per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come \var{timezone} indica la differenza di fuso orario in secondi, mentre \var{daylight} indica se è attiva o meno l'ora legale. +\begin{figure}[!htb] + \footnotesize + \centering + \begin{minipage}[c]{.75\textwidth} + \includestruct{listati/time_zone_var.c} + \end{minipage} + \normalsize + \caption{Le variabili globali usate per la gestione delle + \textit{timezone}.} + \label{fig:sys_tzname} +\end{figure} + Benché la funzione \func{asctime} fornisca la modalità più immediata per stampare un tempo o una data, la flessibilità non fa parte delle sue caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il @@ -2902,8 +2903,8 @@ Il risultato della funzione è controllato dalla stringa di formato \param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che viene utilizzato come modificatore. Alcuni dei possibili valori che esso può assumere sono riportati in tab.~\ref{tab:sys_strftime_format}.\footnote{per la - precisione si sono riportati definiti dallo standard ANSI C, che sono anche - quelli ripresi in POSIX.1; la \acr{glibc} fornisce anche le estensioni + precisione si sono riportati quelli definiti dallo standard ANSI C che sono + anche quelli ripresi in POSIX.1; la \acr{glibc} fornisce anche le estensioni introdotte da POSIX.2 per il comando \cmd{date}, i valori introdotti da SVID3 e ulteriori estensioni GNU; l'elenco completo dei possibili valori è riportato nella pagina di manuale della funzione.} La funzione tiene conto @@ -2939,7 +2940,7 @@ questo riguardo si rimanda alla lettura della pagina di manuale. Si tenga presente comunque che anche in caso di scansione completamente riuscita la funzione sovrascrive soltanto i campi di \param{tm} indicati dal -formato, la struttura originaria infatti non viene inizializzati e gli altri +formato, la struttura originaria infatti non viene inizializzata e gli altri campi restano ai valori che avevano in precedenza. @@ -2981,9 +2982,9 @@ questo è infatti il metodo usato da Linux per renderla locale ai singoli \textit{thread}. La variabile è in genere definita come \dirct{volatile} dato che può essere -cambiata in modo asincrono da un segnale, per un esempio si veda +cambiata in modo asincrono da un segnale; per un esempio si veda sez.~\ref{sec:sig_sigchld} ricordando quanto trattato in -sez.~\ref{sec:proc_race_cond}). Dato che un gestore di segnale scritto bene si +sez.~\ref{sec:proc_race_cond}. Dato che un gestore di segnale scritto bene si cura di salvare e ripristinare il valore della variabile all'uscita, nella programmazione normale, quando si può fare l'assunzione che i gestori di segnali siano ben scritti, di questo non è necessario preoccuparsi. @@ -3111,7 +3112,9 @@ variabili globali: 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 per un codice di errore, l'utilizzo di una di queste stringhe è -sostanzialmente equivalente a quello di \func{strerror}. +sostanzialmente equivalente a quello di \func{strerror}, ma dato che non è +detto che \var{sys\_errlist} sia stato aggiornato in caso di aggiunta di nuovi +errori, il suo uso è deprecato e si deve sempre usare \func{perror}. \begin{figure}[!htbp] \footnotesize \centering