tipo di operazioni; \textit{epoll} è in grado di operare sia in modalità
\textit{level triggered} che \textit{edge triggered}.
-La prima versione di \textit{epoll} prevedeva l'apertura di uno speciale file
-di dispositivo, \texttt{/dev/epoll}, per ottenere un file descriptor da
+La prima versione di \textit{epoll} prevedeva l'uso di uno speciale file di
+dispositivo, \texttt{/dev/epoll}, per ottenere un file descriptor da
utilizzare con le funzioni dell'interfaccia ma poi si è passati all'uso di
apposite \textit{system call}. Il primo passo per usare l'interfaccia di
\textit{epoll} è pertanto quello ottenere detto file descriptor chiamando una
potranno essere ricevuti normalmente una volta che si rimuova il blocco
imposto con \func{sigprocmask}.
-Oltre che con le funzioni dell'\textit{I/O multiplexing} l'uso del file
-descriptor restituito da \func{signalfd} cerca di seguire la semantica di un
-sistema unix-like anche con altre \textit{system call}; in particolare esso
+Oltre a poter essere usato con le funzioni dell'\textit{I/O multiplexing}, il
+file descriptor restituito da \func{signalfd} cerca di seguire la semantica di
+un sistema unix-like anche con altre \textit{system call}; in particolare esso
resta aperto (come ogni altro file descriptor) attraverso una chiamata ad
\func{exec}, a meno che non lo si sia creato con il flag di
\const{SFD\_CLOEXEC} o si sia successivamente impostato il
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.90\textwidth}
+ \begin{minipage}[c]{0.95\textwidth}
\includestruct{listati/signalfd_siginfo.h}
\end{minipage}
\normalsize
\label{fig:fiforeporter_code_init}
\end{figure}
-Il contenuto di \struct{signalfd\_siginfo} ricalca da vicino quella della
-analoga struttura \struct{siginfo\_t} (illustrata in
+Il contenuto di \struct{signalfd\_siginfo} ricalca da vicino quella
+dell'analoga struttura \struct{siginfo\_t} (illustrata in
fig.~\ref{fig:sig_siginfo_t}) usata dall'interfaccia ordinaria dei segnali, e
restituisce dati simili. Come per \struct{siginfo\_t} i campi che vengono
avvalorati dipendono dal tipo di segnale e ricalcano i valori che abbiamo già
\end{funcproto}
\noindent anche di questa funzione esiste una analoga \func{fflush\_unlocked}
-(accessibile definendo \macro{\_BSD\_SOURCE} o \macro{\_SVID\_SOURCE} o
+(accessibile definendo una fra \macro{\_BSD\_SOURCE}, \macro{\_SVID\_SOURCE} o
\macro{\_GNU\_SOURCE}) che non effettua il blocco dello \textit{stream}.
% TODO aggiungere prototipo \func{fflush\_unlocked}?
% distance from margins for boxedminipage
%\fboxsep=6pt
+% less hspace for tables
+\setlength{\tabcolsep}{0.5em}
+
+
\part{Programmazione di sistema}
\label{part:progr-di-sist}
\include{intro}
direttamente (in lettura o scrittura) all'oggetto. In tal caso lo schema dei
controlli è simile a quello dei file, ed avviene secondo questa sequenza:
\begin{itemize*}
-\item se il processo ha i privilegi di amministratore (più precisamente la
- capacità \const{CAP\_IPC\_OWNER}) l'accesso è sempre consentito.
+\item se il processo ha i privilegi di amministratore (più precisamente
+ \const{CAP\_IPC\_OWNER}) l'accesso è sempre consentito.
\item se l'\ids{UID} effettivo del processo corrisponde o al valore del campo
\var{cuid} o a quello del campo \var{uid} ed il permesso per il proprietario
in \var{mode} è appropriato\footnote{per appropriato si intende che è
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{.90\textwidth}
+ \begin{minipage}[c]{.91\textwidth}
\includestruct{listati/msqid_ds.h}
\end{minipage}
\normalsize
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{.80\textwidth}
+ \begin{minipage}[c]{.85\textwidth}
\includestruct{listati/semid_ds.h}
\end{minipage}
\normalsize
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{.80\textwidth}
+ \begin{minipage}[c]{.85\textwidth}
\includestruct{listati/sem.h}
\end{minipage}
\normalsize
poi quest'ultimo viene messo stato di attesa e viene invocato lo
\textit{scheduler} per passare all'esecuzione di un altro processo.
-Se invece tutte le operazioni possono avere successo queste vengono eseguite
+Se invece tutte le operazioni possono avere successo vengono eseguite
immediatamente, dopo di che il kernel esegue una scansione della coda di
attesa (a partire da \var{sem\_pending}) per verificare se qualcuna delle
operazioni sospese in precedenza può essere eseguita, nel qual caso la
di \errcode{EINVAL}. Se \param{attr} è un puntatore nullo gli attributi della
coda saranno impostati ai valori predefiniti.
-I suddetti limiti di sistema sono impostati attraverso altrettanti file in
-\texttt{/proc/sys/fs/mqueue}, in particolare i file che controllano i valori
-dei limiti sono:
+I suddetti limiti di sistema sono impostati attraverso una serie di file
+presenti sotto \texttt{/proc/sys/fs/mqueue}, in particolare i file che
+controllano i valori dei limiti sono:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\sysctlfiled{fs/mqueue/msg\_max}] Indica il valore massimo del numero di
messaggi in una coda e agisce come limite superiore per il valore di
Se quest'ultima eccede la dimensione massima specificata da \var{mq\_msgsize}
le funzioni ritornano immediatamente con un errore di \errcode{EMSGSIZE}.
-L'argomento \param{msg\_prio} indica la priorità dell'argomento, che, essendo
-definito come \ctyp{unsigned int}, è sempre un intero positivo. I messaggi di
+L'argomento \param{msg\_prio} indica la priorità dell'argomento che essendo
+definito come \ctyp{unsigned int} è sempre un intero positivo. I messaggi di
priorità maggiore vengono inseriti davanti a quelli di priorità inferiore, e
quindi saranno riletti per primi. A parità del valore della priorità il
messaggio sarà inserito in coda a tutti quelli che hanno la stessa priorità
eseguite da \file{message\_getter}). Terminato il tempo di attesa si rilascerà
(\texttt{\small 29-32}) il semaforo per poi uscire.
-Per verificare il funzionamento dei programmi occorrerà lanciare per primo
-\file{message\_getter}\footnote{lanciare per primo \file{message\_setter} darà
- luogo ad un errore, non essendo stati creati il semaforo ed il segmento di
- memoria condivisa.} che inizierà a stampare una volta al secondo il
-contenuto del messaggio ed i suoi dati, con qualcosa del tipo:
+Per verificare il funzionamento dei programmi occorrerà lanciare prima
+\file{message\_getter} (lanciare per primo \file{message\_setter} darebbe
+luogo ad un errore, non essendo stati creati il semaforo ed il segmento di
+memoria condivisa) che inizierà a stampare una volta al secondo il contenuto
+del messaggio ed i suoi dati, con qualcosa del tipo:
\begin{Console}
piccardi@hain:~/gapil/sources$ \textbf{./message_getter messaggio}
sem=1, Fri Dec 31 14:12:41 2010
\end{Console}
%$
dove il programma si fermerà per 3 secondi prima di rilasciare il semaforo e
-terminare.
-
-L'effetto di questo programma si potrà però apprezzare meglio nell'uscita di
-\file{message\_getter}, che verrà interrotta per questo stesso tempo, prima di
+terminare. L'effetto di tutto ciò si potrà vedere nell'\textit{output} di
+\file{message\_getter}, che verrà interrotto per questo stesso tempo, prima di
ricominciare con il nuovo testo:
\begin{Console}
...
struct in_addr imsf_multiaddr; /* IP multicast group address */
struct in_addr imsf_interface; /* IP address of local interface */
uint32_t imsf_fmode; /* Filter-mode */
- uint32_t imsf_numsrc; /* Number of sources in the following array */
+ uint32_t imsf_numsrc; /* Number of sources in the
+ following array */
struct in_addr imsf_slist[1]; /* Array of source addresses */
};
-#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH)
+#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH)
indirizzi di IPv6 sono in genere scritti come sequenze di otto numeri
esadecimali di 4 cifre (cioè a gruppi di 16 bit) usando i due punti come
separatore; cioè qualcosa del tipo
-\texttt{5f1b:df00:ce3e:e200:0020:0800:2078:e3e3}.
-
+\texttt{1080:0000:0000:0008:0800:ba98:2078:e3e3}.
Visto che la notazione resta comunque piuttosto pesante esistono alcune
-abbreviazioni; si può evitare di scrivere gli zeri iniziali per cui si
-può scrivere \texttt{1080:0:0:0:8:800:ba98:2078:e3e3}; se poi un intero è
-zero si può omettere del tutto, così come un insieme di zeri (ma questo
-solo una volta per non generare ambiguità) per cui il precedente indirizzo
-si può scrivere anche come \texttt{1080::8:800:ba98:2078:e3e3}.
+abbreviazioni: si può evitare di scrivere gli zeri iniziali delle singole
+cifre, abbreviando l'indirizzo precedente in \texttt{1080:0:0:8:800:ba98:2078:e3e3}; se
+poi un intero è zero si può omettere del tutto, così come un insieme di zeri
+(ma questo solo una volta per non generare ambiguità) per cui il precedente
+indirizzo si può scrivere anche come \texttt{1080::8:800:ba98:2078:e3e3}.
Infine per scrivere un indirizzo IPv4 all'interno di un indirizzo IPv6 si
può usare la vecchia notazione con i punti, per esempio
In questo capitolo sarà fatta un'introduzione ai concetti generali che servono
come prerequisiti per capire la programmazione di rete, non tratteremo quindi
-aspetti specifici ma faremo una breve introduzione al modello più comune usato
+aspetti specifici ma faremo una breve introduzione ai modelli più comuni usati
nella programmazione di rete, per poi passare ad un esame a grandi linee dei
-protocolli di rete e di come questi sono organizzati e interagiscono.
+protocolli di rete e di come questi sono organizzati e interagiscono.
In particolare, avendo assunto l'ottica di un'introduzione mirata alla
programmazione, ci concentreremo sul gruppo di protocolli più diffuso, il
\section{Modelli di programmazione}
\label{sec:net_prog_model}
-
La differenza principale fra un'applicazione di rete e un programma normale è
che quest'ultima per definizione concerne la comunicazione fra processi
diversi, che in generale non girano neanche sulla stessa macchina. Questo già
centrali, e soprattutto quello di trasporto.
La principale interfaccia usata nella programmazione di rete, quella dei
-socket (vedi sez.~\ref{cha:socket_intro}), è infatti un'interfaccia nei
-confronti di quest'ultimo. Questo avviene perché al di sopra del livello di
-trasporto i programmi hanno a che fare solo con dettagli specifici delle
+socket (che vedremo in sez.~\ref{cha:socket_intro}), è infatti un'interfaccia
+nei confronti di quest'ultimo. Questo avviene perché al di sopra del livello
+di trasporto i programmi hanno a che fare solo con dettagli specifici delle
applicazioni, mentre al di sotto vengono curati tutti i dettagli relativi alla
comunicazione. È pertanto naturale definire una interfaccia di programmazione
su questo confine, tanto più che è proprio lì (come evidenziato in
\item[\textsl{TCP}] \textit{Trasmission Control Protocol}. È un protocollo
orientato alla connessione che provvede un trasporto affidabile per un
flusso di dati bidirezionale fra due stazioni remote. Il protocollo ha cura
- di tutti gli aspetti del trasporto, come l'\textit{acknoweledgment} (il
- ricevuto), i timeout, la ritrasmissione, ecc. È usato dalla maggior parte
- delle applicazioni.
+ di tutti gli aspetti del trasporto dei dati, come l'\textit{acknowledgment}
+ (il ricevuto), i timeout, la ritrasmissione, ecc. È usato dalla maggior
+ parte delle applicazioni.
\item[\textsl{UDP}] \textit{User Datagram Protocol}. È un protocollo senza
connessione, per l'invio di dati a pacchetti. Contrariamente al TCP il
protocollo non è affidabile e non c'è garanzia che i pacchetti raggiungano
\subsection{Internet Protocol (IP)}
\label{sec:net_ip}
-Quando si parla di IP ci si riferisce in genere alla versione attualmente in
-uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione
-venne standardizzata nel 1981
+Quando si parla di \textit{Internet Protocol} (IP) si fa in genere riferimento
+ad una versione (la quarta, da cui il nome IPv4) che è quella più usata
+comunemente, anche se ormai si sta diffondendo sempre di più la nuova versione
+IPv6. Il protocollo IPv4 venne standardizzato nel 1981
dall'\href{http://www.ietf.org/rfc/rfc0719.txt}{RFC~719}.
-Internet Protocol nasce per disaccoppiare le applicazioni della struttura
-hardware delle reti di trasmissione, e creare una interfaccia di trasmissione
-dei dati indipendente dal sottostante substrato di rete, che può essere
-realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI, ecc.).
-Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer
-all'altro della rete; le caratteristiche essenziali con cui questo viene
-realizzato in IPv4 sono due:
+Il protocollo IP (indipendentemente dalla versione) nasce per disaccoppiare le
+applicazioni della struttura hardware delle reti di trasmissione, e creare una
+interfaccia di trasmissione dei dati indipendente dal sottostante substrato di
+interconnessione fisica, che può essere realizzato con le tecnologie più
+disparate (Ethernet, Token Ring, FDDI, ecc.). Il compito di IP è pertanto
+quello di trasmettere i pacchetti da un computer all'altro della rete; le
+caratteristiche essenziali con cui questo viene realizzato in sono due:
\begin{itemize}
\item \textit{Universal addressing} la comunicazione avviene fra due stazioni
essere riavvolto);
\item le operazioni eseguite con \func{ioctl} che non è detto possano essere
eseguite immediatamente;
-\item le funzioni di intercomunicazione fra processi (vedi cap.~\ref{cha:IPC})
- che si bloccano in attesa di risposte da altri processi;
-\item la funzione \func{pause} (vedi sez.~\ref{sec:sig_pause_sleep}) e le
- analoghe \func{sigsuspend}, \func{sigtimedwait}, e \func{sigwaitinfo} (vedi
- sez.~\ref{sec:sig_real_time}), usate appunto per attendere l'arrivo di un
- segnale;
-\item le funzioni associate al \textit{file locking} (vedi
+\item l'uso di funzioni di intercomunicazione fra processi (vedi
+ cap.~\ref{cha:IPC}) che si bloccano in attesa di risposte da altri processi;
+\item l'uso della funzione \func{pause} (vedi sez.~\ref{sec:sig_pause_sleep})
+ e le analoghe \func{sigsuspend}, \func{sigtimedwait}, e \func{sigwaitinfo}
+ (vedi sez.~\ref{sec:sig_real_time}), usate appunto per attendere l'arrivo di
+ un segnale;
+\item l'uso delle funzioni associate al \textit{file locking} (vedi
sez.~\ref{sec:file_locking})
-\item la funzione \func{wait} e le analoghe funzioni di attesa se nessun
- processo figlio è ancora terminato.
+\item l'uso della funzione \func{wait} e le analoghe funzioni di attesa se
+ nessun processo figlio è ancora terminato.
\end{itemize*}
In questo caso si pone il problema di cosa fare una volta che il gestore sia
possa essere stato richiesto il riavvio automatico, queste funzioni sono:
\begin{itemize*}
-\item le funzioni di attesa di un segnale, come \func{pause} (vedi
- sez.~\ref{sec:sig_pause_sleep}), \func{sigsuspend}, \func{sigtimedwait}, e
+\item le funzioni di attesa di un segnale: \func{pause} (vedi
+ sez.~\ref{sec:sig_pause_sleep}) o \func{sigsuspend}, \func{sigtimedwait}, e
\func{sigwaitinfo} (vedi sez.~\ref{sec:sig_real_time}).
-\item le funzioni di attesa dell'\textit{I/O multiplexing}, come
- \func{select}, \func{pselect}, \func{poll}, \func{ppoll}, \func{epoll\_wait}
- e \func{epoll\_pwait} (vedi sez.~\ref{sec:file_multiplexing}).
+\item le funzioni di attesa dell'\textit{I/O multiplexing} (vedi
+ sez.~\ref{sec:file_multiplexing}) come \func{select}, \func{pselect},
+ \func{poll}, \func{ppoll}, \func{epoll\_wait} e \func{epoll\_pwait}.
\item le funzioni del System V IPC che prevedono attese: \func{msgrcv},
\func{msgsnd} (vedi sez.~\ref{sec:ipc_sysv_mq}), \func{semop} e
\func{semtimedop} (vedi sez.~\ref{sec:ipc_sysv_sem}).
-\item le funzioni di attesa di un processo: \func{usleep}, \func{nanosleep}
- (vedi sez.~\ref{sec:sig_pause_sleep}) e \func{clock\_nanosleep} (vedi
- sez.~\ref{sec:sig_timer_adv}).
+\item le funzioni per la messa in attesa di un processo come \func{usleep},
+ \func{nanosleep} (vedi sez.~\ref{sec:sig_pause_sleep}) e
+ \func{clock\_nanosleep} (vedi sez.~\ref{sec:sig_timer_adv}).
\item le funzioni che operano sui socket quando è stato impostato un
\textit{timeout} sugli stessi con \func{setsockopt} (vedi
sez.~\ref{sec:sock_generic_options}) ed in particolare \func{accept},
POSIX.1 ha ridefinito completamente l'interfaccia per la gestione dei segnali,
rendendola molto più flessibile e robusta, anche se leggermente più complessa.
-La funzione di sistema principale prevista dall'interfaccia POSIX.1 per i
-segnali è \funcd{sigaction}. Essa ha sostanzialmente lo stesso uso di
-\func{signal}, permette cioè di specificare le modalità con cui un segnale può
-essere gestito da un processo. Il suo prototipo è:
+La principale funzione di sistema prevista dall'interfaccia POSIX.1 per la
+gestione dei segnali è \funcd{sigaction}. Essa ha sostanzialmente lo stesso
+uso di \func{signal}, permette cioè di specificare le modalità con cui un
+segnale può essere gestito da un processo. Il suo prototipo è:
\begin{funcproto}{
\fhead{signal.h}
classica il segnale sarà generato, ma tutte le caratteristiche tipiche dei
segnali \textit{real-time} (priorità e coda) saranno perse.
-Secondo lo standard POSIX la profondità della coda è indicata dalla costante
+Per lo standard POSIX la profondità della coda è indicata dalla costante
\constd{SIGQUEUE\_MAX}, una della tante costanti di sistema definite dallo
standard POSIX che non abbiamo riportato esplicitamente in
sez.~\ref{sec:sys_limits}. Il suo valore minimo secondo lo standard,
indirizzi generiche, questo sia ancora di tipo \texttt{char **} e si possa
riutilizzare lo stesso puntatore usato per i nomi.
-Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) ad una
+Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) a una
conversione con la funzione \func{inet\_ntop} (vedi
sez.~\ref{sec:sock_addr_func}) passandole gli opportuni argomenti, questa
restituirà la stringa da stampare (\texttt{\small 42}) con il valore
specificare come argomento per questa opzione sono impostabili tramiti gli
opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
- Si tenga presente che nel caso di socket TCP, per entrambe le opzioni
- \const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una
- quantità di memoria doppia rispetto a quanto richiesto con
- \func{setsockopt}. Questo comporta che una successiva lettura con
+ Si tenga presente che nel caso di socket TCP il kernel alloca effettivamente
+ una quantità di memoria doppia rispetto a quanto richiesto con
+ \func{setsockopt} per entrambe le opzioni \const{SO\_RCVBUF} e
+ \const{SO\_SNDBUF}. Questo comporta che una successiva lettura con
\func{getsockopt} riporterà un valore diverso da quello impostato con
\func{setsockopt}. Questo avviene perché TCP necessita dello spazio in più
per mantenere dati amministrativi e strutture interne, e solo una parte
\item[\constd{SO\_RCVBUFFORCE}] questa opzione, presente dal kernel 2.6.14, è
identica a \const{SO\_RCVBUF} ma consente ad un processo con i privilegi di
- amministratore (con la \textit{capability} \const{CAP\_NET\_ADMIN}) di
- impostare in valore maggiore del limite di
+ amministratore (per la precisione con la \textit{capability}
+ \const{CAP\_NET\_ADMIN}) di impostare in valore maggiore del limite di
\sysctlrelfile{net/core}{rmem\_max}.
\item[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
\item[\constd{SO\_SNDBUFFORCE}] questa opzione, presente dal kernel 2.6.14, è
identica a \const{SO\_SNDBUF} ma consente ad un processo con i privilegi di
- amministratore (con la \textit{capability} \const{CAP\_NET\_ADMIN}) di
- impostare in valore maggiore del limite di
+ amministratore (per la precisione con la \textit{capability}
+ \const{CAP\_NET\_ADMIN}) di impostare in valore maggiore del limite di
\sysctlrelfile{net/core}{wmem\_max}.
% TODO verificare il timeout con un programma di test
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|c|c|c|l|p{5.cm}|}
+ \begin{tabular}[c]{|l|c|c|c|l|p{4.8cm}|}
\hline
\textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
\textbf{Descrizione}\\
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.70\textwidth}
+ \begin{minipage}[c]{0.90\textwidth}
\includestruct{listati/ip_mreqn.h}
\end{minipage}
\caption{La struttura \structd{ip\_mreqn} utilizzata per unirsi a un gruppo di
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.70\textwidth}
+ \begin{minipage}[c]{0.90\textwidth}
\includestruct{listati/ip_mreq_source.h}
\end{minipage}
\caption{La struttura \structd{ip\_mreqn} utilizzata per unirsi a un gruppo di
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.70\textwidth}
+ \begin{minipage}[c]{0.90\textwidth}
\includestruct{listati/ip_msfilter.h}
\end{minipage}
\caption{La struttura \structd{ip\_msfilter} utilizzata per il
\label{fig:ip_msfilter_struct}
\end{figure}
-L'argomento \param{optval} è una struttura \struct{ip\_msfilter} illustrata in
-fig.~\ref{fig:ip_msfilter_struct}, il campo \var{imsf\_multiaddr} è
-l'indirizzo del gruppo di \textit{multicast}, il campo \var{imsf\_interface}
-l'indirizzo dell'interfaccia locale, il campo \var{imsf\_mode} indica la
-modalità di filtraggio e con i campi \var{imsf\_numsrc} e \var{imsf\_slist}
+L'argomento \param{optval} deve essere una struttura di tipo
+\struct{ip\_msfilter} (illustrata in fig.~\ref{fig:ip_msfilter_struct}); il
+campo \var{imsf\_multiaddr} indica l'indirizzo del gruppo di
+\textit{multicast}, il campo \var{imsf\_interface} l'indirizzo
+dell'interfaccia locale, il campo \var{imsf\_mode} indica la modalità di
+filtraggio e con i campi \var{imsf\_numsrc} e \var{imsf\_slist}
rispettivamente la lunghezza della lista, e la lista stessa, degli indirizzi
-sorgente.
+sorgente.
Come ausilio all'uso di questa opzione sono disponibili le macro
\macro{MCAST\_INCLUDE} e \macro{MCAST\_EXCLUDE} che si possono usare per
\itindbeg{Path~MTU}
\item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
- di percorso del socket. L'opzione richiede per \param{optval} un intero che
- conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione
- introdotta con i kernel della serie 2.2.x, ed è specifica di Linux.
+ del socket. L'opzione richiede per \param{optval} un intero che conterrà il
+ valore della \textit{Path MTU} in byte. Questa è una opzione introdotta con
+ i kernel della serie 2.2.x, ed è specifica di Linux.
È tramite questa opzione che un programma può leggere, quando si è avuto un
errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si
la scoperta della \textit{Path MTU}, occorre che il socket sia stato
esplicitamente connesso con \func{connect}.
- Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
+ Ad esempio con i socket UDP si può ottenere una stima iniziale della
\textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}).
\end{basedescript}
-Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri
-file, la cui documentazione dovrebbe essere mantenuta nei sorgenti del kernel,
-nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
-questi però non è documentato:
+Oltre a questi, nella directory \texttt{/proc/sys/net/core} si trovano diversi
+altri file, la cui documentazione, come per gli altri, dovrebbe essere
+mantenuta nei sorgenti del kernel nel file
+\texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di questi
+però non è documentato:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
\item[\sysctlrelfiled{net/core}{dev\_weight}] blocco di lavoro (\textit{work
quantum}) dello \textit{scheduler} di processo dei pacchetti.
\item[\sysctlrelfiled{net/ipv4}{ipfrag\_high\_thresh}] indica il limite
massimo (espresso in numero di byte) sui pacchetti IP frammentati presenti
- in coda; quando questo valore viene raggiunta la coda viene ripulita fino al
+ in coda; quando questo valore viene raggiunto la coda viene ripulita fino al
valore \texttt{ipfrag\_low\_thresh}. Prende un valore intero.
-\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
- (specificata in byte) a cui viene riportata la coda dei pacchetti IP
- frammentati quando si raggiunge il valore massimo dato da
+\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] indica la dimensione
+ (specificata in byte) della soglia inferiore a cui viene riportata la coda
+ dei pacchetti IP frammentati quando si raggiunge il valore massimo dato da
\texttt{ipfrag\_high\_thresh}. Prende un valore intero.
\item[\sysctlrelfiled{net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende
\item il secondo valore, denominato \textit{default}, indica la dimensione
di default in byte del buffer di spedizione di un socket TCP. Questo
valore sovrascrive il default iniziale impostato per tutti i tipi di
- socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 byte,
- ridotto a 43689 per sistemi con poca memoria. Si può aumentare questo
- valore quando si desiderano dimensioni più ampie del buffer di
+ socket sul file \sysctlfile{net/core/wmem\_default}. Il default è 87380
+ byte, ridotto a 43689 per sistemi con poca memoria. Si può aumentare
+ questo valore quando si desiderano dimensioni più ampie del buffer di
trasmissione per i socket TCP, ma come per il precedente
\sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in corrispondenza
aumentino anche le dimensioni usate per la finestra TCP si deve abilitare
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.90\textwidth}
+ \begin{minipage}[c]{0.95\textwidth}
\includestruct{listati/sockaddr_storage.h}
\end{minipage}
\caption{La struttura generica degli indirizzi dei socket
\begin{figure}[!ht!b]
\footnotesize \centering
- \begin{minipage}[c]{0.8\textwidth}
+ \begin{minipage}[c]{0.85\textwidth}
\includestruct{listati/ustname.h}
\end{minipage}
\normalsize
\label{tab:sys_ut_type}
\end{table}
-La funzione \func{getutline} esegue la ricerca sulle voci che hanno
-\var{ut\_type} uguale a \const{LOGIN\_PROCESS} o \const{USER\_PROCESS},
-restituendo la prima che corrisponde al valore di \var{ut\_line}, che
-specifica il dispositivo di terminale che interessa, da indicare senza il
-\file{/dev/} iniziale. Lo stesso criterio di ricerca è usato da
-\func{pututline} per trovare uno spazio dove inserire la voce specificata;
+La funzione \func{getutline} esegue la ricerca sulle voci che hanno un
+\var{ut\_type} con valore uguale a \const{LOGIN\_PROCESS} o
+\const{USER\_PROCESS}, restituendo la prima che corrisponde al valore di
+\var{ut\_line}, che specifica il dispositivo di terminale che interessa, da
+indicare senza il \file{/dev/} iniziale. Lo stesso criterio di ricerca è usato
+da \func{pututline} per trovare uno spazio dove inserire la voce specificata;
qualora questo spazio non venga trovato la voce viene aggiunta in coda al
registro.
2.6.9.
A differenza di quanto avviene per \func{clock} i valori restituiti nei campi
-di una struttura \struct{tms} sono misurati in numero di
-\textit{clock tick} effettivi e non in multipli di \const{CLOCKS\_PER\_SEC},
-pertanto per ottenere il valore effettivo in secondi occorrerà dividere per il
-risultato di \code{sysconf(\_SC\_CLK\_TCK)}.
+di una struttura \struct{tms} sono misurati in numero di \textit{clock tick}
+effettivi e non in multipli di \const{CLOCKS\_PER\_SEC}, pertanto per ottenere
+il valore effettivo del tempo in secondi occorrerà dividere per il risultato
+di \code{sysconf(\_SC\_CLK\_TCK)}.
Lo stesso vale per il valore di ritorno della funzione, il cui significato fa
riferimento ad un tempo relativo ad un certo punto nel passato la cui
\subsection{Il client \textit{echo}: prima versione}
\label{sec:TCP_echo_client}
-Il codice della prima versione del client per il servizio \textit{echo},
-disponibile nel file \texttt{TCP\_echo\_first.c}, è riportato in
+Il codice della prima versione del client per il servizio \textit{echo} (file
+\texttt{TCP\_echo\_first.c}) dei sorgenti allegati alla guida) è riportato in
fig.~\ref{fig:TCP_echo_client_1}. Esso ricalca la struttura del precedente
client per il servizio \textit{daytime} (vedi
sez.~\ref{sec:TCP_daytime_client}), e la prima parte (\texttt{\small 10--27})