From b759d33e12e3050636f1a26c3ca821a7510f6936 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 12 Oct 2019 14:00:45 +0200 Subject: [PATCH] Completata revisione del capitolo sulle funzioni di sistema, iniziato segnali. --- errors.tex | 41 ++++++++++---- listati/timex.h | 1 + system.tex | 145 ++++++++++++++++++++++++------------------------ 3 files changed, 105 insertions(+), 82 deletions(-) diff --git a/errors.tex b/errors.tex index 2aa5224..8d7dd0f 100644 --- a/errors.tex +++ b/errors.tex @@ -130,10 +130,10 @@ gestione dei file. \item[\errcode{ESPIPE} \textit{Invalid seek operation}.] Si cercato di eseguire una \func{lseek} su un file che non supporta questa operazione (ad esempio su una \textit{pipe}, da cui il nome). -\item[\errcode{ESTALE} \textit{Stale NFS file handle}.] Indica un problema - interno a NFS causato da cambiamenti del filesystem del sistema remoto. Per - recuperare questa condizione in genere è necessario smontare e rimontare il - filesystem NFS. +\item[\errcode{ESTALE} \textit{Stale file handle}.] Indica un problema interno + ad un filesyste remoto (in genere con NFS) causato da cambiamenti del + filesystem del sistema remoto. Per recuperare questa condizione in genere è + necessario smontare e rimontare il filesystem. \item[\errcode{ETXTBSY} \textit{Text file busy}.] Si è cercato di eseguire un file che è aperto in scrittura, o di scrivere su un file che è in esecuzione. @@ -200,6 +200,10 @@ gestione dei socket e delle connessioni di rete. un indirizzo di destinazione predefinito per il socket. Si ottiene questo errore mandando dato su un socket senza connessione senza averne prima specificato una destinazione. +\item[\errcode{EHOSTDOWN} \textit{Host is down}.] L'host remoto non risponde. +\item[\errcode{EHOSTUNREACH} \textit{No route to host}.] L'host remoto non è + raggiungibile. Si ottiene quando non esiste una rotta di rete per arrivare + all'host remoto con il protocollo di rete utilizzato. \item[\errcode{EISCONN} \textit{Transport endpoint is already connected}.] Si è tentato di connettere un socket che è già connesso. \item[\errcode{EMSGSIZE} \textit{Message too long}.] Le dimensioni di un @@ -262,9 +266,9 @@ attinenti ad errori generici, si trovano qui tutti i codici di errore non specificati nelle sezioni precedenti. \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\errcode{EAGAIN} \textit{Resource temporarily unavailable}.] La funzione è - fallita ma potrebbe funzionare se la chiamata fosse ripetuta. Questo errore - accade in due tipologie di situazioni: +\item[\errcode{EAGAIN} \textit{Resource temporarily unavailable}.] La funzione + è fallita ma potrebbe funzionare se la chiamata fosse ripetuta. Questo + errore accade in due tipologie di situazioni: \begin{itemize} \item Si è effettuata un'operazione che si sarebbe bloccata su un oggetto che è stato posto in modalità non bloccante. Nei vecchi sistemi questo era @@ -426,7 +430,7 @@ messaggio. % TODO verificare i dettagli degli errori del kernel, eventualmente cassare. % \begin{description} -% \item[\errcode{ERESTART} \textit{Interrupted system call should be restarted}.] + % \item[\errcode{ECHRNG} \textit{Channel number out of range}.] % \item[\errcode{EL2NSYNC} \textit{Level 2 not synchronized}.] % \item[\errcode{EL3HLT} \textit{Level 3 halted}.] @@ -441,13 +445,15 @@ messaggio. % \item[\errcode{ENOANO} \textit{No anode}.] % \item[\errcode{EBADRQC} \textit{Invalid request code}.] % \item[\errcode{EBADSLT} \textit{Invalid slot}.] -% \item[\errcode{EDEADLOCK} Identico a \errcode{EDEADLK}.] +% \item[\errcode{EDEADLOCK} Identico a \errcode{EDEADLK}.] + % \item[\errcode{EBFONT} \textit{Bad font file format}.] % \item[\errcode{ENONET} \textit{Machine is not on the network}.] % \item[\errcode{ENOPKG} \textit{Package not installed}.] +% \item[\errcode{EREMOTEIO} \textit{Remote I/O error}.] % \item[\errcode{EADV} \textit{Advertise error}.] % \item[\errcode{ESRMNT} \textit{Srmount error}.] -% \item[\errcode{ECOMM} \textit{Communication error on send}.] +% \item[\errcode{ECOMM} \textit{Communication error on send}.] % \item[\errcode{EDOTDOT} \textit{RFS specific error}.] % \item[\errcode{ENOTUNIQ} \textit{Name not unique on network}.] % \item[\errcode{EBADFD} \textit{File descriptor in bad state}.] @@ -458,13 +464,26 @@ messaggio. % \item[\errcode{ELIBMAX} \textit{Attempting to link in too many shared % libraries}.] % \item[\errcode{ELIBEXEC} \textit{Cannot exec a shared library directly}.] +% \item[\errcode{ERESTART} \textit{Interrupted system call should be +% restarted}.] % \item[\errcode{ESTRPIPE} \textit{Streams pipe error}.] % \item[\errcode{EUCLEAN} \textit{Structure needs cleaning}.] +% \item[\errcode{ENOTNAM} \textit{Not a XENIX named type file}.] % \item[\errcode{ENAVAIL} \textit{No XENIX semaphores available}.] % \item[\errcode{EISNAM} \textit{Is a named type file}.] % \item[\errcode{EREMOTEIO} \textit{Remote I/O error}.] % \item[\errcode{ENOMEDIUM} \textit{No medium found}.] -% \item[\errcode{EMEDIUMTYPE} \textit{Wrong medium type}.] +% \item[\errcode{EMEDIUMTYPE} \textit{Wrong medium type}.] +% \item[\errcode{ENOKEY} \textit{Required key not available}.] +% \item[\errcode{EKEYEXPIRED} \textit{Key has expired}.] +% \item[\errcode{EKEYREVOKED} \textit{Key has been revoked}.] +% \item[\errcode{EKEYREJECTED} \textit{Key was rejected by service}.] +%/* for robust mutexes */ +% \item[\errcode{EOWNERDEAD} \textit{Owner died}.] +% \item[\errcode{ENOTRECOVERABLE} \textit{State not recoverable}.] +% \item[\errcode{ERFKILL} \textit{Operation not possible due to RF-kill}.] +% \item[\errcode{EHWPOISON} \textit{Memory page has hardware error}.] + % \end{description} diff --git a/listati/timex.h b/listati/timex.h index 9d0b1bf..7cb1eab 100644 --- a/listati/timex.h +++ b/listati/timex.h @@ -10,5 +10,6 @@ struct timex { long tolerance; /* clock frequency tolerance (ppm) (read only) */ struct timeval time; /* (read only) */ long tick; /* (modified) usecs between clock ticks */ + /* ulteriori campi accessibili in sola lettura... */ ... }; diff --git a/system.tex b/system.tex index 27f1f38..a761b4d 100644 --- a/system.tex +++ b/system.tex @@ -2461,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 @@ -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 @@ -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 -- 2.30.2