From be0113897fdc6774f0dcc3f9c91fe5e76c5dd0a5 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 26 Oct 2015 23:54:54 +0000 Subject: [PATCH] Reindicizzazioni --- fileadv.tex | 2 +- filedir.tex | 27 +++--- fileio.tex | 232 ++++++++++++++++++++++++++------------------------- ipc.tex | 66 +++++++-------- macro.tex | 6 ++ signal.tex | 70 ++++++++-------- sockctrl.tex | 14 ++-- system.tex | 141 +++++++++++++++---------------- 8 files changed, 283 insertions(+), 275 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 9737bb0..8669945 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2720,7 +2720,7 @@ avvenga è di impostare la lunghezza della coda dei segnali \textit{real-time} ad una dimensione identica al valore massimo del numero di file descriptor utilizzabili, vale a dire impostare il contenuto di \sysctlfile{kernel/rtsig-max} allo stesso valore del contenuto di -\sysctlfile{fs/file-max}. +\sysctlfilem{fs/file-max}. % TODO fare esempio che usa O_ASYNC diff --git a/filedir.tex b/filedir.tex index cac5bc4..5bf7096 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1248,17 +1248,19 @@ del filesystem stesso. \label{fig:sys_statfs} \end{figure} -\conffilebeg{/etc/mtab} La \acr{glibc} provvede infine una serie di funzioni -per la gestione dei due file \conffiled{/etc/fstab}\footnote{più precisamente - \funcm{setfsent}, \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, - \funcm{endfsent}.} ed \conffile{/etc/mtab}\footnote{più precisamente - \funcm{setmntent}, \funcm{getmntent},\funcm{getmntent\_r}, - \funcm{addmntent},\funcm{endmntent}, \funcm{hasmntopt}.} che -convenzionalmente sono usati in quasi tutti i sistemi unix-like per mantenere -rispettivamente le informazioni riguardo ai filesystem da montare e a quelli -correntemente montati. Le funzioni servono a leggere il contenuto di questi -file in opportune strutture \structd{fstab} e \structd{mntent}, e, nel caso di -\conffile{/etc/mtab}, per inserire e rimuovere le voci presenti nel file. +\conffilebeg{/etc/mtab} + +La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due +file \conffiled{/etc/fstab}\footnote{più precisamente \funcm{setfsent}, + \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.} +ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent}, + \funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent}, + \funcm{hasmntopt}.} che convenzionalmente sono usati in quasi tutti i +sistemi unix-like per mantenere rispettivamente le informazioni riguardo ai +filesystem da montare e a quelli correntemente montati. Le funzioni servono a +leggere il contenuto di questi file in opportune strutture \structd{fstab} e +\structd{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e +rimuovere le voci presenti nel file. In generale si dovrebbero usare queste funzioni, in particolare quelle relative a \conffile{/etc/mtab}, quando si debba scrivere un programma che @@ -1275,6 +1277,7 @@ filesystem montati) generata direttamente dal kernel, e quindi sempre disponibile e sempre aggiornata. Per questo motivo tralasceremo la trattazione, di queste funzioni, rimandando al manuale della \acr{glibc} \cite{GlibcMan} per la documentazione completa. + \conffileend{/etc/mtab} % TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C) @@ -6531,7 +6534,7 @@ tutti, compreso l'amministratore.\footnote{la qual cosa, visto il default Con il kernel 2.6.25 e le \textit{file capabilities} il \textit{bounding set} è diventato una proprietà di ciascun processo, che viene propagata invariata sia attraverso una \func{fork} che una \func{exec}. In questo caso il file -\sysctlfile{kernel/cap-bound} non esiste e \texttt{init} non ha nessun +\sysctlfilem{kernel/cap-bound} non esiste e \texttt{init} non ha nessun ruolo speciale, inoltre in questo caso all'avvio il valore iniziale prevede la presenza di tutte le capacità (compresa \const{CAP\_SETPCAP}). diff --git a/fileio.tex b/fileio.tex index a044eec..16a8ca8 100644 --- a/fileio.tex +++ b/fileio.tex @@ -12,7 +12,7 @@ \chapter{La gestione dell'I/O su file} \label{cha:file_IO_interface} -Esamineremo in questo capitolo le due interfacce di programmazione che +Esamineremo in questo capitol le due interfacce di programmazione che consentono di gestire i dati mantenuti nei file. Cominceremo con quella nativa del sistema, detta dei \textit{file descriptor}, che viene fornita direttamente dalle \textit{system call} e che non prevede funzionalità evolute @@ -178,12 +178,12 @@ tab.~\ref{tab:file_std_files}. \textbf{File} & \textbf{Significato} \\ \hline \hline - \const{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard - input}.\\ - \const{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard - output}.\\ - \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard - error}.\\ + \constd{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard + input}.\\ + \constd{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard + output}.\\ + \constd{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard + error}.\\ \hline \end{tabular} \caption{Costanti definite in \headfile{unistd.h} per i file standard.} @@ -340,9 +340,9 @@ costanti di tab.~\ref{tab:open_access_mode_flag}. \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{O\_RDONLY} & Apre il file in sola lettura.\\ - \const{O\_WRONLY} & Apre il file in sola scrittura.\\ - \const{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\ + \constd{O\_RDONLY} & Apre il file in sola lettura.\\ + \constd{O\_WRONLY} & Apre il file in sola scrittura.\\ + \constd{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\ \hline \end{tabular} \caption{Le tre costanti che identificano le modalità di accesso @@ -368,11 +368,11 @@ La modalità di accesso deve sempre essere specificata quando si apre un file, il valore indicato in \param{flags} viene salvato nei \textit{file status flags}, e può essere riletto con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}), il relativo valore può essere poi ottenuto -un AND aritmetico della maschera binaria \const{O\_ACCMODE}, ma non può essere -modificato. Nella \acr{glibc} sono definite inoltre \const{O\_READ} come -sinonimo di \const{O\_RDONLY} e \const{O\_WRITE} come sinonimo di +un AND aritmetico della maschera binaria \constd{O\_ACCMODE}, ma non può essere +modificato. Nella \acr{glibc} sono definite inoltre \constd{O\_READ} come +sinonimo di \const{O\_RDONLY} e \constd{O\_WRITE} come sinonimo di \const{O\_WRONLY}.\footnote{si tratta di definizioni completamente fuori - standard, attinenti, insieme a \const{O\_EXEC} che permetterebbe l'apertura + standard, attinenti, insieme a \constd{O\_EXEC} che permetterebbe l'apertura di un file per l'esecuzione, ad un non meglio precisato ``\textit{GNU system}''; pur essendo equivalenti alle definizioni classiche non è comunque il caso di utilizzarle.} @@ -399,12 +399,12 @@ sez.~\ref{sec:file_fcntl_ioctl}). \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{O\_CREAT} & Se il file non esiste verrà creato, con le regole + \constd{O\_CREAT} & Se il file non esiste verrà creato, con le regole di titolarità del file viste in sez.~\ref{sec:file_ownership_management}. Se si imposta questo flag l'argomento \param{mode} deve essere sempre specificato.\\ - \const{O\_DIRECTORY}& Se \param{pathname} non è una directory la + \constd{O\_DIRECTORY}&Se \param{pathname} non è una directory la chiamata fallisce. Questo flag, introdotto con il kernel 2.1.126, è specifico di Linux e serve ad evitare dei possibili @@ -415,12 +415,12 @@ sez.~\ref{sec:file_fcntl_ioctl}). usato al di fuori dell'implementazione di \func{opendir}, ed è utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_EXCL} & Deve essere usato in congiunzione con + \constd{O\_EXCL} & Deve essere usato in congiunzione con \const{O\_CREAT} ed in tal caso impone che il file indicato da \param{pathname} non sia già esistente (altrimenti causa il fallimento della chiamata con un errore di \errcode{EEXIST}).\\ - \const{O\_LARGEFILE}& Viene usato sui sistemi a 32 bit per richiedere + \constd{O\_LARGEFILE}&Viene usato sui sistemi a 32 bit per richiedere l'apertura di file molto grandi, la cui dimensione non è rappresentabile con la versione a 32 bit del tipo \type{off\_t}, utilizzando @@ -431,16 +431,16 @@ sez.~\ref{sec:file_fcntl_ioctl}). delle funzioni che si attiva assegnando a $64$ la macro \macro{\_FILE\_OFFSET\_BITS}, e non usare mai questo flag.\\ - \const{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo + \constd{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo di terminale, questo non diventerà il terminale di controllo, anche se il processo non ne ha ancora uno (si veda sez.~\ref{sec:sess_ctrl_term}).\\ - \const{O\_NOFOLLOW} & Se \param{pathname} è un collegamento simbolico + \constd{O\_NOFOLLOW}& Se \param{pathname} è un collegamento simbolico la chiamata fallisce. Questa è un'estensione BSD aggiunta in Linux a partire dal kernel 2.1.126, ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_TRUNC} & Se usato su un file di dati aperto in scrittura, + \constd{O\_TRUNC} & Se usato su un file di dati aperto in scrittura, ne tronca la lunghezza a zero; con un terminale o una fifo viene ignorato, negli altri casi il comportamento non è specificato.\\ @@ -464,8 +464,8 @@ sez.~\ref{sec:file_fcntl_ioctl}). Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle \textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due - flag \const{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e - \const{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi + flag \constd{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e + \constd{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non esistono con Linux.} Uno di questi, \const{O\_EXCL}, ha senso solo se usato in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per @@ -500,7 +500,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il \textbf{Flag} & \textbf{Significato} \\ \hline \hline - \const{O\_APPEND} & Il file viene aperto in \textit{append mode}. La + \constd{O\_APPEND} & Il file viene aperto in \textit{append mode}. La posizione sul file (vedi sez.~\ref{sec:file_lseek}) viene sempre mantenuta sulla sua coda, per cui quanto si scrive viene sempre aggiunto al contenuto @@ -509,7 +509,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il verificarsi \textit{race condition} con una sovrapposizione dei dati se più di un processo scrive allo stesso tempo.\\ - \const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi + \constd{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi sez.~\ref{sec:signal_driven_io}). Quando è impostato viene generato il segnale \signal{SIGIO} tutte le volte che il file è pronto per le @@ -520,22 +520,22 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il in fase di apertura del file, deve invece essere attivato successivamente con \func{fcntl}.\\ - \const{O\_CLOEXEC}& Attiva la modalità di \textit{close-on-exec} (vedi - sez.~\ref{sec:proc_exec}) sul file. Il flag è - previsto dallo standard POSIX.1-2008, ed è stato - introdotto con il kernel 2.6.23 per evitare una - \textit{race condition} che si potrebbe verificare - con i \textit{thread} fra l'apertura del file e - l'impostazione della suddetta modalità con - \func{fcntl} (vedi - sez.~\ref{sec:file_fcntl_ioctl}).\\ - \const{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in + \constd{O\_CLOEXEC}& Attiva la modalità di \textit{close-on-exec} (vedi + sez.~\ref{sec:proc_exec}) sul file. Il flag è + previsto dallo standard POSIX.1-2008, ed è stato + introdotto con il kernel 2.6.23 per evitare una + \textit{race condition} che si potrebbe verificare + con i \textit{thread} fra l'apertura del file e + l'impostazione della suddetta modalità con + \func{fcntl} (vedi + sez.~\ref{sec:file_fcntl_ioctl}).\\ + \constd{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in \textit{user space} in maniera sincrona, in modo da scavalcare i meccanismi di bufferizzazione del kernel. Introdotto con il kernel 2.4.10 ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei + \constd{O\_NOATIME}& Blocca l'aggiornamento dei tempi di accesso dei file (vedi sez.~\ref{sec:file_file_times}). Per molti filesystem questa funzionalità non è disponibile per il singolo file ma come opzione @@ -543,7 +543,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il montaggio. Introdotto con il kernel 2.6.8 ed utilizzabile soltanto se si è definita la macro \macro{\_GNU\_SOURCE}.\\ - \const{O\_NONBLOCK}& Apre il file in \textsl{modalità non bloccante} per + \constd{O\_NONBLOCK}&Apre il file in \textsl{modalità non bloccante} per le operazioni di I/O (vedi sez.~\ref{sec:file_noblocking}). Questo significa il fallimento delle successive operazioni di @@ -556,19 +556,19 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il si vuole aprire un file di dispositivo per eseguire una \func{ioctl} (vedi sez.~\ref{sec:file_fcntl_ioctl}).\\ - \const{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma + \constd{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma origina da SVr4, dove però causava il ritorno da una \func{read} con un valore nullo e non con un errore, questo introduce un'ambiguità, dato che come vedremo in sez.~\ref{sec:file_read} il ritorno di un valore nullo da parte di \func{read} ha il significato di una \textit{end-of-file}.\\ - \const{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni + \constd{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni scrittura si bloccherà fino alla conferma dell'arrivo di tutti i dati e di tutti i metadati sull'hardware sottostante (in questo significato solo dal kernel 2.6.33).\\ - \const{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni + \constd{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni scrittura di dati si bloccherà fino alla conferma dell'arrivo degli stessi e della parte di metadati ad essi relativa sull'hardware sottostante (in @@ -594,7 +594,7 @@ conseguente effetto sulle caratteristiche operative che controllano (torneremo sull'argomento in sez.~\ref{sec:file_fcntl_ioctl}). Il flag \const{O\_ASYNC} (che, per per compatibilità con BSD, si può indicare -anche con la costante \const{FASYNC}) è definito come possibile valore per +anche con la costante \constd{FASYNC}) è definito come possibile valore per \func{open}, ma per un bug dell'implementazione,\footnote{segnalato come ancora presente nella pagina di manuale almeno fino al Settembre 2011.} non solo non attiva il comportamento citato, ma se usato richiede di essere @@ -780,8 +780,8 @@ da \param{offset}, che viene sommato al riferimento dato dall'argomento \param{whence}, che deve essere indicato con una delle costanti riportate in tab.~\ref{tab:lseek_whence_values}.\footnote{per compatibilità con alcune vecchie notazioni questi valori possono essere rimpiazzati - rispettivamente con 0, 1 e 2 o con \const{L\_SET}, \const{L\_INCR} e - \const{L\_XTND}.} Si tenga presente che la chiamata a \func{lseek} non causa + rispettivamente con 0, 1 e 2 o con \constd{L\_SET}, \constd{L\_INCR} e + \constd{L\_XTND}.} Si tenga presente che la chiamata a \func{lseek} non causa nessun accesso al file, si limita a modificare la posizione corrente (cioè il campo \var{f\_pos} della struttura \kstruct{file}, vedi fig.~\ref{fig:file_proc_file}). Dato che la funzione ritorna la nuova @@ -796,23 +796,23 @@ posizione corrente nel file con \code{lseek(fd, 0, SEEK\_CUR)}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{SEEK\_SET} & Si fa riferimento all'inizio del file: il valore, che + \constd{SEEK\_SET}& Si fa riferimento all'inizio del file: il valore, che deve essere positivo, di \param{offset} indica direttamente la nuova posizione corrente.\\ - \const{SEEK\_CUR} & Si fa riferimento alla posizione corrente del file: + \constd{SEEK\_CUR}& Si fa riferimento alla posizione corrente del file: ad essa viene sommato \param{offset}, che può essere negativo e positivo, per ottenere la nuova posizione corrente.\\ - \const{SEEK\_END} & Si fa riferimento alla fine del file: alle dimensioni + \constd{SEEK\_END}& Si fa riferimento alla fine del file: alle dimensioni del file viene sommato \param{offset}, che può essere negativo e positivo, per ottenere la nuova posizione corrente.\\ \hline - \const{SEEK\_DATA}& Sposta la posizione nel file sull'inizio del primo + \constd{SEEK\_DATA}&Sposta la posizione nel file sull'inizio del primo blocco di dati dopo un \textit{hole} che segue (o coincide) con la posizione indicata da \param{offset} (dal kernel 3.1).\\ - \const{SEEK\_HOLE}& Sposta la posizione sul file all'inizio del primo + \constd{SEEK\_HOLE}&Sposta la posizione sul file all'inizio del primo \textit{hole} nel file che segue o inizia con \param{offset}, oppure si porta su \param{offset} se questo è all'interno di un \textit{hole}, oppure si @@ -1215,7 +1215,7 @@ mantenuti nella struttura \kstruct{file} della \textit{file table}, vengono condivisi, per cui una modifica degli stessi con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}) si applicherebbe a tutti processi che condividono la voce nella \textit{file table}. Ai file però sono associati -anche altri flag, dei quali l'unico usato al momento è \const{FD\_CLOEXEC}, +anche altri flag, dei quali l'unico usato al momento è \constd{FD\_CLOEXEC}, detti \itindex{file~descriptor~flags} \textit{file descriptor flags}; questi invece sono mantenuti in \kstruct{file\_struct}, e perciò sono locali per ciascun processo e non vengono modificati dalle azioni degli altri anche in @@ -1638,7 +1638,7 @@ corrispettive classiche, con la sola eccezione del fatto che se fra i loro argomenti si utilizza un \textit{pathname} relativo questo sarà risolto rispetto alla directory indicata da \param{dirfd}. Qualora invece si usi un \textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine -se per \param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la +se per \param{dirfd} si usa il valore speciale \constd{AT\_FDCWD}, la risoluzione sarà effettuata rispetto alla directory di lavoro corrente del processo. Si tenga presente però che questa, come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole @@ -1837,18 +1837,20 @@ costanti utilizzabili per i valori di \param{flags}. \textbf{Costante} & \textbf{Significato} \\ \hline \hline - \const{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la - dereferenziazione dei collegamenti simbolici.\\ - \const{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la - dereferenziazione dei collegamenti simbolici - (usato esplicitamente solo da \func{linkat}).\\ - \const{AT\_EACCES} & Usato solo da \func{faccessat}, richiede che - il controllo dei permessi sia fatto usando - l'\ids{UID} effettivo invece di quello - reale.\\ - \const{AT\_REMOVEDIR} & Usato solo da \func{unlinkat}, richiede che - la funzione si comporti come \func{rmdir} - invece che come \func{unlink}.\\ + \constd{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la + dereferenziazione dei collegamenti + simbolici.\\ + \constd{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la + dereferenziazione dei collegamenti simbolici + (usato esplicitamente solo da + \func{linkat}).\\ + \constd{AT\_EACCES} & Usato solo da \func{faccessat}, richiede che + il controllo dei permessi sia fatto usando + l'\ids{UID} effettivo invece di quello + reale.\\ + \constd{AT\_REMOVEDIR} & Usato solo da \func{unlinkat}, richiede che + la funzione si comporti come \func{rmdir} + invece che come \func{unlink}.\\ \hline \end{tabular} \caption{Le costanti utilizzate per i bit dell'argomento @@ -1927,7 +1929,7 @@ possibili valori per \var{cmd}, e del relativo significato, dei codici di errore restituiti e del tipo del terzo argomento (cui faremo riferimento con il nome indicato nel precedente prototipo), è riportata di seguito: \begin{basedescript}{\desclabelwidth{1.8cm}} -\item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore +\item[\constd{F\_DUPFD}] trova il primo file descriptor disponibile di valore maggiore o uguale ad \param{arg}, e ne fa un duplicato di \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$ in caso di errore. Oltre a \errval{EBADF} gli errori possibili sono @@ -1937,7 +1939,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \itindbeg{close-on-exec} -\item[\const{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma +\item[\constd{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma in più attiva il flag di \textit{close-on-exec} sul file descriptor duplicato, in modo da evitare una successiva chiamata con \const{F\_SETFD}. La funzionalità è stata introdotta con il kernel 2.6.24 ed @@ -1945,7 +1947,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \macro{\_POSIX\_C\_SOURCE} ad un valore adeguato secondo quanto visto in sez.~\ref{sec:intro_gcc_glibc_std}). -\item[\const{F\_GETFD}] restituisce il valore dei \textit{file descriptor +\item[\constd{F\_GETFD}] restituisce il valore dei \textit{file descriptor flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Al momento l'unico flag usato è quello di @@ -1954,7 +1956,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore nullo significa pertanto che il flag non è impostato. -\item[\const{F\_SETFD}] imposta il valore dei \textit{file descriptor flags} +\item[\constd{F\_SETFD}] imposta il valore dei \textit{file descriptor flags} al valore specificato con \param{arg}, ritorna un valore nullo in caso di successo e $-1$ in caso di errore. Non sono previsti errori diversi da \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di @@ -1965,7 +1967,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: \texttt{fs/fcntl.c} dei sorgenti del kernel.} \itindend{close-on-exec} -\item[\const{F\_GETFL}] ritorna il valore dei \textit{file status flags} di +\item[\constd{F\_GETFL}] ritorna il valore dei \textit{file status flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Il comando permette di rileggere il valore di quei bit @@ -1978,7 +1980,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: flag} con la maschera \const{O\_ACCMODE} come già accennato in sez.~\ref{sec:file_open_close}. -\item[\const{F\_SETFL}] imposta il valore dei \textit{file status flags} al +\item[\constd{F\_SETFL}] imposta il valore dei \textit{file status flags} al valore specificato da \param{arg}, ritorna un valore nullo in caso di successo o $-1$ in caso di errore. In generale possono essere impostati solo i flag riportati in tab.~\ref{tab:open_operation_flag}, su Linux si possono @@ -1990,26 +1992,26 @@ il nome indicato nel precedente prototipo), è riportata di seguito: permessi di amministratore) ed \errcode{EINVAL} se si cerca di impostare \const{O\_DIRECT} su un file che non supporta questo tipo di operazioni. -\item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da +\item[\constd{F\_GETLK}] richiede un controllo sul file lock specificato da \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato, ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Come per i due successivi comandi oltre a \errval{EBADF} se \param{lock} non è un puntatore valido restituisce l'errore generico \errcode{EFAULT}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}. -\item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto +\item[\constd{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto specificato nella struttura puntata da \param{lock}, ritorna un valore nullo in caso di successo e $-1$ se il file lock è tenuto da qualcun altro, nel qual caso si ha un errore di \errcode{EACCES} o \errcode{EAGAIN}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}. -\item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che +\item[\constd{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che la funzione non ritorna subito ma attende che il blocco sia rilasciato, se l'attesa viene interrotta da un segnale la funzione restituisce $-1$ e imposta \var{errno} a \errcode{EINTR}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}. -\item[\const{F\_GETOWN}] restituisce in caso di successo l'identificatore del +\item[\constd{F\_GETOWN}] restituisce in caso di successo l'identificatore del processo o del \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) che è preposto alla ricezione del segnale \signal{SIGIO} (o l'eventuale segnale alternativo impostato con \const{F\_SETSIG}) per gli eventi @@ -2045,7 +2047,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: il comportamento del comando può risultare diverso a seconda delle versioni della \acr{glibc} e del kernel. -\item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg}, +\item[\constd{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg}, l'identificatore del processo o del \textit{process group} che riceverà i segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ in @@ -2076,7 +2078,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: interpretato come l'identificatore di un processo o di un \textit{process group}. -\item[\const{F\_GETOWN\_EX}] legge nella struttura puntata +\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata dall'argomento \param{owner} l'identificatore del processo, \textit{thread} o \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) che è preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per gli @@ -2093,7 +2095,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: di \const{F\_GETOWN}. Il comando è specifico di Linux ed utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. -\item[\const{F\_SETOWN\_EX}] imposta con il valore della struttura +\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura \struct{f\_owner\_ex} puntata \param{owner}, l'identificatore del processo o del \textit{process group} che riceverà i segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file @@ -2117,17 +2119,17 @@ il nome indicato nel precedente prototipo), è riportata di seguito: riportata in fig.~\ref{fig:f_owner_ex}, in cui il primo campo indica il tipo di identificatore il cui valore è specificato nel secondo campo, che assume lo stesso significato di \param{arg} per \const{F\_SETOWN}. Per il campo - \var{type} i soli valori validi sono \const{F\_OWNER\_TID}, - \const{F\_OWNER\_PID} e \const{F\_OWNER\_PGRP}, che indicano rispettivamente - che si intende specificare con \var{pid} un \textit{Tread ID}, un - \textit{Process ID} o un \textit{Process Group ID}. A differenza di - \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà sia - \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che + \var{type} i soli valori validi sono \constd{F\_OWNER\_TID}, + \constd{F\_OWNER\_PID} e \constd{F\_OWNER\_PGRP}, che indicano + rispettivamente che si intende specificare con \var{pid} un \textit{Tread + ID}, un \textit{Process ID} o un \textit{Process Group ID}. A differenza + di \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà + sia \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che \signal{SIGURG}. Il comando è specifico di Linux, è disponibile solo a partire dal kernel 2.6.32, ed è utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. -\item[\const{F\_GETSIG}] restituisce il valore del segnale inviato dai vari +\item[\constd{F\_GETSIG}] restituisce il valore del segnale inviato dai vari meccanismi di I/O asincrono associati al file descriptor \param{fd} (quelli trattati in sez.~\ref{sec:file_asyncronous_operation}) in caso di successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti @@ -2137,8 +2139,8 @@ il nome indicato nel precedente prototipo), è riportata di seguito: essere anche lo stesso \signal{SIGIO}. Il comando è specifico di Linux ed utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. -\item[\const{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di I/O - asincrono associati al file descriptor \param{fd} (quelli trattati in +\item[\constd{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di + I/O asincrono associati al file descriptor \param{fd} (quelli trattati in sez.~\ref{sec:file_asyncronous_operation}) al valore indicato da \param{arg}, ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} gli errori possibili sono @@ -2158,14 +2160,14 @@ il nome indicato nel precedente prototipo), è riportata di seguito: sez.~\ref{sec:sig_real_time}), ed in particolare la capacità di essere accumulati in una coda prima della notifica. -\item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il +\item[\constd{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il processo detiene nei confronti del file descriptor \var{fd} o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Il comando è specifico di Linux ed utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. -\item[\const{F\_SETLEASE}] imposta o rimuove a seconda del valore +\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore di \param{arg} un \textit{file lease} sul file descriptor \var{fd} a seconda del valore indicato da \param{arg}. Ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} si otterrà @@ -2184,7 +2186,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. -\item[\const{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui +\item[\constd{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui viene riportato al processo chiamante, tramite il segnale \signal{SIGIO} (o altro segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file @@ -2194,7 +2196,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: dai kernel della serie 2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}. -\item[\const{F\_GETPIPE\_SZ}] restituisce in caso di successo la dimensione +\item[\constd{F\_GETPIPE\_SZ}] restituisce in caso di successo la dimensione del buffer associato alla \textit{pipe} \param{fd} (vedi sez.~\ref{sec:ipc_pipes}) o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}, che viene @@ -2202,7 +2204,7 @@ il nome indicato nel precedente prototipo), è riportata di seguito: specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}. -\item[\const{F\_SETPIPE\_SZ}] imposta la dimensione del buffer associato alla +\item[\constd{F\_SETPIPE\_SZ}] imposta la dimensione del buffer associato alla \textit{pipe} \param{fd} (vedi sez.~\ref{sec:ipc_unix}) ad un valore uguale o superiore a quello indicato dall'argomento \param{arg}. Ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF} @@ -2342,36 +2344,36 @@ sono definite nel kernel a livello generale, e vengono sempre interpretate per prime, per cui, come illustrato in \cite{LinDevDri}, eventuali operazioni specifiche che usino lo stesso valore verrebbero ignorate: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\const{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in +\item[\constd{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in questo caso, essendo usata come operazione logica, \func{ioctl} non richiede un terzo argomento, il cui eventuale valore viene ignorato. -\item[\const{FIONCLEX}] cancella il flag di \textit{close-on-exec} sul file, +\item[\constd{FIONCLEX}] cancella il flag di \textit{close-on-exec} sul file, in questo caso, essendo usata come operazione logica, \func{ioctl} non richiede un terzo argomento, il cui eventuale valore viene ignorato. -\item[\const{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul +\item[\constd{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul file (vedi sez.~\ref{sec:signal_driven_io}); il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) che contiene un valore logico (un valore nullo disabilita, un valore non nullo abilita). -\item[\const{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non +\item[\constd{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non bloccante; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) che contiene un valore logico (un valore nullo disabilita, un valore non nullo abilita). -\item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali +\item[\constd{FIOSETOWN}] imposta il processo che riceverà i segnali \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui valore specifica il PID del processo. -\item[\const{FIOGETOWN}] legge il processo che riceverà i segnali +\item[\constd{FIOGETOWN}] legge il processo che riceverà i segnali \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà scritto il PID del processo. -\item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul +\item[\constd{FIONREAD}] legge il numero di byte disponibili in lettura sul file descriptor; questa operazione è disponibile solo su alcuni file descriptor, in particolare sui socket (vedi sez.~\ref{sec:sock_ioctl_IP}) o sui file descriptor di \textit{epoll} (vedi sez.~\ref{sec:file_epoll}), il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà restituito il valore. -\item[\const{FIOQSIZE}] restituisce la dimensione corrente di un file o di una +\item[\constd{FIOQSIZE}] restituisce la dimensione corrente di un file o di una directory, mentre se applicata ad un dispositivo fallisce con un errore di \errcode{ENOTTY}; il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà restituito il valore. @@ -3270,14 +3272,16 @@ che vedremo in sez.~\ref{sec:file_formatted_io} come ``\verb|\n|'' con uno zero, mentre \func{fgets} aggiunge uno zero dopo il \textit{newline}, che resta dentro la stringa. +\itindbeg{buffer~overflow} + Se la lettura incontra la fine del file (o c'è un errore) viene restituito un puntatore \val{NULL}, ed il buffer \param{buf} non viene toccato. L'uso di \func{gets} è deprecato e deve essere assolutamente evitato, la funzione infatti non controlla il numero di byte letti, per cui nel caso la stringa -letta superi le dimensioni del buffer, si avrà un \itindex{buffer~overflow} -\textit{buffer overflow}, con sovrascrittura della memoria del processo -adiacente al buffer.\footnote{questa tecnica è spiegata in dettaglio e con - molta efficacia nell'ormai famoso articolo di Aleph1 \cite{StS}.} +letta superi le dimensioni del buffer, si avrà un \textit{buffer overflow}, +con sovrascrittura della memoria del processo adiacente al +buffer.\footnote{questa tecnica è spiegata in dettaglio e con molta efficacia + nell'ormai famoso articolo di Aleph1 \cite{StS}.} Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare @@ -3288,6 +3292,8 @@ l'esecuzione nel codice inviato nella stringa stessa, che in genere contiene uno \textit{shell code}, cioè una sezione di programma che lancia una shell da cui si potranno poi eseguire altri programmi. +\itindend{buffer~overflow} + La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in quanto prende in ingresso la dimensione del buffer \param{size}, che non verrà mai ecceduta in lettura. La funzione legge fino ad un massimo di \param{size} @@ -3922,9 +3928,9 @@ in \param{buf} e la dimensione in \param{size}. \textbf{Valore} & \textbf{Modalità} \\ \hline \hline - \const{\_IONBF} & \textit{unbuffered}\\ - \const{\_IOLBF} & \textit{line buffered}\\ - \const{\_IOFBF} & \textit{fully buffered}\\ + \constd{\_IONBF} & \textit{unbuffered}\\ + \constd{\_IOLBF} & \textit{line buffered}\\ + \constd{\_IOFBF} & \textit{fully buffered}\\ \hline \end{tabular} \caption{Valori dell'argomento \param{mode} di \func{setvbuf} @@ -3937,7 +3943,7 @@ stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo \textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo dopo la chiusura del file; ma fintanto che il file è usato all'interno di una funzione, può anche essere usata una variabile automatica. In -\headfile{stdio.h} è definita la macro \const{BUFSIZ}, che indica le +\headfile{stdio.h} è definita la costante \constd{BUFSIZ}, che indica le dimensioni generiche del buffer di uno \textit{stream}, queste vengono usate dalla funzione \func{setbuf}. Non è detto però che tale dimensione corrisponda sempre al valore ottimale (che può variare a seconda del @@ -4169,14 +4175,14 @@ assumere uno dei valori indicati in tab.~\ref{tab:file_fsetlocking_type}. \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{FSETLOCKING\_INTERNAL}& Lo \textit{stream} userà da ora in poi il - blocco implicito predefinito.\\ - \const{FSETLOCKING\_BYCALLER}& Al ritorno della funzione sarà l'utente a - dover gestire da solo il locking dello - \textit{stream}.\\ - \const{FSETLOCKING\_QUERY} & Restituisce lo stato corrente della - modalità di blocco dello - \textit{stream}.\\ + \constd{FSETLOCKING\_INTERNAL}& Lo \textit{stream} userà da ora in poi il + blocco implicito predefinito.\\ + \constd{FSETLOCKING\_BYCALLER}& Al ritorno della funzione sarà l'utente a + dover gestire da solo il locking dello + \textit{stream}.\\ + \constd{FSETLOCKING\_QUERY} & Restituisce lo stato corrente della + modalità di blocco dello + \textit{stream}.\\ \hline \end{tabular} \caption{Valori dell'argomento \param{type} di \func{\_\_fsetlocking} diff --git a/ipc.tex b/ipc.tex index 01c4c5b..9b7ac1a 100644 --- a/ipc.tex +++ b/ipc.tex @@ -505,12 +505,12 @@ essere in una relazione di \textsl{parentela}. Utilizzando una \textit{fifo} tutti i dati passeranno, come per le \textit{pipe}, attraverso un buffer nel kernel, senza transitare dal -filesystem. Il fatto che siano associate ad un \itindex{inode} -\textit{inode} presente sul filesystem serve infatti solo a fornire un punto -di accesso per i processi, che permetta a questi ultimi di accedere alla -stessa \textit{fifo} senza avere nessuna relazione, con una semplice -\func{open}. Il comportamento delle funzioni di lettura e scrittura è identico -a quello illustrato per le \textit{pipe} in sez.~\ref{sec:ipc_pipes}. +filesystem. Il fatto che siano associate ad un \textit{inode} presente sul +filesystem serve infatti solo a fornire un punto di accesso per i processi, +che permetta a questi ultimi di accedere alla stessa \textit{fifo} senza avere +nessuna relazione, con una semplice \func{open}. Il comportamento delle +funzioni di lettura e scrittura è identico a quello illustrato per le +\textit{pipe} in sez.~\ref{sec:ipc_pipes}. Abbiamo già trattato in sez.~\ref{sec:file_mknod} le funzioni \func{mknod} e \func{mkfifo} che permettono di creare una \textit{fifo}. Per utilizzarne una @@ -994,12 +994,12 @@ meno significativi. Il problema è che anche così non c'è la sicurezza che il valore della chiave sia univoco, infatti esso è costruito combinando il byte di \param{proj\_id)} -con i 16 bit meno significativi \itindex{inode} dell'inode del file -\param{pathname} (che vengono ottenuti attraverso \func{stat}, da cui derivano -i possibili errori), e gli 8 bit meno significativi del numero del dispositivo -su cui è il file. Diventa perciò relativamente facile ottenere delle -collisioni, specie se i file sono su dispositivi con lo stesso \textit{minor - number}, come \file{/dev/hda1} e \file{/dev/sda1}. +con i 16 bit meno significativi dell'inode del file \param{pathname} (che +vengono ottenuti attraverso \func{stat}, da cui derivano i possibili errori), +e gli 8 bit meno significativi del numero del dispositivo su cui è il file. +Diventa perciò relativamente facile ottenere delle collisioni, specie se i +file sono su dispositivi con lo stesso \textit{minor number}, come +\file{/dev/hda1} e \file{/dev/sda1}. In genere quello che si fa è utilizzare un file comune usato dai programmi che devono comunicare (ad esempio un header comune, o uno dei programmi che devono @@ -1315,21 +1315,21 @@ l'uso di \func{sysctl} o scrivendo nei file \sysctlrelfile{kernel}{msgmax}, \itindbeg{linked~list} Una coda di messaggi è costituita da una \textit{linked list}.\footnote{una - \itindex{linked~list} \textit{linked list} è una tipica struttura di dati, - organizzati in una lista in cui ciascun elemento contiene un puntatore al - successivo. In questo modo la struttura è veloce nell'estrazione ed - immissione dei dati dalle estremità dalla lista (basta aggiungere un - elemento in testa o in coda ed aggiornare un puntatore), e relativamente - veloce da attraversare in ordine sequenziale (seguendo i puntatori), è - invece relativamente lenta nell'accesso casuale e nella ricerca.} I nuovi -messaggi vengono inseriti in coda alla lista e vengono letti dalla cima, in -fig.~\ref{fig:ipc_mq_schema} si è riportato uno schema semplificato con cui -queste strutture vengono mantenute dal kernel. Lo schema illustrato in realtà -è una semplificazione di quello usato fino ai kernel della serie 2.2. A -partire della serie 2.4 la gestione delle code di messaggi è effettuata in -maniera diversa (e non esiste una struttura \struct{msqid\_ds} nel kernel), ma -abbiamo mantenuto lo schema precedente dato che illustra in maniera più che -adeguata i principi di funzionamento delle code di messaggi. + \textit{linked list} è una tipica struttura di dati, organizzati in una + lista in cui ciascun elemento contiene un puntatore al successivo. In questo + modo la struttura è veloce nell'estrazione ed immissione dei dati dalle + estremità dalla lista (basta aggiungere un elemento in testa o in coda ed + aggiornare un puntatore), e relativamente veloce da attraversare in ordine + sequenziale (seguendo i puntatori), è invece relativamente lenta + nell'accesso casuale e nella ricerca.} I nuovi messaggi vengono inseriti in +coda alla lista e vengono letti dalla cima, in fig.~\ref{fig:ipc_mq_schema} si +è riportato uno schema semplificato con cui queste strutture vengono mantenute +dal kernel. Lo schema illustrato in realtà è una semplificazione di quello +usato fino ai kernel della serie 2.2. A partire della serie 2.4 la gestione +delle code di messaggi è effettuata in maniera diversa (e non esiste una +struttura \struct{msqid\_ds} nel kernel), ma abbiamo mantenuto lo schema +precedente dato che illustra in maniera più che adeguata i principi di +funzionamento delle code di messaggi. \itindend{linked~list} @@ -1835,9 +1835,9 @@ lettura della risposta, quest'ultima resta nella coda (così come per le \textit{fifo} si aveva il problema delle \textit{fifo} che restavano nel filesystem). In questo caso però il problemi sono maggiori, sia perché è molto più facile esaurire la memoria dedicata ad una coda di messaggi che gli -\itindex{inode} \textit{inode} di un filesystem, sia perché, con il riutilizzo -dei \ids{PID} da parte dei processi, un client eseguito in un momento -successivo potrebbe ricevere un messaggio non indirizzato a lui. +\textit{inode} di un filesystem, sia perché, con il riutilizzo dei \ids{PID} +da parte dei processi, un client eseguito in un momento successivo potrebbe +ricevere un messaggio non indirizzato a lui. \subsection{I semafori} @@ -4262,9 +4262,9 @@ sez.~\ref{sec:file_open_close}. Inoltre sul file descriptor viene sempre impostato il flag \const{FD\_CLOEXEC}. Chiamate effettuate da diversi processi usando lo stesso nome restituiranno file descriptor associati allo stesso segmento, così come, nel caso di file ordinari, essi sono associati -allo stesso \itindex{inode} inode. In questo modo è possibile effettuare una -chiamata ad \func{mmap} sul file descriptor restituito da \func{shm\_open} ed -i processi vedranno lo stesso segmento di memoria condivisa. +allo stesso inode. In questo modo è possibile effettuare una chiamata ad +\func{mmap} sul file descriptor restituito da \func{shm\_open} ed i processi +vedranno lo stesso segmento di memoria condivisa. Quando il nome non esiste si può creare un nuovo segmento specificando \const{O\_CREAT}; in tal caso il segmento avrà (così come i nuovi file) diff --git a/macro.tex b/macro.tex index 67b8525..5daa9dd 100644 --- a/macro.tex +++ b/macro.tex @@ -262,6 +262,12 @@ %\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}% } % /proc/sys file name +\newcommand{\sysctlfilem}[1]{% +\texttt{/proc/sys/#1}% +%\index{file!file di controllo (sotto \texttt{/proc/sys})!{#1}@{{\tt {#1}}}}\texttt{/proc/sys/#1}% +%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}% +} % /proc/sys file name + \newcommand{\sysctlrelfile}[2]{% \index{file!file di controllo (sotto \texttt{/proc/sys})!{#1/#2}@{{\tt {#1/#2}}}}\texttt{#2}% %\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}% diff --git a/signal.tex b/signal.tex index 4463fb0..070ce85 100644 --- a/signal.tex +++ b/signal.tex @@ -1097,8 +1097,8 @@ per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto chiamando \funcm{sysv\_signal}, una volta che si sia definita la macro \macro{\_XOPEN\_SOURCE}. In generale, per evitare questi problemi, l'uso di \func{signal}, che tra l'altro ha un comportamento indefinito in caso di -processo \itindex{thread} multi-\textit{thread}, è da evitare: tutti i nuovi -programmi devono usare \func{sigaction}. +processo multi-\textit{thread}, è da evitare: tutti i nuovi programmi devono +usare \func{sigaction}. È da tenere presente che, seguendo lo standard POSIX, il comportamento di un processo che ignora i segnali \signal{SIGFPE}, \signal{SIGILL}, o @@ -1437,22 +1437,21 @@ Si deve comunque tenere presente che fino al kernel 2.6.16 la precisione di queste funzioni era limitata dalla frequenza del timer di sistema, determinato dal valore della costante \texttt{HZ} di cui abbiamo già parlato in sez.~\ref{sec:proc_hierarchy}, in quanto le temporizzazioni erano calcolate in -numero di interruzioni del timer (i cosiddetti \itindex{jiffies} -``\textit{jiffies}''), ed era assicurato soltanto che il segnale non sarebbe -stato mai generato prima della scadenza programmata (l'arrotondamento cioè era -effettuato per eccesso).\footnote{questo in realtà non è del tutto vero a - causa di un bug, presente fino al kernel 2.6.12, che in certe circostanze - causava l'emissione del segnale con un arrotondamento per difetto.} - -L'uso del contatore dei \itindex{jiffies} \textit{jiffies}, un intero a 32 bit -nella maggior parte dei casi, comportava inoltre l'impossibilità di -specificare tempi molto lunghi. superiori al valore della costante -\const{MAX\_SEC\_IN\_JIFFIES}, pari, nel caso di default di un valore di -\const{HZ} di 250, a circa 99 giorni e mezzo. Con il cambiamento della -rappresentazione effettuato nel kernel 2.6.16 questo problema è scomparso e -con l'introduzione dei timer ad alta risoluzione (vedi -sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la precisione è diventata -quella fornita dall'hardware disponibile. +numero di interruzioni del timer (i cosiddetti ``\textit{jiffies}''), ed era +assicurato soltanto che il segnale non sarebbe stato mai generato prima della +scadenza programmata (l'arrotondamento cioè era effettuato per +eccesso).\footnote{questo in realtà non è del tutto vero a causa di un bug, + presente fino al kernel 2.6.12, che in certe circostanze causava l'emissione + del segnale con un arrotondamento per difetto.} + +L'uso del contatore dei \textit{jiffies}, un intero a 32 bit nella maggior +parte dei casi, comportava inoltre l'impossibilità di specificare tempi molto +lunghi. superiori al valore della costante \const{MAX\_SEC\_IN\_JIFFIES}, +pari, nel caso di default di un valore di \const{HZ} di 250, a circa 99 giorni +e mezzo. Con il cambiamento della rappresentazione effettuato nel kernel +2.6.16 questo problema è scomparso e con l'introduzione dei timer ad alta +risoluzione (vedi sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la +precisione è diventata quella fornita dall'hardware disponibile. Una seconda causa di potenziali ritardi è che il segnale viene generato alla scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo @@ -1466,9 +1465,8 @@ in cui un timer scade prima che il segnale di una precedente scadenza sia stato consegnato. In questo caso, per il comportamento dei segnali descritto in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo oggi l'uso di questa funzione è deprecato a favore degli -\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della -cosiddetta \itindex{POSIX~Timer~API} \textit{POSIX Timer API}, che tratteremo -in sez.~\ref{sec:sig_timer_adv}. +\textit{high-resolution timer} e della cosiddetta \itindex{POSIX~Timer~API} +\textit{POSIX Timer API}, che tratteremo in sez.~\ref{sec:sig_timer_adv}. Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il valore corrente di un timer senza modificarlo, è possibile usare la funzione @@ -2835,9 +2833,9 @@ sez.~\ref{sec:sys_resource_limit}. Lo standard POSIX.1b definisce inoltre delle nuove funzioni di sistema che permettono di gestire l'attesa di segnali specifici su una coda, esse servono -in particolar modo nel caso dei \itindex{thread} \textit{thread}, in cui si -possono usare i segnali \textit{real-time} come meccanismi di comunicazione -elementare; la prima di queste è \funcd{sigwait}, il cui prototipo è: +in particolar modo nel caso dei \textit{thread}, in cui si possono usare i +segnali \textit{real-time} come meccanismi di comunicazione elementare; la +prima di queste è \funcd{sigwait}, il cui prototipo è: \begin{funcproto}{ \fhead{signal.h} @@ -2872,7 +2870,7 @@ consegnato che essere ricevuto da \func{sigwait}, il tutto in maniera non prevedibile. Lo standard POSIX.1b definisce altre due funzioni di sistema, anch'esse usate -prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e +prevalentemente con i \textit{thread}; \funcd{sigwaitinfo} e \funcd{sigtimedwait}, i relativi prototipi sono: \begin{funcproto}{ @@ -2941,12 +2939,12 @@ dalla frequenza dello stesso che si ricordi, come già illustrato in sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}. I contatori usati per il calcolo dei tempi infatti erano basati sul numero di -\itindex{jiffies} \textit{jiffies} che vengono incrementati ad ogni -\textit{clock tick} del timer di sistema, il che comportava anche, come -accennato in sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per -il massimo periodo di tempo copribile da alcuni di questi orologi, come quelli -associati al \textit{process time} almeno fino a quando, con il kernel 2.6.16, -non è stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}. +\textit{jiffies} che vengono incrementati ad ogni \textit{clock tick} del +timer di sistema, il che comportava anche, come accennato in +sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per il massimo +periodo di tempo copribile da alcuni di questi orologi, come quelli associati +al \textit{process time} almeno fino a quando, con il kernel 2.6.16, non è +stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}. \itindbeg{POSIX~Timer~API} @@ -3012,12 +3010,10 @@ tab.~\ref{tab:sig_timer_clockid_types}. sez.~\ref{sec:sys_cpu_times}, nel totale di \textit{system time} e \textit{user time}) comprensivo di tutto il tempo di CPU usato - da eventuali \itindex{thread} - \textit{thread}.\\ + da eventuali \textit{thread}.\\ \const{CLOCK\_THREAD\_CPUTIME\_ID}& Contatore del tempo di CPU (\textit{user time} e \textit{system time}) - usato da un singolo \itindex{thread} - \textit{thread}.\\ + usato da un singolo \textit{thread}.\\ \hline \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli aggiustamenti dovuti all'uso di NTP (viene @@ -3347,8 +3343,8 @@ effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione è in fig.~\ref{fig:sig_sigval}) come valore del campo \var{si\_value} di \struct{siginfo\_t}.\\ \const{SIGEV\_THREAD} & La notifica viene effettuata creando un nuovo - \itindex{thread} \textit{thread} che esegue la - funzione di notifica specificata da + \textit{thread} che esegue la funzione di + notifica specificata da \var{sigev\_notify\_function} con argomento \var{sigev\_value}. Se questo è diverso da \val{NULL}, il \textit{thread} viene creato con diff --git a/sockctrl.tex b/sockctrl.tex index 06ba55f..7c73bdd 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1267,8 +1267,8 @@ utilizzata dalla funzione per riportare (come \textit{value result argument}) i propri risultati. La funzione infatti è rientrante, ed alloca autonomamente tutta la memoria necessaria in cui verranno riportati i risultati della risoluzione. La funzione scriverà all'indirizzo puntato da \param{res} il -puntatore iniziale ad una \itindex{linked~list} \textit{linked list} di -strutture di tipo \struct{addrinfo} contenenti tutte le informazioni ottenute. +puntatore iniziale ad una \textit{linked list} di strutture di tipo +\struct{addrinfo} contenenti tutte le informazioni ottenute. \begin{figure}[!htb] \footnotesize \centering @@ -1476,8 +1476,8 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}. \begin{figure}[!htb] \centering \includegraphics[width=10cm]{img/addrinfo_list} - \caption{La \itindex{linked~list} \textit{linked list} delle strutture - \struct{addrinfo} restituite da \func{getaddrinfo}.} + \caption{La \textit{linked list} delle strutture \struct{addrinfo} + restituite da \func{getaddrinfo}.} \label{fig:sock_addrinfo_list} \end{figure} @@ -1573,9 +1573,9 @@ IPv4 address: \end{Verbatim} %$ -Una volta estratti i risultati dalla \itindex{linked~list} \textit{linked list} -puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura -di disallocare opportunamente tutta la memoria, per questo viene fornita +Una volta estratti i risultati dalla \textit{linked list} puntata +da \param{res} se questa non viene più utilizzata si dovrà avere cura di +disallocare opportunamente tutta la memoria, per questo viene fornita l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è: \begin{functions} \headdecl{netdb.h} diff --git a/system.tex b/system.tex index 0318925..9e6abaf 100644 --- a/system.tex +++ b/system.tex @@ -166,7 +166,7 @@ sez.~\ref{sec:sys_file_limits}. \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per processo in contemporanea.\\ \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una - \itindex{timezone} \textit{timezone} (vedi + \textit{timezone} (vedi sez.~\ref{sec:sys_time_base})).\\ \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per processo (vedi sez.~\ref{sec:proc_access_id}).\\ @@ -204,7 +204,7 @@ file, riportate in tab.~\ref{tab:sys_file_macro}. \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per processo in contemporanea.\\ \const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una - \itindex{timezone} \textit{timezone} + \textit{timezone} (vedi sez.~\ref{sec:sys_date}). \\ \const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali \textit{real-time} (vedi @@ -334,7 +334,7 @@ relative spiegazioni, si può trovare nel manuale delle \acr{glibc}. che specifica la macro {FOPEN\_MAX}.\\ \texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}& La dimensione massima di un nome di una - \itindex{timezone} \texttt{timezone} (vedi + \texttt{timezone} (vedi sez.~\ref{sec:sys_date}).\\ \texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}& Massimo numero di gruppi supplementari che @@ -714,9 +714,9 @@ informazioni degli utenti e dei gruppi per insiemi di macchine e servizi all'interno di una stessa organizzazione, in modo da mantenere coerenti i dati, ha portato anche alla necessità di poter recuperare e memorizzare dette informazioni su supporti diversi dai file citati, introducendo il sistema del -\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} (che -tratteremo brevemente in sez.~\ref{sec:sock_resolver}) dato che la sua -applicazione è cruciale nella procedura di risoluzione di nomi di rete. +\textit{Name Service Switch} (che tratteremo brevemente in +sez.~\ref{sec:sock_resolver}) dato che la sua applicazione è cruciale nella +procedura di risoluzione di nomi di rete. In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche per la lettura delle informazioni relative a utenti e gruppi tralasciando @@ -1547,10 +1547,9 @@ dell'esaurimento della propria \textit{time-slice} (in genere a causa di una interrotto da un processo a priorità maggiore. I campi \var{ru\_inblock} e \var{ru\_oublock} indicano invece il numero di volte che è stata eseguita una attività di I/O su un filesystem (rispettivamente in lettura e scrittura) ed -infine \var{ru\_maxrss} indica il valore più alto della -\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size} raggiunto dal -processo stesso o, nel caso sia stato usato \const{RUSAGE\_CHILDREN}, da uno -dei suoi figli. +infine \var{ru\_maxrss} indica il valore più alto della \textit{Resident Set + Size} raggiunto dal processo stesso o, nel caso sia stato usato +\const{RUSAGE\_CHILDREN}, da uno dei suoi figli. Si tenga conto che per un errore di implementazione nei i kernel precedenti il 2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1, @@ -1700,10 +1699,10 @@ riportati nel seguente elenco: con un errore di \errcode{EFBIG}. \item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di - \itindex{file~locking} \textit{file lock} (vedi sez.~\ref{sec:file_locking}) - e di \textit{file lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un - processo poteva effettuare. È un limite presente solo nelle prime versioni - del kernel 2.4, pertanto non deve essere più utilizzato. + \textit{file lock} (vedi sez.~\ref{sec:file_locking}) e di \textit{file + lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un processo poteva + effettuare. È un limite presente solo nelle prime versioni del kernel 2.4, + pertanto non deve essere più utilizzato. \item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare massimo di memoria che può essere bloccata in RAM da un processo (vedi @@ -2047,6 +2046,7 @@ gestione di data e ora. \label{sec:sys_unix_time} \itindbeg{calendar~time} +\itindbeg{process~time} Tradizionalmente nei sistemi unix-like sono sempre stati previsti due tipi distinti di tempi, caratterizzati da altrettante modalità di misura ed @@ -2062,14 +2062,13 @@ espressi con diversi tipi di dati, chiamati rispettivamente \textit{calendar tradizionalmente misurato in secondi a partire dalla mezzanotte del primo gennaio 1970, data che viene chiamata \textit{the Epoch}. -\item[\textit{process time}] \itindex{process~time} detto anche \textsl{tempo - di processore} o \textsl{tempo di CPU}. Si tratta del tempo impiegato da - un processore nell'esecuzione del codice di un programma all'interno di un - processo. Per esprimere questo tempo è stato riservato il tipo - \type{clock\_t}, e viene misurato nei cosiddetti \itindex{clock~tick} - \textit{clock tick}, tradizionalmente corrispondenti al numero di - interruzioni del processore da parte del timer di sistema. A differenza del - precedente indica soltanto un intervallo di durata. +\item[\textit{process time}] detto anche \textsl{tempo di processore} o + \textsl{tempo di CPU}. Si tratta del tempo impiegato da un processore + nell'esecuzione del codice di un programma all'interno di un processo. Per + esprimere questo tempo è stato riservato il tipo \type{clock\_t}, e viene + misurato nei cosiddetti \textit{clock tick}, tradizionalmente corrispondenti + al numero di interruzioni del processore da parte del timer di sistema. A + differenza del precedente indica soltanto un intervallo di durata. \end{basedescript} Il \textit{calendar time} viene sempre mantenuto facendo riferimento @@ -2104,11 +2103,10 @@ in presenza di cambi di fusi orari. \itindend{calendar~time} -Il \itindex{process~time} \textit{process time} invece indica sempre una -misura di un lasso di tempo e viene usato per tenere conto dei tempi di -esecuzione dei processi. Esso viene sempre diviso in \textit{user time} e -\textit{system time}, per misurare la durata di ciascun processo il kernel -infatti calcola tre tempi: +Il \textit{process time} invece indica sempre una misura di un lasso di tempo +e viene usato per tenere conto dei tempi di esecuzione dei processi. Esso +viene sempre diviso in \textit{user time} e \textit{system time}, per misurare +la durata di ciascun processo il kernel infatti calcola tre tempi: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} \item[\textit{clock time}] il tempo \textsl{reale}, viene chiamato anche \textit{wall clock time} o \textit{elapsed time}, passato dall'avvio del @@ -2135,6 +2133,7 @@ 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}. +\itindend{process~time} \itindbeg{clock~tick} Come accennato il \textit{process time} viene misurato nei cosiddetti @@ -2156,6 +2155,7 @@ definito in \headfile{time.h} è ormai considerato obsoleto e non deve essere usato. \constbeg{HZ} + In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e facendo i conti in base al numero delle interruzioni generate dello stesso, i @@ -2179,10 +2179,9 @@ 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 call} (ad esempio per i timeout). Con il 2.6.21 e l'introduzione degli -\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timers} (HRT) è -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}. +\textit{high-resolution timers} (HRT) è 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} @@ -2190,8 +2189,6 @@ sez.~\ref{sec:sig_timer_adv}. \subsection{La gestione del \textit{process time}} \label{sec:sys_cpu_times} -\itindbeg{process~time} - Di norma tutte le operazioni del sistema fanno sempre riferimento al \textit{calendar time}, l'uso del \textit{process time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione di un processo @@ -2324,8 +2321,6 @@ indicando un errore, nei primi secondi dopo il boot (per la precisione nei primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo \type{clock\_t}. -\itindend{process~time} - \subsection{Le funzioni per il \textit{calendar time}} \label{sec:sys_time_base} @@ -2417,15 +2412,19 @@ capacità \const{CAP\_SYS\_TIME}. Si tratta comunque di una condizione generale che continua a valere per qualunque funzione che vada a modificare l'orologio di sistema, comprese tutte quelle che tratteremo in seguito. +\itindbeg{timezone} + Il secondo argomento di entrambe le funzioni è una struttura \struct{timezone}, che storicamente veniva utilizzata per specificare appunto -la \itindex{timezone} \textit{timezone}, cioè l'insieme del fuso orario e -delle convenzioni per l'ora legale che permettevano il passaggio dal tempo +la cosiddetta \textit{timezone}, cioè l'insieme del fuso orario e delle +convenzioni per l'ora legale che permettevano il passaggio dal tempo universale all'ora locale. Questo argomento oggi è obsoleto ed in Linux non è mai stato utilizzato; esso non è supportato né dalle vecchie \textsl{libc5}, né dalle \textsl{glibc}: pertanto quando si chiama questa funzione deve essere sempre impostato a \val{NULL}. +\itindbeg{timezone} + Modificare l'orologio di sistema con queste funzioni è comunque problematico, in quanto esse effettuano un cambiamento immediato. Questo può creare dei buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con @@ -2617,11 +2616,10 @@ sintassi specificata per la forma equivalente di questa funzione definita come \code{ADJ}. Si tenga presente infine che con l'introduzione a partire dal kernel 2.6.21 -degli \itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} ed -il supporto per i cosiddetti POSIX \textit{real-time clock}, si può ottenere -il \textit{calendar time} direttamente da questi, come vedremo in -sez.~\ref{sec:sig_timer_adv}, con la massima risoluzione possibile per -l'hardware della macchina. +degli \textit{high-resolution timer} ed il supporto per i cosiddetti POSIX +\textit{real-time clock}, si può ottenere il \textit{calendar time} +direttamente da questi, come vedremo in sez.~\ref{sec:sig_timer_adv}, con la +massima risoluzione possibile per l'hardware della macchina. @@ -2712,9 +2710,9 @@ Sun Apr 29 19:47:44 2012\n" \end{Example} Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione -di una \itindex{timezone} \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 +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)}. Dato che l'uso di una stringa statica rende le funzioni non rientranti @@ -2790,7 +2788,7 @@ della variabile globale \var{tzname}. \includestruct{listati/time_zone_var.c} \end{minipage} \normalsize - \caption{Le variabili globali usate per la gestione delle \itindex{timezone} + \caption{Le variabili globali usate per la gestione delle \textit{timezone}.} \label{fig:sys_tzname} \end{figure} @@ -2798,12 +2796,12 @@ della variabile globale \var{tzname}. 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 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 è: +informazioni riguardo la propria \textit{timezone} 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{time.h} @@ -2818,11 +2816,11 @@ La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è definita verrà usato il file \conffiled{/etc/localtime}. La variabile \var{tzname} contiene due stringhe, che indicano i due nomi standard della -\itindex{timezone} \textit{timezone} corrente. La prima è il nome per l'ora -solare, la seconda per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} -sono indicate come \code{char *} non è il caso di modificare queste -stringhe. La variabile \var{timezone} indica la differenza di fuso orario in -secondi, mentre \var{daylight} indica se è attiva o meno l'ora legale. +\textit{timezone} corrente. La prima è il nome per l'ora solare, la seconda +per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come +\code{char *} non è il caso di modificare queste stringhe. La variabile +\var{timezone} indica la differenza di fuso orario in secondi, mentre +\var{daylight} indica se è attiva o meno l'ora legale. Benché la funzione \func{asctime} fornisca la modalità più immediata per stampare un tempo o una data, la flessibilità non fa parte delle sue @@ -2881,8 +2879,7 @@ lo stato di \param{s} è indefinito. \var{\%X}&\texttt{18:40:50} & L'ora.\\ \var{\%y}&\texttt{02} & Anno nel secolo.\\ \var{\%Y}&\texttt{2002} & Anno.\\ - \var{\%Z}&\texttt{CEST} & Nome della \itindex{timezone} - \textit{timezone}.\\ + \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\ \var{\%\%}&\texttt{\%} & Il carattere \%.\\ \hline \end{tabular} @@ -2949,7 +2946,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 è stato progettato sull'architettura a processi, e presenta una serie di problemi nel caso lo si -debba usare con i \itindex{thread} \textit{thread}. +debba usare con i \textit{thread}. \subsection{La variabile \var{errno}} @@ -2967,11 +2964,11 @@ che c'è stato un errore, e non il tipo di errore. 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}. +una variabile globale può comportare problemi nel caso dei \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 +\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 @@ -3044,9 +3041,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 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 è: +la funzione non rientrante, per cui nel caso si usino i \textit{thread} la +\acr{glibc} fornisce una apposita versione rientrante \funcd{strerror\_r}, il +cui prototipo è: \begin{funcproto}{ \fhead{string.h} @@ -3073,10 +3070,10 @@ restituita a \param{size}, a cui si accede definendo le opportune macro (per le quali si rimanda alla lettura della pagina di manuale). La funzione è analoga a \func{strerror} ma restituisce la stringa di errore -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 +nel buffer \param{buf} che il singolo \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 risulterà troncata. Una seconda funzione usata per riportare i codici di errore in maniera -- 2.30.2