From: Simone Piccardi Date: Tue, 27 Oct 2015 22:08:56 +0000 (+0000) Subject: Ancora reindicizzazioni X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=5afbcf1d6a84ab2a527859d8fd05b75a31e39736 Ancora reindicizzazioni --- diff --git a/fileadv.tex b/fileadv.tex index 8669945..2e9e781 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -237,7 +237,7 @@ diversi che aprono lo stesso file. In particolare, come accennato in fig.~\ref{fig:file_flock_struct}, i \textit{file lock} sono mantenuti in una \textit{linked list} di strutture -\kstruct{file\_lock}. La lista è referenziata dall'indirizzo di partenza +\kstructd{file\_lock}. La lista è referenziata dall'indirizzo di partenza mantenuto dal campo \var{i\_flock} della struttura \kstruct{inode} (per le definizioni esatte si faccia riferimento al file \file{include/linux/fs.h} nei sorgenti del kernel). Un bit del campo \var{fl\_flags} di specifica se si @@ -481,7 +481,7 @@ sez.~\ref{sec:file_flock}) esaminiamo più in dettaglio come viene gestito dal kernel. Lo schema delle strutture utilizzate è riportato in fig.~\ref{fig:file_posix_lock}; come si vede esso è molto simile all'analogo di fig.~\ref{fig:file_flock_struct}. In questo caso nella figura si sono -evidenziati solo i campi di \kstruct{file\_lock} significativi per la +evidenziati solo i campi di \kstructd{file\_lock} significativi per la semantica POSIX, in particolare adesso ciascuna struttura contiene, oltre al \ids{PID} del processo in \var{fl\_pid}, la sezione di file che viene bloccata grazie ai campi \var{fl\_start} e \var{fl\_end}. La struttura è comunque la @@ -1041,7 +1041,7 @@ degli insiemi specificati (\param{readfds}, \param{writefds} e Per specificare quali file descriptor si intende selezionare la funzione usa un particolare oggetto, il \textit{file descriptor set}, identificato dal tipo -\type{fd\_set}, che serve ad identificare un insieme di file descriptor, in +\typed{fd\_set}, che serve ad identificare un insieme di file descriptor, in maniera analoga a come un \textit{signal set} (vedi sez.~\ref{sec:sig_sigset}) identifica un insieme di segnali. Per la manipolazione di questi \textit{file descriptor set} si possono usare delle opportune macro di preprocessore: @@ -1134,7 +1134,6 @@ riaperto. Lo standard non prevede niente al riguardo e non si deve dare per assunto nessuno dei due comportamenti se si vogliono scrivere programmi portabili. - \itindend{file~descriptor~set} Una volta ritornata la funzione, si potrà controllare quali sono i file @@ -1285,7 +1284,7 @@ interfaccia completamente diversa, basata sulla funzione di sistema introdotta in Linux come \textit{system call} a partire dal kernel 2.1.23 ed inserita nelle \acr{libc} 5.4.28, originariamente l'argomento \param{nfds} era di tipo \ctyp{unsigned int}, la funzione è stata inserita nello standard - POSIX.1-2001 in cui è stato introdotto il tipo nativo \type{nfds\_t}.} il + POSIX.1-2001 in cui è stato introdotto il tipo nativo \typed{nfds\_t}.} il cui prototipo è: \begin{funcproto}{ @@ -1425,20 +1424,19 @@ solito tramite \var{errno}. L'uso di \func{poll} consente di superare alcuni dei problemi illustrati in precedenza per \func{select}; anzitutto, dato che in questo caso si usa un vettore di strutture \struct{pollfd} di dimensione arbitraria, non esiste il -limite introdotto dalle dimensioni massime di un \itindex{file~descriptor~set} -\textit{file descriptor set} e la dimensione dei dati passati al kernel -dipende solo dal numero dei file descriptor che si vogliono controllare, non -dal loro valore. Infatti, anche se usando dei bit un \textit{file descriptor - set} può essere più efficiente di un vettore di strutture \struct{pollfd}, -qualora si debba osservare un solo file descriptor con un valore molto alto ci -si troverà ad utilizzare inutilmente un maggiore quantitativo di memoria. - -Inoltre con \func{select} lo stesso \itindex{file~descriptor~set} \textit{file - descriptor set} è usato sia in ingresso che in uscita, e questo significa -che tutte le volte che si vuole ripetere l'operazione occorre reinizializzarlo -da capo. Questa operazione, che può essere molto onerosa se i file descriptor -da tenere sotto osservazione sono molti, non è invece necessaria con -\func{poll}. +limite introdotto dalle dimensioni massime di un \textit{file descriptor set} +e la dimensione dei dati passati al kernel dipende solo dal numero dei file +descriptor che si vogliono controllare, non dal loro valore. Infatti, anche se +usando dei bit un \textit{file descriptor set} può essere più efficiente di un +vettore di strutture \struct{pollfd}, qualora si debba osservare un solo file +descriptor con un valore molto alto ci si troverà ad utilizzare inutilmente un +maggiore quantitativo di memoria. + +Inoltre con \func{select} lo stesso \textit{file descriptor set} è usato sia +in ingresso che in uscita, e questo significa che tutte le volte che si vuole +ripetere l'operazione occorre reinizializzarlo da capo. Questa operazione, che +può essere molto onerosa se i file descriptor da tenere sotto osservazione +sono molti, non è invece necessaria con \func{poll}. Abbiamo visto in sez.~\ref{sec:file_select} come lo standard POSIX preveda una variante di \func{select} che consente di gestire correttamente la ricezione @@ -1507,11 +1505,11 @@ Nonostante \func{poll} presenti alcuni vantaggi rispetto a \func{select}, anche questa funzione non è molto efficiente quando deve essere utilizzata con un gran numero di file descriptor,\footnote{in casi del genere \func{select} viene scartata a priori, perché può avvenire che il numero di file - descriptor ecceda le dimensioni massime di un \itindex{file~descriptor~set} - \textit{file descriptor set}.} in particolare nel caso in cui solo pochi di -questi diventano attivi. Il problema in questo caso è che il tempo impiegato -da \func{poll} a trasferire i dati da e verso il kernel è proporzionale al -numero di file descriptor osservati, non a quelli che presentano attività. + descriptor ecceda le dimensioni massime di un \textit{file descriptor set}.} +in particolare nel caso in cui solo pochi di questi diventano attivi. Il +problema in questo caso è che il tempo impiegato da \func{poll} a trasferire i +dati da e verso il kernel è proporzionale al numero di file descriptor +osservati, non a quelli che presentano attività. Quando ci sono decine di migliaia di file descriptor osservati e migliaia di eventi al secondo (il caso classico è quello di un server web di un sito con @@ -2594,7 +2592,7 @@ funzioni dell'I/O multiplexing viste in precedenza. Una volta che il file descriptor risulta pronto sarà possibile leggere il numero di volte che il timer è scaduto con una ordinaria \func{read}. -La funzione legge il valore in un dato di tipo \type{uint64\_t}, e necessita +La funzione legge il valore in un dato di tipo \typed{uint64\_t}, e necessita pertanto che le si passi un buffer di almeno 8 byte, fallendo con \errval{EINVAL} in caso contrario, in sostanza la lettura deve essere effettuata con una istruzione del tipo: @@ -3034,10 +3032,9 @@ stato smontato. Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e con l'interfaccia di \textit{epoll}, ed a partire dal kernel 2.6.25 è stato -introdotto anche il supporto per il \itindex{signal~driven~I/O} -\texttt{signal-driven I/O}. Siccome gli eventi vengono notificati come dati -disponibili in lettura, dette funzioni ritorneranno tutte le volte che si avrà -un evento di notifica. +introdotto anche il supporto per il \texttt{signal-driven I/O}. Siccome gli +eventi vengono notificati come dati disponibili in lettura, dette funzioni +ritorneranno tutte le volte che si avrà un evento di notifica. Così, invece di dover utilizzare i segnali, considerati una pessima scelta dal punto di vista dell'interfaccia utente, si potrà gestire l'osservazione degli diff --git a/filedir.tex b/filedir.tex index 5bf7096..2e6a558 100644 --- a/filedir.tex +++ b/filedir.tex @@ -232,7 +232,7 @@ tab.~\ref{tab:file_inode_operations} le più rilevanti. \hline \end{tabular} \caption{Le principali operazioni sugli \textit{inode} definite tramite - \kstruct{inode\_operation}.} + \kstructd{inode\_operation}.} \label{tab:file_inode_operations} \end{table} @@ -328,7 +328,7 @@ tab.~\ref{tab:file_file_operations} le più significative. sez.~\ref{sec:file_asyncronous_io}) sul file.\\ \hline \end{tabular} - \caption{Operazioni sui file definite tramite \kstruct{file\_operation}.} + \caption{Operazioni sui file definite tramite \kstructd{file\_operation}.} \label{tab:file_file_operations} \end{table} @@ -2005,7 +2005,7 @@ sez.~\ref{sec:files_std_interface}. La prima funzione di questa interfaccia è \end{funcproto} La funzione apre un \textit{directory stream} per la directory -\param{dirname}, ritornando il puntatore ad un oggetto di tipo \type{DIR} (che +\param{dirname}, ritornando il puntatore ad un oggetto di tipo \typed{DIR} (che è il tipo opaco usato dalle librerie per gestire i \textit{directory stream}) da usare per tutte le operazioni successive, la funzione inoltre posiziona lo \textit{stream} sulla prima voce contenuta nella directory. @@ -3124,7 +3124,7 @@ sez.~\ref{sec:file_file_times}). Si noti come i vari membri della struttura siano specificati come tipi primitivi del sistema, di quelli definiti in tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h}, -con l'eccezione di \type{blksize\_t} e \type{blkcnt\_t} che sono nuovi tipi +con l'eccezione di \typed{blksize\_t} e \typed{blkcnt\_t} che sono nuovi tipi introdotti per rendersi indipendenti dalla piattaforma. Benché la descrizione dei commenti di fig.~\ref{fig:file_stat_struct} sia @@ -4347,8 +4347,8 @@ filename e su un file descriptor, i loro prototipi sono: Entrambe le funzioni utilizzano come secondo argomento \param{mode}, una variabile dell'apposito tipo primitivo \type{mode\_t} (vedi -tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi sui -file. +tab.~\ref{tab:intro_primitive_types}) utilizzato per specificare i permessi +sui file. \begin{table}[!htb] \centering @@ -5334,11 +5334,11 @@ queste funzioni che prendiamo in esame è \funcd{acl\_init}, il cui prototipo La funzione alloca ed inizializza un'area di memoria che verrà usata per mantenere i dati di una ACL contenente fino ad un massimo di \param{count} -voci. La funzione ritorna un valore di tipo \type{acl\_t} da usare in tutte le +voci. La funzione ritorna un valore di tipo \typed{acl\_t} da usare in tutte le altre funzioni che operano sulla ACL. La funzione si limita alla allocazione iniziale e non inserisce nessun valore nella ACL che resta vuota. -Si tenga presente che pur essendo \type{acl\_t} un tipo opaco che identifica +Si tenga presente che pur essendo \typed{acl\_t} un tipo opaco che identifica ``\textsl{l'oggetto}'' ACL, il valore restituito dalla funzione non è altro che un puntatore all'area di memoria allocata per i dati richiesti. Pertanto in caso di fallimento verrà restituito un puntatore nullo di tipo @@ -5473,7 +5473,7 @@ tramite un file descriptor usando \func{acl\_get\_fd} o con un funzione, che può richiedere anche la ACL relativa ad una directory, il secondo argomento \param{type} consente di specificare se si vuole ottenere la ACL di default o quella di accesso. Questo argomento deve essere di tipo -\type{acl\_type\_t} e può assumere solo i due valori riportati in +\typed{acl\_type\_t} e può assumere solo i due valori riportati in tab.~\ref{tab:acl_type}. \begin{table}[htb] @@ -5851,7 +5851,7 @@ manuale. Se si vuole operare direttamente sui contenuti di un oggetto di tipo \type{acl\_t} infatti occorre fare riferimento alle singole voci tramite gli -opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti +opportuni puntatori di tipo \typed{acl\_entry\_t}, che possono essere ottenuti dalla funzione \funcm{acl\_get\_entry} (per una voce esistente) o dalla funzione \funcm{acl\_create\_entry} per una voce da aggiungere. Nel caso della prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle @@ -7120,7 +7120,7 @@ della suddetta libreria attraverso l'opzione \texttt{-lcap}. Le funzioni dell'interfaccia alle \textit{capabilities} definite nelle bozze dello standard POSIX.1e prevedono l'uso di un tipo di dato opaco, -\type{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto +\typed{cap\_t}, come puntatore ai dati mantenuti nel cosiddetto \textit{capability state},\footnote{si tratta in sostanza di un puntatore ad una struttura interna utilizzata dalle librerie, i cui campi non devono mai essere acceduti direttamente.} in sono memorizzati tutti i dati delle @@ -7263,7 +7263,7 @@ tab.~\ref{tab:cap_set_identifier}. \constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\ \hline \end{tabular} - \caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che + \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_t} che identifica gli insiemi delle \textit{capabilities}.} \label{tab:cap_set_identifier} \end{table} @@ -7335,7 +7335,7 @@ In entrambe le funzioni l'argomento \param{cap\_p} indica il puntatore al indica su quale dei tre insiemi si intende operare, sempre con i valori di tab.~\ref{tab:cap_set_identifier}. La capacità che si intende controllare o impostare invece deve essere specificata attraverso una variabile di tipo -\type{cap\_value\_t}, che può prendere come valore uno qualunque di quelli +\typed{cap\_value\_t}, che può prendere come valore uno qualunque di quelli riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è possibile combinare diversi valori in una maschera binaria, una variabile di tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in @@ -7360,7 +7360,7 @@ tab.~\ref{tab:cap_value_type}. \constd{CAP\_SET} & La capacità è impostata.\\ \hline \end{tabular} - \caption{Valori possibili per il tipo di dato \type{cap\_flag\_value\_t} che + \caption{Valori possibili per il tipo di dato \typed{cap\_flag\_value\_t} che indica lo stato di una capacità.} \label{tab:cap_value_type} \end{table} diff --git a/fileio.tex b/fileio.tex index 16a8ca8..be0ef23 100644 --- a/fileio.tex +++ b/fileio.tex @@ -59,10 +59,10 @@ file dovrà essere chiuso, e questo chiuderà il canale di comunicazione impedendo ogni ulteriore operazione. All'interno di ogni processo i file aperti sono identificati da un numero -intero non negativo, che viene chiamato \textit{file descriptor}. Quando un -file viene aperto la funzione \func{open} restituisce questo numero, tutte le -ulteriori operazioni dovranno essere compiute specificando questo stesso -numero come argomento alle varie funzioni dell'interfaccia. +intero non negativo, che viene chiamato appunto \textit{file descriptor}. +Quando un file viene aperto la funzione \func{open} restituisce questo numero, +tutte le ulteriori operazioni dovranno essere compiute specificando questo +stesso numero come argomento alle varie funzioni dell'interfaccia. \itindbeg{process~table} \itindbeg{file~table} @@ -109,7 +109,7 @@ particolare: \centering \includegraphics[width=12cm]{img/procfile} \caption{Schema della architettura dell'accesso ai file attraverso - l'interfaccia dei \textit{file descriptor}.} + l'interfaccia dei file descriptor.} \label{fig:file_proc_file} \end{figure} @@ -133,18 +133,18 @@ essenziali come: \textit{file table}. \end{itemize*} -In questa infrastruttura un \textit{file descriptor} non è altro che l'intero -positivo che indicizza quest'ultima tabella, e che consente di recuperare il -puntatore alla struttura \kstruct{file} corrispondente al file aperto dal -processo a cui era stato assegnato questo indice. Una volta ottenuta grazie al -\textit{file descriptor} la struttura \kstruct{file} corrispondente al file -voluto nella \textit{file table}, il kernel potrà usare le funzioni messe -disposizione dal VFS per eseguire sul file tutte le operazioni necessarie. +In questa infrastruttura un file descriptor non è altro che l'intero positivo +che indicizza quest'ultima tabella, e che consente di recuperare il puntatore +alla struttura \kstruct{file} corrispondente al file aperto dal processo a cui +era stato assegnato questo indice. Una volta ottenuta grazie al file +descriptor la struttura \kstruct{file} corrispondente al file voluto nella +\textit{file table}, il kernel potrà usare le funzioni messe disposizione dal +VFS per eseguire sul file tutte le operazioni necessarie. Il meccanismo dell'apertura dei file prevede che venga sempre fornito il primo -\textit{file descriptor} libero nella tabella, e per questo motivo essi -vengono assegnati in successione tutte le volte che si apre un nuovo file, -posto che non ne sia stato chiuso nessuno in precedenza. +file descriptor libero nella tabella, e per questo motivo essi vengono +assegnati in successione tutte le volte che si apre un nuovo file, posto che +non ne sia stato chiuso nessuno in precedenza. \itindbeg{standard~input} \itindbeg{standard~output} @@ -178,12 +178,9 @@ tab.~\ref{tab:file_std_files}. \textbf{File} & \textbf{Significato} \\ \hline \hline - \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}.\\ + \constd{STDIN\_FILENO} & file descriptor dello \textit{standard input}.\\ + \constd{STDOUT\_FILENO} & file descriptor dello \textit{standard output}.\\ + \constd{STDERR\_FILENO} & file descriptor dello \textit{standard error}.\\ \hline \end{tabular} \caption{Costanti definite in \headfile{unistd.h} per i file standard.} @@ -2462,7 +2459,7 @@ concorrente ed in sez.~\ref{sec:file_access_control} per il controllo di accesso. Per ragioni storiche la struttura di dati che rappresenta uno \textit{stream} -è stata chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di +è stata chiamata \typed{FILE}, questi oggetti sono creati dalle funzioni di libreria e contengono tutte le informazioni necessarie a gestire le operazioni sugli \textit{stream}, come la posizione corrente, lo stato del buffer e degli indicatori di stato e di fine del file. @@ -2940,7 +2937,7 @@ intero di tipo \ctyp{long}. Dato che in certi casi, ad esempio quando si usa un filesystem indicizzato a 64 bit su una macchina con architettura a 32 bit, questo può non essere possibile lo standard POSIX ha introdotto le nuove funzioni \funcd{fgetpos} e \funcd{fsetpos}, che invece usano il nuovo tipo -\type{fpos\_t}, ed i cui prototipi sono: +\typed{fpos\_t}, ed i cui prototipi sono: \begin{funcproto}{ \fhead{stdio.h} diff --git a/intro.tex b/intro.tex index 28f81d6..dba0ded 100644 --- a/intro.tex +++ b/intro.tex @@ -892,30 +892,30 @@ infinita serie di problemi di portabilità. \textbf{Tipo} & \textbf{Contenuto} \\ \hline \hline - \type{caddr\_t} & Core address.\\ - \type{clock\_t} & Contatore del \textit{process time} (vedi + \typed{caddr\_t} & Core address.\\ + \typed{clock\_t} & Contatore del \textit{process time} (vedi sez.~\ref{sec:sys_cpu_times}.\\ - \type{dev\_t} & Numero di dispositivo (vedi sez.~\ref{sec:file_mknod}).\\ - \type{gid\_t} & Identificatore di un gruppo (vedi + \typed{dev\_t} & Numero di dispositivo (vedi sez.~\ref{sec:file_mknod}).\\ + \typed{gid\_t} & Identificatore di un gruppo (vedi sez.~\ref{sec:proc_access_id}).\\ - \type{ino\_t} & Numero di \textit{inode} + \typed{ino\_t} & Numero di \textit{inode} (vedi sez.~\ref{sec:file_vfs_work}).\\ - \type{key\_t} & Chiave per il System V IPC (vedi + \typed{key\_t} & Chiave per il System V IPC (vedi sez.~\ref{sec:ipc_sysv_generic}).\\ - \type{loff\_t} & Posizione corrente in un file.\\ - \type{mode\_t} & Attributi di un file.\\ - \type{nlink\_t} & Contatore dei collegamenti su un file.\\ - \type{off\_t} & Posizione corrente in un file.\\ - \type{pid\_t} & Identificatore di un processo (vedi + \typed{loff\_t} & Posizione corrente in un file.\\ + \typed{mode\_t} & Attributi di un file.\\ + \typed{nlink\_t} & Contatore dei collegamenti su un file.\\ + \typed{off\_t} & Posizione corrente in un file.\\ + \typed{pid\_t} & Identificatore di un processo (vedi sez.~\ref{sec:proc_pid}).\\ - \type{rlim\_t} & Limite sulle risorse.\\ - \type{sigset\_t}& Insieme di segnali (vedi sez.~\ref{sec:sig_sigset}).\\ - \type{size\_t} & Dimensione di un oggetto.\\ - \type{ssize\_t} & Dimensione in numero di byte ritornata dalle funzioni.\\ - \type{ptrdiff\_t}& Differenza fra due puntatori.\\ - \type{time\_t} & Numero di secondi (in \textit{calendar time}, vedi + \typed{rlim\_t} & Limite sulle risorse.\\ + \typed{sigset\_t}& Insieme di segnali (vedi sez.~\ref{sec:sig_sigset}).\\ + \typed{size\_t} & Dimensione di un oggetto.\\ + \typed{ssize\_t} & Dimensione in numero di byte ritornata dalle funzioni.\\ + \typed{ptrdiff\_t}& Differenza fra due puntatori.\\ + \typed{time\_t} & Numero di secondi (in \textit{calendar time}, vedi sez.~\ref{sec:sys_time}).\\ - \type{uid\_t} & Identificatore di un utente (vedi + \typed{uid\_t} & Identificatore di un utente (vedi sez.~\ref{sec:proc_access_id}).\\ \hline \end{tabular} @@ -1401,13 +1401,13 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: presente negli standard con i file di grandi dimensioni, ed in particolare definire le due funzioni \func{fseeko} e \func{ftello} che al contrario delle corrispettive \func{fseek} e \func{ftell} usano il tipo di dato - specifico \ctyp{off\_t} (vedi sez.~\ref{sec:file_io}). + specifico \type{off\_t} (vedi sez.~\ref{sec:file_io}). \item[\macrod{\_LARGEFILE64\_SOURCE}] definendo questa macro si rendono disponibili le funzioni di una interfaccia alternativa al supporto di valori a 64 bit nelle funzioni di gestione dei file (non supportati in certi sistemi), caratterizzate dal suffisso \texttt{64} aggiunto ai vari nomi di - tipi di dato e funzioni (come \type{off64\_t} al posto di \type{off\_t} o + tipi di dato e funzioni (come \typed{off64\_t} al posto di \type{off\_t} o \funcm{lseek64} al posto di \func{lseek}). Le funzioni di questa interfaccia alternativa sono state proposte come una diff --git a/ipc.tex b/ipc.tex index 9b7ac1a..91d38fe 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1088,7 +1088,7 @@ solo se tutti i controlli elencati falliscono l'accesso è negato. Si noti che a differenza di quanto avviene per i permessi dei file, fallire in uno dei passi elencati non comporta il fallimento dell'accesso. Un'ulteriore differenza rispetto a quanto avviene per i file è che per gli oggetti di IPC -il valore di \itindex{umask} \textit{umask} (si ricordi quanto esposto in +il valore di \textit{umask} (si ricordi quanto esposto in sez.~\ref{sec:file_perm_management}) non ha alcun significato. @@ -1327,7 +1327,7 @@ coda alla lista e vengono letti dalla cima, in fig.~\ref{fig:ipc_mq_schema} si 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 +struttura \kstruct{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. @@ -1335,12 +1335,13 @@ funzionamento delle code di messaggi. \begin{figure}[!htb] \centering \includegraphics[width=13cm]{img/mqstruct} - \caption{Schema della struttura di una coda messaggi.} + \caption{Schema delle strutture di una coda di messaggi + (\kstructd{msqid\_ds} e \kstructd{msg}).} \label{fig:ipc_mq_schema} \end{figure} -A ciascuna coda è associata una struttura \struct{msqid\_ds} la cui +A ciascuna coda è associata una struttura \kstruct{msqid\_ds} la cui definizione è riportata in fig.~\ref{fig:ipc_msqid_ds} ed a cui si accede includendo \headfiled{sys/msg.h}; % @@ -1536,13 +1537,13 @@ dovrà essere pari a \const{LENGTH}). Per capire meglio il funzionamento della funzione riprendiamo in considerazione la struttura della coda illustrata in -fig.~\ref{fig:ipc_mq_schema}. Alla chiamata di \func{msgsnd} il nuovo messaggio -sarà aggiunto in fondo alla lista inserendo una nuova struttura \struct{msg}, -il puntatore \var{msg\_last} di \struct{msqid\_ds} verrà aggiornato, come pure -il puntatore al messaggio successivo per quello che era il precedente ultimo -messaggio; il valore di \var{mtype} verrà mantenuto in \var{msg\_type} ed il -valore di \param{msgsz} in \var{msg\_ts}; il testo del messaggio sarà copiato -all'indirizzo specificato da \var{msg\_spot}. +fig.~\ref{fig:ipc_mq_schema}. Alla chiamata di \func{msgsnd} il nuovo +messaggio sarà aggiunto in fondo alla lista inserendo una nuova struttura +\kstruct{msg}, il puntatore \var{msg\_last} di \kstruct{msqid\_ds} verrà +aggiornato, come pure il puntatore al messaggio successivo per quello che era +il precedente ultimo messaggio; il valore di \var{mtype} verrà mantenuto in +\var{msg\_type} ed il valore di \param{msgsz} in \var{msg\_ts}; il testo del +messaggio sarà copiato all'indirizzo specificato da \var{msg\_spot}. Il valore dell'argomento \param{flag} permette di specificare il comportamento della funzione. Di norma, quando si specifica un valore nullo, la funzione @@ -2408,18 +2409,20 @@ versioni delle librerie del C, come le \acr{libc5}). \begin{figure}[!htb] \centering \includegraphics[width=12cm]{img/semtruct} - \caption{Schema della struttura di un insieme di semafori.} + \caption{Schema delle varie strutture di un insieme di semafori + (\kstructd{semid\_ds}, \kstructd{sem}, \kstructd{sem\_queue} e + \kstructd{sem\_undo}).} \label{fig:ipc_sem_schema} \end{figure} Alla creazione di un nuovo insieme viene allocata una nuova strutture -\struct{semid\_ds} ed il relativo vettore di strutture \struct{sem}. Quando si -richiede una operazione viene anzitutto verificato che tutte le operazioni +\kstruct{semid\_ds} ed il relativo vettore di strutture \kstruct{sem}. Quando +si richiede una operazione viene anzitutto verificato che tutte le operazioni possono avere successo; se una di esse comporta il blocco del processo il kernel crea una struttura \kstruct{sem\_queue} che viene aggiunta in fondo alla coda di attesa associata a ciascun insieme di semafori, che viene referenziata tramite i campi \var{sem\_pending} e \var{sem\_pending\_last} di -\struct{semid\_ds}. Nella struttura viene memorizzato il riferimento alle +\kstruct{semid\_ds}. Nella struttura viene memorizzato il riferimento alle operazioni richieste (nel campo \var{sops}, che è un puntatore ad una struttura \struct{sembuf}) e al processo corrente (nel campo \var{sleeper}) poi quest'ultimo viene messo stato di attesa e viene invocato lo @@ -3702,7 +3705,7 @@ una coda di messaggi POSIX è \funcd{mq\_open}, ed il suo prototipo è: La funzione apre la coda di messaggi identificata dall'argomento \param{name} restituendo il descrittore ad essa associato, del tutto analogo ad un file descriptor, con l'unica differenza che lo standard prevede un apposito tipo -\type{mqd\_t}. Nel caso di Linux si tratta in effetti proprio di un normale +\typed{mqd\_t}. Nel caso di Linux si tratta in effetti proprio di un normale file descriptor; pertanto, anche se questo comportamento non è portabile, lo si può tenere sotto osservazione con le funzioni dell'I/O multiplexing (vedi sez.~\ref{sec:file_multiplexing}) come possibile alternativa all'uso @@ -4479,10 +4482,9 @@ Si tenga presente che, come accennato in sez.~\ref{sec:ipc_posix_generic}, i semafori usano la semantica standard dei file per quanto riguarda i controlli di accesso, questo significa che un nuovo semaforo viene sempre creato con l'\ids{UID} ed il \ids{GID} effettivo del processo chiamante, e che i permessi -indicati con \param{mode} vengono filtrati dal valore della \itindex{umask} -\textit{umask} del processo. Inoltre per poter aprire un semaforo è -necessario avere su di esso sia il permesso di lettura che quello di -scrittura. +indicati con \param{mode} vengono filtrati dal valore della \textit{umask} del +processo. Inoltre per poter aprire un semaforo è necessario avere su di esso +sia il permesso di lettura che quello di scrittura. La funzione restituisce in caso di successo un puntatore all'indirizzo del semaforo con un valore di tipo \ctyp{sem\_t *}, è questo valore che dovrà diff --git a/macro.tex b/macro.tex index 5daa9dd..38b2f07 100644 --- a/macro.tex +++ b/macro.tex @@ -284,10 +284,15 @@ %\index{struttura dati del kernel!{#1}@{{\tt {#1}}}!definizione di}\texttt{#1}% %\index{#1@{{\tt {#1}} (struttura dati)}!definizione di}\texttt{#1}% } % struttura dati -\newcommand{\type}[1]{% +\newcommand{\typed}[1]{% \index{tipo di dato!{#1}@{{\tt {#1}}}}\texttt{#1}% %\index{#1@{{\tt {#1}} (tipo)}}\texttt{#1}% } % system type +\newcommand{\type}[1]{% +\texttt{#1}% +%\index{tipo di dato!{#1}@{{\tt {#1}}}}\texttt{#1}% +%\index{#1@{{\tt {#1}} (tipo)}}\texttt{#1}% +} % system type \newcommand{\struct}[1]{% \texttt{#1}% %\index{struttura dati!{#1}@{{\tt {#1}}}}\texttt{#1}% diff --git a/othersock.tex b/othersock.tex index 2474abe..6d73bee 100644 --- a/othersock.tex +++ b/othersock.tex @@ -131,11 +131,11 @@ la destinazione dei dati trasmessi o ottenere l'origine dei dati ricevuti. La prima di queste funzioni è \funcd{sendto} ed il suo prototipo\footnote{il prototipo illustrato è quello utilizzato dalle \acr{glibc}, che seguono le \textit{Single Unix Specification}, l'argomento \param{flags} era di tipo - \texttt{int} nei vari BSD4.*, mentre nelle \acr{libc4} e \acr{libc5} veniva - usato un \texttt{unsigned int}; l'argomento \param{len} era \texttt{int} nei - vari BSD4.* e nelle \acr{libc4}, ma \type{size\_t} nelle \acr{libc5}; infine - l'argomento \param{tolen} era \texttt{int} nei vari BSD4.* nelle \acr{libc4} - e nelle \acr{libc5}.} è: + \ctyp{int} nei vari BSD4.*, mentre nelle \acr{libc4} e \acr{libc5} veniva + usato un \texttt{unsigned int}; l'argomento \param{len} era \ctyp{int} nei + vari BSD4.* e nelle \acr{libc4}, ma \type{size\_t} nelle \acr{libc5}; + infine l'argomento \param{tolen} era \ctyp{int} nei vari BSD4.* nelle + \acr{libc4} e nelle \acr{libc5}.} è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/socket.h} @@ -220,9 +220,9 @@ La seconda funzione utilizzata nella comunicazione fra socket UDP è \funcd{recvfrom}, che serve a ricevere i dati inviati da un altro socket; il suo prototipo\footnote{il prototipo è quello delle \acr{glibc} che seguono le \textit{Single Unix Specification}, i vari BSD4.*, le \acr{libc4} e le - \acr{libc5} usano un \texttt{int} come valore di ritorno; per gli argomenti + \acr{libc5} usano un \ctyp{int} come valore di ritorno; per gli argomenti \param{flags} e \param{len} vale quanto detto a proposito di \func{sendto}; - infine l'argomento \param{fromlen} è \texttt{int} per i vari BSD4.*, le + infine l'argomento \param{fromlen} è \ctyp{int} per i vari BSD4.*, le \acr{libc4} e le \acr{libc5}.} è: \begin{functions} \headdecl{sys/types.h} diff --git a/process.tex b/process.tex index 4364288..592186c 100644 --- a/process.tex +++ b/process.tex @@ -1224,12 +1224,12 @@ segmento dati\footnote{in questo caso si tratta soltanto di una funzione di caso \var{errno} assumerà il valore \errcode{ENOMEM}.} \end{funcproto} -La funzione incrementa la dimensione dello \textit{heap} di un -programma del valore indicato dall'argomento \param{increment}, restituendo il -nuovo indirizzo finale dello stesso. L'argomento è definito come di tipo -\type{intptr\_t}, ma a seconda della versione delle librerie e del sistema può -essere indicato con una serie di tipi equivalenti come \ctyp{ptrdiff\_t}, -\ctyp{ssize\_t}, \ctyp{int}. Se invocata con un valore nullo la funzione +La funzione incrementa la dimensione dello \textit{heap} di un programma del +valore indicato dall'argomento \param{increment}, restituendo il nuovo +indirizzo finale dello stesso. L'argomento è definito come di tipo +\typed{intptr\_t}, ma a seconda della versione delle librerie e del sistema +può essere indicato con una serie di tipi equivalenti come \type{ptrdiff\_t}, +\type{ssize\_t}, \ctyp{int}. Se invocata con un valore nullo la funzione permette di ottenere l'attuale posizione della fine del segmento dati. Queste due funzioni sono state deliberatamente escluse dallo standard POSIX.1 @@ -2390,10 +2390,10 @@ una lista degli argomenti, la sua definizione è: } \end{funcbox}} -La macro inizializza il puntatore alla lista di argomenti \param{ap} che -deve essere una apposita variabile di tipo \type{va\_list}; il +La macro inizializza il puntatore alla lista di argomenti \param{ap} che deve +essere una apposita variabile di tipo \type{va\_list}; il parametro \param{last} deve indicare il nome dell'ultimo degli argomenti fissi -dichiarati nel prototipo della funzione \textit{variadic}. +dichiarati nel prototipo della funzione \textit{variadic}. \macrobeg{va\_arg} @@ -2485,15 +2485,15 @@ assolutamente normale pensare di poter effettuare questa operazione. \index{tipo!opaco|(} In generale però possono esistere anche realizzazioni diverse, ed è per questo -motivo che invece che di un semplice puntatore viene \type{va\_list} è quello -che viene chiamato un \textsl{tipo opaco}. Si chiamano così quei tipi di dati, -in genere usati da una libreria, la cui struttura interna non deve essere -vista dal programma chiamante (da cui deriva il nome opaco) che li devono -utilizzare solo attraverso dalle opportune funzioni di gestione. +motivo che invece che un semplice puntatore, \typed{va\_list} è quello che +viene chiamato un \textsl{tipo opaco}. Si chiamano così quei tipi di dati, in +genere usati da una libreria, la cui struttura interna non deve essere vista +dal programma chiamante (da cui deriva il nome opaco) che li devono utilizzare +solo attraverso dalle opportune funzioni di gestione. \index{tipo!opaco|)} -Per questo motivo una variabile di tipo \type{va\_list} non può essere +Per questo motivo una variabile di tipo \typed{va\_list} non può essere assegnata direttamente ad un'altra variabile dello stesso tipo, ma lo standard ISO C99\footnote{alcuni sistemi che non hanno questa macro provvedono al suo posto \macrod{\_\_va\_copy} che era il nome proposto in una bozza dello @@ -2598,7 +2598,7 @@ di salvare il contesto dello \textit{stack} è \funcd{setjmp}, il cui prototipo Quando si esegue la funzione il contesto corrente dello \textit{stack} viene salvato nell'argomento \param{env}, una variabile di tipo -\type{jmp\_buf}\footnote{anche questo è un classico esempio di variabile di +\typed{jmp\_buf}\footnote{anche questo è un classico esempio di variabile di \textsl{tipo opaco}.} che deve essere stata definita in precedenza. In genere le variabili di tipo \type{jmp\_buf} vengono definite come variabili globali in modo da poter essere viste in tutte le funzioni del programma. diff --git a/prochand.tex b/prochand.tex index df3eadc..62a7ea5 100644 --- a/prochand.tex +++ b/prochand.tex @@ -145,8 +145,9 @@ fig.~\ref{fig:proc_task_struct}. \begin{figure}[!htb] \centering \includegraphics[width=14cm]{img/task_struct} - \caption{Schema semplificato dell'architettura delle strutture usate dal - kernel nella gestione dei processi.} + \caption{Schema semplificato dell'architettura delle strutture ( + \kstructd{task\_struct}, \kstructd{fs\_struct}, \kstructd{file\_struct}) + usate dal kernel nella gestione dei processi.} \label{fig:proc_task_struct} \end{figure} @@ -3197,7 +3198,7 @@ conveniente l'uso dell'affinità di processore. Dato che il numero di processori può variare a seconda delle architetture, per semplificare l'uso dell'argomento \param{mask} la \acr{glibc} ha introdotto un -apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione +apposito dato di tipo, \typed{cpu\_set\_t},\footnote{questa è una estensione specifica della \acr{glibc}, da attivare definendo la macro \macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per questo tipo di interfaccia e POSIX al momento non prevede nulla al riguardo.} che @@ -3226,11 +3227,14 @@ se esso è già presente in un insieme, sono le seguenti: \fdecl{void \macrod{CPU\_ZERO}(cpu\_set\_t *set)} \fdesc{Inizializza un insieme di processori vuoto \param{set}.} \fdecl{void \macrod{CPU\_SET}(int cpu, cpu\_set\_t *set)} -\fdesc{Inserisce il processore \param{cpu} nell'insieme di processori \param{set}.} +\fdesc{Inserisce il processore \param{cpu} nell'insieme di + processori \param{set}.} \fdecl{void \macrod{CPU\_CLR}(int cpu, cpu\_set\_t *set)} -\fdesc{Rimuove il processore \param{cpu} nell'insieme di processori \param{set}.} +\fdesc{Rimuove il processore \param{cpu} nell'insieme di + processori \param{set}.} \fdecl{int \macrod{CPU\_ISSET}(int cpu, cpu\_set\_t *set)} -\fdesc{Controlla se il processore \param{cpu} è nell'insieme di processori \param{set}.} +\fdesc{Controlla se il processore \param{cpu} è nell'insieme di + processori \param{set}.} } \end{funcbox}} @@ -4356,7 +4360,7 @@ operazione è messa in discussione, per cui l'assenza di eventuali \textit{race condition} (vedi sez.~\ref{sec:proc_race_cond}) deve essere sempre verificata nei minimi dettagli. -In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t}, +In questo caso il sistema provvede un tipo di dato, il \typed{sig\_atomic\_t}, il cui accesso è assicurato essere atomico. In pratica comunque si può assumere che, in ogni piattaforma su cui è implementato Linux, il tipo \ctyp{int}, gli altri interi di dimensione inferiore ed i puntatori sono diff --git a/session.tex b/session.tex index 93f7d5e..5a96413 100644 --- a/session.tex +++ b/session.tex @@ -743,9 +743,9 @@ occorrerà predisporlo in modo che esso compia le seguenti azioni: il programma), per evitare che la directory da cui si è lanciato il processo resti in uso e non sia possibile rimuoverla o smontare il filesystem che la contiene. -\item Impostare la \itindex{umask} maschera dei permessi (di solito con - \code{umask(0)}) in modo da non essere dipendenti dal valore ereditato da - chi ha lanciato originariamente il processo. +\item Impostare la maschera dei permessi (di solito con \code{umask(0)}) in + modo da non essere dipendenti dal valore ereditato da chi ha lanciato + originariamente il processo. \item Chiudere tutti i file aperti che non servono più (in generale tutti); in particolare vanno chiusi i file standard che di norma sono ancora associati al terminale (un'altra opzione è quella di redirigerli verso @@ -1538,7 +1538,7 @@ ne aggiungono degli altri per mantenere ulteriori informazioni.\footnote{la I primi quattro campi sono quattro flag che controllano il comportamento del terminale; essi sono realizzati come maschera binaria, pertanto il tipo -\type{tcflag\_t} è di norma realizzato con un intero senza segno di lunghezza +\typed{tcflag\_t} è di norma realizzato con un intero senza segno di lunghezza opportuna. I valori devono essere specificati bit per bit, avendo cura di non modificare i bit su cui non si interviene. diff --git a/signal.tex b/signal.tex index 070ce85..2f5516b 100644 --- a/signal.tex +++ b/signal.tex @@ -1048,7 +1048,7 @@ quanto non sia la versione originaria, che di norma è definita come: questa infatti, per la poca chiarezza della sintassi del C quando si vanno a trattare puntatori a funzioni, è molto meno comprensibile. Da un confronto con il precedente prototipo si può dedurre la definizione di -\type{sighandler\_t} che è: +\typed{sighandler\_t} che è: \includecodesnip{listati/sighandler_t.c} e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno) e che prende un argomento di tipo \ctyp{int}. Si noti come si devono usare le @@ -2756,7 +2756,7 @@ mentre per la restituzione dei dati viene usato il campo \var{si\_value}. \end{minipage} \normalsize \caption{La definizione dell'unione \structd{sigval}, definita anche come - tipo \type{sigval\_t}.} + tipo \typed{sigval\_t}.} \label{fig:sig_sigval} \end{figure} @@ -3041,7 +3041,7 @@ tab.~\ref{tab:sig_timer_clockid_types}. % \const{} & .\\ \hline \end{tabular} - \caption{Valori possibili per una variabile di tipo \type{clockid\_t} + \caption{Valori possibili per una variabile di tipo \typed{clockid\_t} usata per indicare a quale tipo di orologio si vuole fare riferimento.} \label{tab:sig_timer_clockid_types} \end{table} @@ -3381,7 +3381,7 @@ per \var{sigev\_notify}, \signal{SIGALRM} per \var{sigev\_signo} e l'identificatore del timer come valore per \var{sigev\_value.sival\_int}. Il terzo argomento deve essere l'indirizzo di una variabile di tipo -\type{timer\_t} dove sarà scritto l'identificativo associato al timer appena +\typed{timer\_t} dove sarà scritto l'identificativo associato al timer appena creato, da usare in tutte le successive funzioni di gestione. Una volta creato questo identificativo resterà univoco all'interno del processo stesso fintanto che il timer non viene cancellato. @@ -3809,7 +3809,7 @@ prototipi sono: Le due funzioni prendono come primo argomento la variabile su cui viene salvato il contesto dello \textit{stack} per permettere il salto non-locale; -nel caso specifico essa è di tipo \type{sigjmp\_buf}, e non \type{jmp\_buf} +nel caso specifico essa è di tipo \typed{sigjmp\_buf}, e non \type{jmp\_buf} come per le analoghe di sez.~\ref{sec:proc_longjmp} in quanto in questo caso viene salvata anche la maschera dei segnali. diff --git a/sockadv.tex b/sockadv.tex index 5567f7c..91f41d4 100644 --- a/sockadv.tex +++ b/sockadv.tex @@ -77,8 +77,8 @@ flusso di dati normale. Come già accennato in sez.~\ref{sec:file_multiplexing} la presenza di dati urgenti viene rilevata in maniera specifica sia di \func{select} (con il -\itindex{file~descriptor~set} \textit{file descriptor set} \param{exceptfds}) -che da \func{poll} (con la condizione \const{POLLRDBAND}). +\textit{file descriptor set} \param{exceptfds}) che da \func{poll} (con la +condizione \const{POLLRDBAND}). Le modalità di lettura dei dati urgenti sono due, la prima e più comune diff --git a/sockctrl.tex b/sockctrl.tex index 7c73bdd..edf5801 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -4527,10 +4527,10 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: avere abilitato l'opzione \texttt{CONFIG\_SYN\_COOKIES} nella compilazione del kernel.} Prende un valore logico, e di default è disabilitato. Questa funzionalità serve a fornire una protezione in caso di un attacco di tipo - \index{SYN~flood} \textit{SYN flood}, e deve essere utilizzato come ultima - risorsa dato che costituisce una violazione del protocollo TCP e confligge - con altre funzionalità come le estensioni e può causare problemi per i - client ed il reinoltro dei pacchetti. + \textit{SYN flood}, e deve essere utilizzato come ultima risorsa dato che + costituisce una violazione del protocollo TCP e confligge con altre + funzionalità come le estensioni e può causare problemi per i client ed il + reinoltro dei pacchetti. \item[\sysctlrelfile{net/ipv4}{tcp\_syn\_retries}] imposta il numero di tentativi di ritrasmissione dei pacchetti SYN di inizio connessione del diff --git a/socket.tex b/socket.tex index 3c8dfa7..2287b17 100644 --- a/socket.tex +++ b/socket.tex @@ -439,20 +439,20 @@ definita nell'include file \headfile{sys/socket.h}. \multicolumn{1}{|c|}{\textbf{Header}} \\ \hline \hline - \type{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\ - \type{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\ - \type{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\ - \type{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\ - \type{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\ - \type{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\ + \typed{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\ + \typed{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\ + \typed{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\ + \typed{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\ + \typed{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\ + \typed{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\ \hline - \type{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\ - \type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di + \typed{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\ + \typed{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di un socket& \headfile{sys/socket.h}\\ \hline - \type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) & + \typed{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) & \headfile{netinet/in.h}\\ - \type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})& + \typed{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})& \headfile{netinet/in.h}\\ \hline \end{tabular} diff --git a/system.tex b/system.tex index 9e6abaf..2b464a5 100644 --- a/system.tex +++ b/system.tex @@ -77,23 +77,23 @@ tramite la funzione \func{sysconf} (che esamineremo a breve). \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{MB\_LEN\_MAX}& 16 & Massima dimensione di un - carattere esteso.\\ - \const{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\ - \const{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\ - \const{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\ - \const{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\ - \const{CHAR\_MIN} & 0 o -128 & Minimo di \ctyp{char}.\footnotemark\\ - \const{CHAR\_MAX} & 127 o 255 & Massimo di \ctyp{char}.\footnotemark\\ - \const{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\ - \const{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\ - \const{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\ - \const{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\ - \const{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\ - \const{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\ - \const{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\ - \const{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\ - \const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\ + \constd{MB\_LEN\_MAX}& 16 & Massima dimensione di un + carattere esteso.\\ + \constd{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\ + \constd{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\ + \constd{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\ + \constd{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\ + \constd{CHAR\_MIN} & 0 o -128 & Minimo di \ctyp{char}.\footnotemark\\ + \constd{CHAR\_MAX} & 127 o 255 & Massimo di \ctyp{char}.\footnotemark\\ + \constd{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\ + \constd{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\ + \constd{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\ + \constd{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\ + \constd{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\ + \constd{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\ + \constd{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\ + \constd{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\ + \constd{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\ \hline \end{tabular} \caption{Costanti definite in \headfile{limits.h} in conformità allo standard @@ -123,10 +123,10 @@ accessibili includendo \headfiled{float.h}. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{LLONG\_MAX}& 9223372036854775807& Massimo di \ctyp{long long}.\\ - \const{LLONG\_MIN}&-9223372036854775808& Minimo di \ctyp{long long}.\\ - \const{ULLONG\_MAX}&18446744073709551615& - Massimo di \ctyp{unsigned long long}.\\ + \constd{LLONG\_MAX} & 9223372036854775807& Massimo di \ctyp{long long}.\\ + \constd{LLONG\_MIN} &-9223372036854775808& Minimo di \ctyp{long long}.\\ + \constd{ULLONG\_MAX}&18446744073709551615& Massimo di \ctyp{unsigned long + long}.\\ \hline \end{tabular} \caption{Macro definite in \headfile{limits.h} in conformità allo standard @@ -134,7 +134,7 @@ accessibili includendo \headfiled{float.h}. \label{tab:sys_isoc90_macro} \end{table} -Lo standard prevede anche un'altra costante, \const{FOPEN\_MAX}, che può non +Lo standard prevede anche un'altra costante, \constd{FOPEN\_MAX}, che può non essere fissa e che pertanto non è definita in \headfile{limits.h}, essa deve essere definita in \headfile{stdio.h} ed avere un valore minimo di 8. A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo \ctyp{long @@ -156,21 +156,21 @@ sez.~\ref{sec:sys_file_limits}. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{ARG\_MAX} &131072& Dimensione massima degli argomenti - passati ad una funzione della famiglia - \func{exec}.\\ - \const{CHILD\_MAX} & 999& Numero massimo di processi contemporanei - che un utente può eseguire.\\ - \const{OPEN\_MAX} & 256& Numero massimo di file che un processo - può mantenere aperti in contemporanea.\\ - \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per - processo in contemporanea.\\ - \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una - \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}).\\ - \const{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\ + \constd{ARG\_MAX} &131072& Dimensione massima degli argomenti + passati ad una funzione della famiglia + \func{exec}.\\ + \constd{CHILD\_MAX} & 999& Numero massimo di processi contemporanei + che un utente può eseguire.\\ + \constd{OPEN\_MAX} & 256& Numero massimo di file che un processo + può mantenere aperti in contemporanea.\\ + \constd{STREAM\_MAX}& 8& Massimo numero di stream aperti per + processo in contemporanea.\\ + \constd{TZNAME\_MAX}& 6& Dimensione massima del nome di una + \textit{timezone} (vedi + sez.~\ref{sec:sys_time_base})).\\ + \constd{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per + processo (vedi sez.~\ref{sec:proc_access_id}).\\ + \constd{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\ \hline \end{tabular} \caption{Costanti per i limiti del sistema.} @@ -192,27 +192,27 @@ file, riportate in tab.~\ref{tab:sys_file_macro}. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti + \constd{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti passati ad una funzione della famiglia \func{exec}.\\ - \const{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi + \constd{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi contemporanei che un utente può eseguire.\\ - \const{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo + \constd{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo può mantenere aperti in contemporanea.\\ - \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per + \constd{\_POSIX\_STREAM\_MAX}& 8& Massimo numero di stream aperti per processo in contemporanea.\\ - \const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una + \constd{\_POSIX\_TZNAME\_MAX}& 6& Dimensione massima del nome di una \textit{timezone} (vedi sez.~\ref{sec:sys_date}). \\ - \const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali + \constd{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}).\\ - \const{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per + \constd{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per processo (vedi sez.~\ref{sec:proc_access_id}).\\ - \const{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo + \constd{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo \type{ssize\_t}.\\ % \const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\ % \const{\_POSIX\_AIO\_MAX} & 1& \\ @@ -252,16 +252,16 @@ valori ottenuti da \func{sysconf}. \textbf{Macro}&\textbf{Significato}\\ \hline \hline - \macro{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il - \textit{job control} (vedi - sez.~\ref{sec:sess_job_control}).\\ - \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del - gruppo \textit{saved} (vedi - sez.~\ref{sec:proc_access_id}) - per il controllo di accesso dei processi.\\ - \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1 - supportata nel formato YYYYMML (ad esempio - 199009L).\\ + \macrod{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il + \textit{job control} (vedi + sez.~\ref{sec:sess_job_control}).\\ + \macrod{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del + gruppo \textit{saved} (vedi + sez.~\ref{sec:proc_access_id}) + per il controllo di accesso dei processi.\\ + \macrod{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1 + supportata nel formato YYYYMML (ad esempio + 199009L).\\ \hline \end{tabular} \caption{Alcune macro definite in \headfile{limits.h} in conformità allo @@ -270,7 +270,7 @@ valori ottenuti da \func{sysconf}. \end{table} Oltre ai precedenti valori e a quelli relativi ai file elencati in -tab.~\ref{tab:sys_posix1_file},, che devono essere obbligatoriamente definiti, +tab.~\ref{tab:sys_posix1_file}, che devono essere obbligatoriamente definiti, lo standard POSIX.1 ne prevede molti altri. La lista completa si trova dall'header file \file{bits/posix1\_lim.h}, da non usare mai direttamente (è incluso automaticamente all'interno di \headfile{limits.h}). Di questi vale la @@ -330,8 +330,8 @@ relative spiegazioni, si può trovare nel manuale delle \acr{glibc}. \texttt{\_SC\_STREAM\_MAX}& \const{STREAM\_MAX}& Il massimo numero di stream che un processo può mantenere aperti in contemporanea. Questo - limite previsto anche dallo standard ANSI C, - che specifica la macro {FOPEN\_MAX}.\\ + limite è previsto anche dallo standard ANSI C, + che specifica la macro \const{FOPEN\_MAX}.\\ \texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}& La dimensione massima di un nome di una \texttt{timezone} (vedi @@ -404,14 +404,14 @@ riportate in tab.~\ref{tab:sys_file_macro}. \textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\ - \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\ - \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ - \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una \textit{pipe} + \constd{LINK\_MAX} &8 & Numero massimo di link a un file.\\ + \constd{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\ + \constd{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ + \constd{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una \textit{pipe} (vedi sez.~\ref{sec:ipc_pipes}).\\ - \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo + \constd{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo canonico (vedi sez.~\ref{sec:term_io_design}).\\ - \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input + \constd{MAX\_INPUT}&255 & Spazio disponibile nella coda di input del terminale (vedi sez.~\ref{sec:term_io_design}).\\ \hline @@ -434,20 +434,20 @@ analoghe di tab.~\ref{tab:sys_posix1_general}. \textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\ \hline \hline - \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\ - \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\ - \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un + \macrod{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\ + \macrod{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\ + \macrod{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ - \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una + \macrod{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una \textit{pipe}.\\ - \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di + \macrod{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di terminale in modo canonico.\\ - \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input + \macrod{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input del terminale.\\ -% \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\ -% \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\ -% \const{\_POSIX\_FD\_SETSIZE}& 16 & \\ -% \const{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\ +% \macrod{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\ +% \macrod{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\ +% \macrod{\_POSIX\_FD\_SETSIZE}& 16 & \\ +% \macrod{\_POSIX\_DELAYTIMER\_MAX}& 32 & \\ \hline \end{tabular} \caption{Costanti dei valori minimi delle caratteristiche dei file per la @@ -627,10 +627,10 @@ dall'argomento \param{info}. Si noti come in fig.~\ref{fig:sys_utsname} le dimensioni delle stringhe di \struct{utsname} non sono specificate. Il manuale delle \acr{glibc} indica -due costanti per queste dimensioni, \const{\_UTSNAME\_LENGTH} per i campi -standard e \const{\_UTSNAME\_DOMAIN\_LENGTH} per quello relativo al nome di -dominio, altri sistemi usano nomi diversi come \const{SYS\_NMLN} o -\const{\_SYS\_NMLN} o \const{UTSLEN} che possono avere valori diversi. Dato +due costanti per queste dimensioni, \constd{\_UTSNAME\_LENGTH} per i campi +standard e \constd{\_UTSNAME\_DOMAIN\_LENGTH} per quello relativo al nome di +dominio, altri sistemi usano nomi diversi come \constd{SYS\_NMLN} o +\constd{\_SYS\_NMLN} o \constd{UTSLEN} che possono avere valori diversi. Dato che il buffer per \struct{utsname} deve essere preallocato l'unico modo per farlo in maniera sicura è allora usare come dimensione il valore ottenuto con \code{sizeof(utsname)}. @@ -1004,10 +1004,10 @@ altri valori di default per i \textit{pathname} di uso più comune, viene mantenuto nei valori di una serie di costanti definite includendo \headfiled{paths.h}, in particolare quelle che ci interessano sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\const{\_PATH\_UTMP}] specifica il file che contiene il registro per gli - utenti correntemente collegati, questo è il valore che viene usato se non si - è utilizzato \func{utmpname} per modificarlo; -\item[\const{\_PATH\_WTMP}] specifica il file che contiene il registro per +\item[\constd{\_PATH\_UTMP}] specifica il file che contiene il registro per + gli utenti correntemente collegati, questo è il valore che viene usato se + non si è utilizzato \func{utmpname} per modificarlo; +\item[\constd{\_PATH\_WTMP}] specifica il file che contiene il registro per l'archivio storico degli utenti collegati; \end{basedescript} che nel caso di Linux hanno un valore corrispondente ai file @@ -1075,18 +1075,18 @@ corrispondente al valore del campo \var{ut\_id} specificato in \param{ut}. \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{EMPTY} & Non contiene informazioni valide.\\ - \const{RUN\_LVL} & Identica il runlevel del sistema.\\ - \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\ - \const{OLD\_TIME} & Identifica quando è stato modificato l'orologio di - sistema.\\ - \const{NEW\_TIME} & Identifica da quanto è stato modificato il - sistema.\\ - \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\ - \const{LOGIN\_PROCESS}& Identifica un processo di login.\\ - \const{USER\_PROCESS} & Identifica un processo utente.\\ - \const{DEAD\_PROCESS} & Identifica un processo terminato.\\ -% \const{ACCOUNTING} & ??? \\ + \constd{EMPTY} & Non contiene informazioni valide.\\ + \constd{RUN\_LVL} & Identica il runlevel del sistema.\\ + \constd{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\ + \constd{OLD\_TIME} & Identifica quando è stato modificato l'orologio di + sistema.\\ + \constd{NEW\_TIME} & Identifica da quanto è stato modificato il + sistema.\\ + \constd{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\ + \constd{LOGIN\_PROCESS}& Identifica un processo di login.\\ + \constd{USER\_PROCESS} & Identifica un processo utente.\\ + \constd{DEAD\_PROCESS} & Identifica un processo terminato.\\ +% \constd{ACCOUNTING} & ??? \\ \hline \end{tabular} \caption{Classificazione delle voci del registro a seconda dei @@ -1239,21 +1239,21 @@ e deve assumere indicato con una delle costanti seguente elenco, che illustra i comandi attualmente disponibili: \begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}} -\item[\const{LINUX\_REBOOT\_CMD\_CAD\_OFF}] Disabilita l'uso diretto della +\item[\constd{LINUX\_REBOOT\_CMD\_CAD\_OFF}] Disabilita l'uso diretto della combinazione \texttt{Ctrl-Alt-Del}, la cui pressione si traduce nell'invio - del segnale \const{SIGINT} a \texttt{init} (o più in generale al processo + del segnale \signal{SIGINT} a \texttt{init} (o più in generale al processo con \ids{PID} 1) il cui effetto dipende dalla configurazione di quest'ultimo. -\item[\const{LINUX\_REBOOT\_CMD\_CAD\_ON}] Attiva l'uso diretto della +\item[\constd{LINUX\_REBOOT\_CMD\_CAD\_ON}] Attiva l'uso diretto della combinazione \texttt{Ctrl-Alt-Del}, la cui pressione si traduce nell'esecuzione dell'azione che si avrebbe avuto chiamando \func{reboot} con il comando \const{LINUX\_REBOOT\_CMD\_RESTART}. -\item[\const{LINUX\_REBOOT\_CMD\_HALT}] Viene inviato sulla console il +\item[\constd{LINUX\_REBOOT\_CMD\_HALT}] Viene inviato sulla console il messaggio ``\textit{System halted.}'' l'esecuzione viene bloccata immediatamente ed il controllo passato al monitor nella ROM (se esiste e l'architettura lo consente). Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi saranno perduti. -\item[\const{LINUX\_REBOOT\_CMD\_KEXEC}] viene eseguito direttamente il nuovo +\item[\constd{LINUX\_REBOOT\_CMD\_KEXEC}] viene eseguito direttamente il nuovo kernel che è stato opportunamente caricato in memoria da una \func{kexec\_load} (che tratteremo a breve) eseguita in precedenza. La funzionalità è disponibile solo a partire dal kernel 2.6.13 e se il kernel @@ -1263,16 +1263,16 @@ illustra i comandi attualmente disponibili: di dover ripassare dalla inizializzazione da parte del BIOS ed il lancio del kernel attraverso un bootloader. Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi saranno perduti. -\item[\const{LINUX\_REBOOT\_CMD\_POWER\_OFF}] Viene inviato sulla console il +\item[\constd{LINUX\_REBOOT\_CMD\_POWER\_OFF}] Viene inviato sulla console il messaggio ``\textit{Power down.}'' l'esecuzione viene bloccata immediatamente e la macchina, se possibile, viene spenta. Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi saranno perduti. -\item[\const{LINUX\_REBOOT\_CMD\_RESTART}] Viene inviato sulla console il +\item[\constd{LINUX\_REBOOT\_CMD\_RESTART}] Viene inviato sulla console il messaggio ``\textit{Restarting system.}'' ed avviata immediatamente la procedura di riavvio ordinaria. Se non si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi saranno perduti. -\item[\const{LINUX\_REBOOT\_CMD\_RESTART2}] Viene inviato sulla console il +\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'} @@ -1355,10 +1355,10 @@ che sia effettivamente eseguibile sul proprio processore. \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito + \constd{KEXEC\_ON\_CRASH} & Il kernel caricato sarà eseguito automaticamente in caso di crollo del sistema.\\ - \const{KEXEC\_PRESERVE\_CONTEXT}& Viene preservato lo stato dei programmi + \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 @@ -1366,7 +1366,7 @@ che sia effettivamente eseguibile sul proprio processore. indicato un numero di segmento maggiore di zero.\\ \hline - \const{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella + \constd{KEXEC\_ARCH\_DEFAULT} & Il kernel caricato verrà eseguito nella architettura corrente. \\ \texttt{KEXEC\_ARCH\_XXX} & Il kernel caricato verrà eseguito nella architettura indicata (con \texttt{XXX} @@ -1506,16 +1506,16 @@ recepita nello standard POSIX.1-2001, che però indica come campi di \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{RUSAGE\_SELF} & Ritorna l'uso delle risorse del processo + \constd{RUSAGE\_SELF} & Ritorna l'uso delle risorse del processo corrente, che in caso di uso dei \textit{thread} ammonta alla somma delle risorse utilizzate da tutti i \textit{thread} del processo.\\ - \const{RUSAGE\_CHILDREN} & Ritorna l'uso delle risorse dell'insieme dei + \constd{RUSAGE\_CHILDREN} & Ritorna l'uso delle risorse dell'insieme dei processi figli di cui è ricevuto lo stato di terminazione, che a loro volta comprendono quelle dei loro figli e così via.\\ - \const{RUSAGE\_THREAD} & Ritorna l'uso delle risorse del \textit{thread} + \constd{RUSAGE\_THREAD} & Ritorna l'uso delle risorse del \textit{thread} chiamante.\\ \hline \end{tabular} @@ -1555,7 +1555,7 @@ 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, l'uso di \const{RUSAGE\_CHILDREN} comportava l'inserimento dell'ammontare delle risorse usate dai processi figli anche quando si era impostata una -azione di \const{SIG\_IGN} per il segnale \const{SIGCHLD} (per i segnali si +azione di \const{SIG\_IGN} per il segnale \signal{SIGCHLD} (per i segnali si veda cap.~\ref{cha:signals}). Il comportamento è stato corretto per aderire allo standard a partire dal kernel 2.6.9. @@ -1651,7 +1651,7 @@ rispettivi limiti e gli effetti causati dal superamento degli stessi sono riportati nel seguente elenco: \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}} -\item[\const{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione +\item[\constd{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione massima consentita per la memoria virtuale di un processo, il cosiddetto \textit{Address Space}, (vedi sez.~\ref{sec:proc_mem_gen}). Se il limite viene superato dall'uso di funzioni come \func{brk}, \func{mremap} o @@ -1663,13 +1663,13 @@ riportati nel seguente elenco: in tal caso il limite massimo indicabile resta 2Gb, altrimenti la risorsa si dà per non limitata. -\item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima +\item[\constd{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima dimensione per un file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File di dimensioni maggiori verranno troncati a questo valore, mentre con un valore nullo si bloccherà la creazione dei \textit{core dump}. -\item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo +\item[\constd{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il superamento del limite corrente comporta l'emissione di un segnale di \signal{SIGXCPU}, la cui azione predefinita (vedi @@ -1684,27 +1684,27 @@ riportati nel seguente elenco: intercettare sempre \signal{SIGXCPU} e terminare in maniera ordinata il processo con la prima ricezione. -\item[\const{RLIMIT\_DATA}] Questa risorsa indica, in byte, la massima +\item[\constd{RLIMIT\_DATA}] Questa risorsa indica, in byte, la massima 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}. -\item[\const{RLIMIT\_FSIZE}] Questa risorsa indica, in byte, la massima +\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 scrivere o di estendere il file oltre questa dimensione riceverà un segnale di \signal{SIGXFSZ}, che di norma termina il processo. Se questo segnale viene intercettato la \textit{system call} che ha causato l'errore fallirà con un errore di \errcode{EFBIG}. -\item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di +\item[\constd{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di \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 +\item[\constd{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare massimo di memoria che può essere bloccata in RAM da un processo (vedi sez.~\ref{sec:proc_mem_lock}). Dato che il \textit{memory locking} viene effettuato sulle pagine di memoria, il valore indicato viene automaticamente @@ -1723,7 +1723,7 @@ riportati nel seguente elenco: la semantica della risorsa cambiata. -\item[\const{RLIMIT\_MSGQUEUE}] Questa risorsa indica il numero massimo di +\item[\constd{RLIMIT\_MSGQUEUE}] Questa risorsa indica il numero massimo di byte che possono essere utilizzati da un utente, identificato con l'\ids{UID} reale del processo chiamante, per le code di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}). Per ciascuna coda che viene creata viene @@ -1735,25 +1735,25 @@ consente di evitare la creazione di una coda con un numero illimitato di messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa è stata introdotta con il kernel 2.6.8. -\item[\const{RLIMIT\_NICE}] Questa risorsa indica il numero massimo a cui può +\item[\constd{RLIMIT\_NICE}] Questa risorsa indica il numero massimo a cui può essere il portato il valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}). Dato che non possono essere usati numeri negativi per specificare un limite, il valore di \textit{nice} viene calcolato come \code{20-rlim\_cur}. Questa risorsa è stata introdotta con il kernel 2.6.12. -\item[\const{RLIMIT\_NOFILE}] Questa risorsa indica il numero massimo di file +\item[\constd{RLIMIT\_NOFILE}] Questa risorsa indica il numero massimo di file che un processo può aprire. Il tentativo di creazione di un ulteriore file descriptor farà fallire la funzione (\func{open}, \func{dup}, \func{pipe}, ecc.) con un errore \errcode{EMFILE}. -\item[\const{RLIMIT\_NPROC}] Questa risorsa indica il numero massimo di +\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 processo chiamante. Se il limite viene raggiunto \func{fork} fallirà con un \errcode{EAGAIN}. -\item[\const{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la +\item[\constd{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la dimensione massima della memoria residente (il cosiddetto RSS \itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size}) cioè l'ammontare della memoria associata al processo che risiede effettivamente @@ -1763,7 +1763,7 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa sez.~\ref{sec:file_memory_map}). Presente solo sui i kernel precedenti il 2.4.30. -\item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della +\item[\constd{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della priorità statica che un processo può assegnarsi o assegnare con \func{sched\_setscheduler} e \func{sched\_setparam} (vedi sez.~\ref{sec:proc_real_time}). Il limite è stato introdotto a partire dal @@ -1772,7 +1772,7 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa priorità statica ed utilizzare una politica di \textit{scheduling} di tipo \textit{real-time}. -\item[\const{RLIMIT\_RTTIME}] Questa risorsa indica, in microsecondi, il tempo +\item[\constd{RLIMIT\_RTTIME}] Questa risorsa indica, in microsecondi, il tempo massimo di CPU che un processo eseguito con una priorità statica può consumare. Il superamento del limite corrente comporta l'emissione di un segnale di \signal{SIGXCPU}, e quello del limite massimo di \signal{SIGKILL} @@ -1782,7 +1782,7 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa kernel 2.6.25 per impedire che un processo \textit{real-time} possa bloccare il sistema. -\item[\const{RLIMIT\_SIGPENDING}] Questa risorsa indica il numero massimo di +\item[\constd{RLIMIT\_SIGPENDING}] Questa risorsa indica il numero massimo di segnali che possono essere mantenuti in coda per ciascun utente, identificato per \ids{UID} reale. Il limite comprende sia i segnali normali che quelli \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) ed è @@ -1790,7 +1790,7 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa segnale che non sia già presente su una coda. Questo limite è stato introdotto con il kernel 2.6.8. -\item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima +\item[\constd{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima dimensione dello \textit{stack} del processo. Se il processo esegue operazioni che estendano lo \textit{stack} oltre questa dimensione riceverà un segnale di \signal{SIGSEGV}. @@ -2139,9 +2139,9 @@ comando \cmd{time}. Come accennato il \textit{process time} viene misurato nei cosiddetti \textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni effettuate dal timer di sistema, oggi lo standard POSIX richiede che esso sia -espresso come multiplo della costante \const{CLOCKS\_PER\_SEC} che deve essere -definita come 1000000, qualunque sia la risoluzione reale dell'orologio di -sistema e la frequenza delle interruzioni del timer che, come accennato in +espresso come multiplo della costante \constd{CLOCKS\_PER\_SEC} che deve +essere definita come 1000000, qualunque sia la risoluzione reale dell'orologio +di sistema e la frequenza delle interruzioni del timer che, come accennato in sez.~\ref{sec:proc_hierarchy} e come vedremo a breve, è invece data dalla costante \const{HZ}. @@ -2287,7 +2287,7 @@ così via per i relativi ``\textsl{discendenti}''. Come accennato in sez.~\ref{sec:sys_resource_use} per i kernel precedenti la versione 2.6.9 il tempo di processore dei processi figli veniva sommato -comunque chiedendo di ignorare \const{SIGCHLD} anche se lo standard POSIX +comunque chiedendo di ignorare \signal{SIGCHLD} anche se lo standard POSIX richiede esplicitamente che questo avvenga solo quando si riceve lo stato di uscita con una funzione della famiglia delle \func{wait}, anche in questo caso il comportamento è stato adeguato allo standard a partire dalla versione @@ -2513,12 +2513,12 @@ delle costanti elencate in tab.~\ref{tab:adjtimex_return}. \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{TIME\_OK} & 0 & Orologio sincronizzato.\\ - \const{TIME\_INS} & 1 & Inserimento di un \textit{leap second}.\\ - \const{TIME\_DEL} & 2 & Cancellazione di un \textit{leap second}.\\ - \const{TIME\_OOP} & 3 & \textit{leap second} in corso.\\ - \const{TIME\_WAIT} & 4 & \textit{leap second} avvenuto.\\ - \const{TIME\_BAD} & 5 & Orologio non sincronizzato.\\ + \constd{TIME\_OK} & 0 & Orologio sincronizzato.\\ + \constd{TIME\_INS} & 1 & Inserimento di un \textit{leap second}.\\ + \constd{TIME\_DEL} & 2 & Cancellazione di un \textit{leap second}.\\ + \constd{TIME\_OOP} & 3 & \textit{leap second} in corso.\\ + \constd{TIME\_WAIT} & 4 & \textit{leap second} avvenuto.\\ + \constd{TIME\_BAD} & 5 & Orologio non sincronizzato.\\ \hline \end{tabular} \caption{Possibili valori ritornati da \func{adjtimex} in caso di successo.} @@ -2558,38 +2558,38 @@ riportate in tab.~\ref{tab:sys_timex_mode}. \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{ADJ\_OFFSET} & 0x0001 & Imposta la differenza fra il tempo + \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}.\\ - \const{ADJ\_FREQUENCY} & 0x0002 & Imposta la differenza in frequenza + \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}.\\ - \const{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo + \constd{ADJ\_MAXERROR} & 0x0004 & Imposta il valore massimo dell'errore sul tempo, espresso in microsecondi nel campo \var{maxerror} di \struct{timex}.\\ - \const{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore + \constd{ADJ\_ESTERROR} & 0x0008 & Imposta la stima dell'errore sul tempo, espresso in microsecondi nel campo \var{esterror} di \struct{timex}.\\ - \const{ADJ\_STATUS} & 0x0010 & Imposta alcuni valori di stato + \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}.\\ - \const{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del + \constd{ADJ\_TIMECONST} & 0x0020 & Imposta la larghezza di banda del PLL implementato dal kernel, specificato nel campo \var{constant} di \struct{timex}.\\ - \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} + \constd{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} del timer in microsecondi, espresso nel campo \var{tick} di \struct{timex}.\\ - \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum + \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}.\\ diff --git a/tcpsock.tex b/tcpsock.tex index e1390a1..32075ed 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -1,4 +1,4 @@ -%% tcpsock.tex +bg%% tcpsock.tex %% %% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free @@ -958,9 +958,9 @@ kernel, compreso Linux 2.0, che mostrano le differenze fra diverse implementazioni. In Linux il significato di questo valore è cambiato a partire dal kernel 2.2 -per prevenire l'attacco chiamato \index{SYN~flood} \textit{SYN flood}. Questo -si basa sull'emissione da parte dell'attaccante di un grande numero di -pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP +per prevenire l'attacco chiamato \itindex{SYN~flood} \textit{SYN + flood}. Questo si basa sull'emissione da parte dell'attaccante di un grande +numero di pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP fasullo\footnote{con la tecnica che viene detta \textit{ip spoofing}.} così che i SYN$+$ACK vanno perduti e la coda delle connessioni incomplete viene saturata, impedendo di fatto ulteriori connessioni. @@ -2776,8 +2776,7 @@ nel caso dei socket, visto che possono intervenire tutte una serie di possibili condizioni di errore dovute alla rete. Occorre allora specificare chiaramente quali sono le condizioni per cui un socket risulta essere ``\textsl{pronto}'' quando viene passato come membro di uno dei tre -\itindex{file~descriptor~set} \textit{file descriptor set} usati da -\func{select}. +\textit{file descriptor set} usati da \func{select}. Le condizioni che fanno si che la funzione \func{select} ritorni segnalando che un socket (che sarà riportato nel primo insieme di file descriptor) è @@ -2915,27 +2914,27 @@ codice completo si trova nel file \file{TCP\_echo\_third.c} dei sorgenti allegati alla guida. In questo caso la funzione comincia (\texttt{\small 8--9}) con l'azzeramento -del \itindex{file~descriptor~set} \textit{file descriptor set} \var{fset} e -l'impostazione del valore \var{maxfd}, da passare a \func{select} come massimo -per il numero di file descriptor. Per determinare quest'ultimo si usa la macro -\code{max} definita nel nostro file \file{macro.h} che raccoglie una -collezione di macro di preprocessore di varia utilità. +del \textit{file descriptor set} \var{fset} e l'impostazione del valore +\var{maxfd}, da passare a \func{select} come massimo per il numero di file +descriptor. Per determinare quest'ultimo si usa la macro \code{max} definita +nel nostro file \file{macro.h} che raccoglie una collezione di macro di +preprocessore di varia utilità. La funzione prosegue poi (\texttt{\small 10--41}) con il ciclo principale, che viene ripetuto indefinitamente. Per ogni ciclo si reinizializza -(\texttt{\small 11--12}) il \itindex{file~descriptor~set} \textit{file - descriptor set}, impostando i valori per il file descriptor associato al -socket \var{socket} e per lo standard input (il cui valore si recupera con la -funzione \func{fileno}). Questo è necessario in quanto la successiva -(\texttt{\small 13}) chiamata a \func{select} comporta una modifica dei due -bit relativi, che quindi devono essere reimpostati all'inizio di ogni ciclo. +(\texttt{\small 11--12}) il \textit{file descriptor set}, impostando i valori +per il file descriptor associato al socket \var{socket} e per lo standard +input (il cui valore si recupera con la funzione \func{fileno}). Questo è +necessario in quanto la successiva (\texttt{\small 13}) chiamata a +\func{select} comporta una modifica dei due bit relativi, che quindi devono +essere reimpostati all'inizio di ogni ciclo. Si noti come la chiamata a \func{select} venga eseguita usando come primo argomento il valore di \var{maxfd}, precedentemente calcolato, e passando poi -il solo \itindex{file~descriptor~set} \textit{file descriptor set} per il -controllo dell'attività in lettura, negli altri argomenti sono passati tutti -puntatori nulli, non interessando né il controllo delle altre attività, né -l'impostazione di un valore di timeout. +il solo \textit{file descriptor set} per il controllo dell'attività in +lettura, negli altri argomenti sono passati tutti puntatori nulli, non +interessando né il controllo delle altre attività, né l'impostazione di un +valore di timeout. Al ritorno di \func{select} si provvede a controllare quale dei due file descriptor presenta attività in lettura, cominciando (\texttt{\small 14--24}) @@ -3211,8 +3210,8 @@ precedente versione causava l'immediato ritorno della funzione; in questo caso prima (\texttt{\small 19}) si imposta opportunamente \var{eof} ad un valore non nullo, dopo di che (\texttt{\small 20}) si effettua la chiusura del lato in scrittura del socket con \func{shutdown}. Infine (\texttt{\small 21}) si -usa la macro \macro{FD\_CLR} per togliere lo standard input dal -\itindex{file~descriptor~set} \textit{file descriptor set}. +usa la macro \macro{FD\_CLR} per togliere lo standard input dal \textit{file + descriptor set}. In questo modo anche se la lettura del file in ingresso è conclusa, la funzione non esce dal ciclo principale (\texttt{\small 11--50}), ma continua @@ -3293,15 +3292,14 @@ aperti viene impostato a quello del socket in ascolto,\footnote{in quanto esso alto.} che verrà anche (\texttt{\small 4}) inserito nella tabella. La prima sezione (\texttt{\small 7--10}) del ciclo principale esegue la -costruzione del \itindex{file~descriptor~set} \textit{file descriptor set} -\var{fset} in base ai socket connessi in un certo momento; all'inizio ci sarà -soltanto il socket in ascolto, ma nel prosieguo delle operazioni, verranno -utilizzati anche tutti i socket connessi registrati nella tabella -\var{fd\_open}. Dato che la chiamata di \func{select} modifica il valore del -\itindex{file~descriptor~set} \textit{file descriptor set}, è necessario -ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi procedere -con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket trovati -attivi. +costruzione del \textit{file descriptor set} \var{fset} in base ai socket +connessi in un certo momento; all'inizio ci sarà soltanto il socket in +ascolto, ma nel prosieguo delle operazioni, verranno utilizzati anche tutti i +socket connessi registrati nella tabella \var{fd\_open}. Dato che la chiamata +di \func{select} modifica il valore del \textit{file descriptor set}, è +necessario ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi +procedere con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket +trovati attivi. Per far questo si usa la caratteristica dei file descriptor, descritta in sez.~\ref{sec:file_open_close}, per cui il kernel associa sempre ad ogni nuovo @@ -3351,13 +3349,13 @@ vi sono dati sui socket connessi, per questo si ripete un ciclo diverso da zero; in questo modo se l'unico socket con attività era quello connesso, avendo opportunamente decrementato il contatore, il ciclo verrà saltato, e si ritornerà immediatamente (ripetuta l'inizializzazione del -\itindex{file~descriptor~set} \textit{file descriptor set} con i nuovi valori -nella tabella) alla chiamata di \func{accept}. Se il socket attivo non è -quello in ascolto, o ce ne sono comunque anche altri, il valore di \var{n} non -sarà nullo ed il controllo sarà eseguito. Prima di entrare nel ciclo comunque -si inizializza (\texttt{\small 28}) il valore della variabile \var{i} che -useremo come indice nella tabella \var{fd\_open} al valore minimo, -corrispondente al file descriptor del socket in ascolto. +\textit{file descriptor set} con i nuovi valori nella tabella) alla chiamata +di \func{accept}. Se il socket attivo non è quello in ascolto, o ce ne sono +comunque anche altri, il valore di \var{n} non sarà nullo ed il controllo sarà +eseguito. Prima di entrare nel ciclo comunque si inizializza (\texttt{\small + 28}) il valore della variabile \var{i} che useremo come indice nella tabella +\var{fd\_open} al valore minimo, corrispondente al file descriptor del socket +in ascolto. Il primo passo (\texttt{\small 30}) nella verifica è incrementare il valore dell'indice \var{i} per posizionarsi sul primo valore possibile per un file @@ -3433,8 +3431,7 @@ maggior parte dei casi, in quanto essa è nata sotto BSD proprio per affrontare queste problematiche con i socket. Abbiamo però visto in sez.~\ref{sec:file_multiplexing} come la funzione \func{poll} possa costituire una alternativa a \func{select}, con alcuni vantaggi.\footnote{non soffrendo - delle limitazioni dovute all'uso dei \itindex{file~descriptor~set} - \textit{file descriptor set}.} + delle limitazioni dovute all'uso dei \textit{file descriptor set}.} Ancora una volta in sez.~\ref{sec:file_poll} abbiamo trattato la funzione in maniera generica, parlando di file descriptor, ma come per \func{select} @@ -3570,11 +3567,9 @@ uscita e notifica in caso si errore (\texttt{\small 49--52}). Come si può notare la logica del programma è identica a quella vista in fig.~\ref{fig:TCP_SelectEchod} per l'analogo server basato su \func{select}; la sola differenza significativa è che in questo caso non c'è bisogno di -rigenerare i \itindex{file~descriptor~set} \textit{file descriptor set} in -quanto l'uscita è indipendente dai dati in ingresso. Si applicano comunque -anche a questo server le considerazioni finali di -sez.~\ref{sec:TCP_serv_select}. - +rigenerare i \textit{file descriptor set} in quanto l'uscita è indipendente +dai dati in ingresso. Si applicano comunque anche a questo server le +considerazioni finali di sez.~\ref{sec:TCP_serv_select}.