From efe29e351db06b5f8cc7dd8280d00eee483157a7 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 29 Jul 2003 22:41:36 +0000 Subject: [PATCH 1/1] Ancora correzioni sulle varie versioni di server. --- README | 19 +------- elemtcp.tex | 49 +++++++++++---------- listati/{TCP_echod.c => TCP_echod_second.c} | 0 sources/TCP_echod.c | 4 +- 4 files changed, 29 insertions(+), 43 deletions(-) rename listati/{TCP_echod.c => TCP_echod_second.c} (100%) diff --git a/README b/README index e9cca70..329c28e 100644 --- a/README +++ b/README @@ -17,24 +17,9 @@ stack_size = 500 Fatto questo con make si puo` ottenere tutto. -A seconda dell'ultima cosa che ho fatto sul CVS si puo` trovare una -versione di gapil.tex adattata per generare HTML leggibile, piuttosto -che gli ordinari PS e PDF. +Di norma make genera le figure (in eps e pdf da dia). -Nel primo caso sono commentate le due righe: -%\usepackage{mdwlist} % scommentare per la stampa (PS e PDF) -%\usepackage{boxedminipage} % scommentare per la stampa (PS e PDF) -mentre e` scommentata la riga: -\include{compatib} % commentare per la stampa PS e PDF - -Di norma make genera le figure (in eps e pdf da dia), purche' si sia -in X (dia non puo` essere lanciato altrimenti per convertire i .dia in -.eps), poi passa alla generazione di HTML con latex2html. - - - -Se si vuole generare PDF o PS occorrono (verificato che gapil.tex e` -nel formato corretto) i comandi: +Se si vuole generare PDF o PS occorrono i comandi: PS: latex gapil diff --git a/elemtcp.tex b/elemtcp.tex index b366d5f..b1748ca 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -1821,8 +1821,8 @@ standard error. La gestione del servizio \textit{echo} viene effettuata interamente nella funzione \code{ServEcho}, il cui codice è mostrato in -\figref{fig:TCP_ServEcho}, e la comunicazione viene gestita all'interno di un -ciclo (\texttt{\small 6--13}). I dati inviati dal client vengono letti +\figref{fig:TCP_ServEcho_first}, e la comunicazione viene gestita all'interno +di un ciclo (\texttt{\small 6--13}). I dati inviati dal client vengono letti (\texttt{\small 6}) dal socket con una semplice \func{read}, di cui non si controlla lo stato di uscita, assumendo che ritorni solo in presenza di dati in arrivo. La riscrittura (\texttt{\small 7}) viene invece gestita dalla @@ -1839,7 +1839,7 @@ dati di cui \normalsize \caption{Codice della prima versione della funzione \code{ServEcho} per la gestione del servizio \textit{echo}.} - \label{fig:TCP_ServEcho} + \label{fig:TCP_ServEcho_first} \end{figure} In caso di errore di scrittura (si ricordi che \func{FullWrite} restituisce un @@ -2009,13 +2009,13 @@ seguente codice: \includecodesnip{listati/sigchildhand.c} \noindent all'esempio illustrato in \figref{fig:TCP_echo_server_first_code}. -In questo modo però si introduce un altro problema, si ricordi infatti che, +In questo modo però si introduce un altro problema. Si ricordi infatti che, come spiegato in \secref{sec:sig_gen_beha}, quando un programma si trova in stato di \texttt{sleep} durante l'esecuzione di una system call, questa viene interrotta alla ricezione di un segnale. Per questo motivo, alla fine dell'esecuzione del gestore del segnale, se questo ritorna, il programma -riprenderà l'esecuzione ritornando dalla system call con un errore di -\errcode{EINTR}. +riprenderà l'esecuzione ritornando dalla system call interrotta con un errore +di \errcode{EINTR}. Vediamo allora cosa comporta tutto questo nel nostro caso: quando si chiude il client, il processo figlio che gestisce la connessione terminerà, ed il padre, @@ -2031,7 +2031,6 @@ terminando a sua volta con un messaggio del tipo: accept error: Interrupted system call \end{verbatim}%# - Come accennato in \secref{sec:sig_gen_beha} le conseguenze di questo comportamento delle system call possono essere superate in due modi diversi, il più semplice è quello di modificare il codice di \func{Signal} per @@ -2069,18 +2068,19 @@ della portabilit riavvio automatico delle system call, fornita da \const{SA\_RESTART}, è opzionale, per cui non è detto che essa sia disponibile su qualunque sistema. Inoltre in certi casi,\footnote{Stevens in \cite{UNP1} accenna che la maggior - parte degli Unix derivati da BSD non fanno ripartire \func{select}, ed - alcuni non fanno ripartire neanche \func{accept} e \func{recvfrom}; nel caso - di Linux questa è disponibile.} anche quando questa è presente, non è detto -possa essere usata con \func{accept}. La portabilità però viene al costo di -una riscrittura parziale del server, secondo quanto mostrato in + parte degli Unix derivati da BSD non fanno ripartire \func{select}; altri + non riavviano neanche \func{accept} e \func{recvfrom}, cosa che invece nel + caso di Linux viene sempre fatta.} anche quando questa è presente, non è +detto possa essere usata con \func{accept}. La portabilità però viene al costo +di una riscrittura parziale del server, secondo quanto mostrato in \figref{fig:TCP_echo_server_code}, dove si è riportata la sezione di codice -modificata per la seconda versione del programma. +modificata per la seconda versione del programma, che si trova nel file +\file{}. \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15.6cm} - \includecodesample{listati/TCP_echod.c} + \includecodesample{listati/TCP_echod_second.c} \end{minipage} \normalsize \caption{La sezione nel codice della seconda versione del server @@ -2095,16 +2095,17 @@ padre in stato di sleep.\footnote{si noti infatti che le altre \textit{slow system call} o sono chiamate prima di entrare nel ciclo principale, quando ancora non esistono processi figli, o sono chiamate dai figli stessi.} Per questo l'unica modifica sostanziale nella nuova versione del server, rispetto -alla versione precedente vista in \figref{fig:TCP_ServEcho}, è nella sezione -(\texttt{\small 9--14}) in cui si effettua la chiamata di \func{accept}. -Quest'ultima viene effettuata (\texttt{\small 9--10}) all'interno di un ciclo -di \code{while}\footnote{la sintassi del C relativa a questo ciclo può non - essere del tutto chiara. In questo caso infatti si è usato un ciclo vuoto - che non esegue nessuna istruzione, in questo modo quello che viene ripetuto - con il ciclo è soltanto il codice che esprime la condizione all'interno del - \code{while}.} che la ripete indefinitamente qualora in caso di errore il -valore di \var{errno} sia \errcode{EINTR}. Negli altri casi si esce in caso di -errore effettivo (\texttt{\small 11--14}), altrimenti il programma prosegue. +alla versione precedente vista in \figref{fig:TCP_ServEcho_first}, è nella +sezione (\texttt{\small 9--14}) in cui si effettua la chiamata di +\func{accept}. Quest'ultima viene effettuata (\texttt{\small 9--10}) +all'interno di un ciclo di \code{while}\footnote{la sintassi del C relativa a + questo ciclo può non essere del tutto chiara. In questo caso infatti si è + usato un ciclo vuoto che non esegue nessuna istruzione, in questo modo + quello che viene ripetuto con il ciclo è soltanto il codice che esprime la + condizione all'interno del \code{while}.} che la ripete indefinitamente +qualora in caso di errore il valore di \var{errno} sia \errcode{EINTR}. Negli +altri casi si esce in caso di errore effettivo (\texttt{\small 11--14}), +altrimenti il programma prosegue. Si noti che in questa nuova versione si è aggiunta una ulteriore sezione (\texttt{\small 15--28}) per il debugging, che stampa l'indirizzo da cui si è diff --git a/listati/TCP_echod.c b/listati/TCP_echod_second.c similarity index 100% rename from listati/TCP_echod.c rename to listati/TCP_echod_second.c diff --git a/sources/TCP_echod.c b/sources/TCP_echod.c index 83d0c73..25a4571 100644 --- a/sources/TCP_echod.c +++ b/sources/TCP_echod.c @@ -26,7 +26,7 @@ * * Usage: echod -h give all info * - * $Id: TCP_echod.c,v 1.9 2003/07/27 23:41:04 piccardi Exp $ + * $Id: TCP_echod.c,v 1.10 2003/07/29 22:41:36 piccardi Exp $ * ****************************************************************/ /* @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) * * ***********************************************************/ /* install SIGCHLD handler */ - Signal(SIGCHLD, HandSigCHLD); /* establish handler */ + SignalRestart(SIGCHLD, HandSigCHLD); /* establish handler */ /* create socket */ if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation error"); -- 2.30.2