From: Simone Piccardi Date: Tue, 29 Jul 2003 22:41:36 +0000 (+0000) Subject: Ancora correzioni sulle varie versioni di server. X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=efe29e351db06b5f8cc7dd8280d00eee483157a7;p=gapil.git Ancora correzioni sulle varie versioni di server. --- 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.c deleted file mode 100644 index d5c8bba..0000000 --- a/listati/TCP_echod.c +++ /dev/null @@ -1,28 +0,0 @@ -int main(int argc, char *argv[]) -{ - ... - ... - if (waiting) sleep(waiting); - /* handle echo to client */ - while (1) { - /* accept connection */ - while (((conn_fd = accept(list_fd, (struct sockaddr *)&cli_add, &len)) - < 0) && (errno == EINTR)); - if ( conn_fd < 0) { - PrintErr("accept error"); - exit(1); - } - if (debugging) { - inet_ntop(AF_INET, &cli_add.sin_addr, ipaddr, sizeof(ipaddr)); - snprintf(debug, MAXLINE, "Accepted connection form %s\n", ipaddr); - if (demonize) { - syslog(LOG_DEBUG, debug); - } else { - printf("%s", debug); - } - } - /* fork to handle connection */ - ... - ... - } -} diff --git a/listati/TCP_echod_second.c b/listati/TCP_echod_second.c new file mode 100644 index 0000000..d5c8bba --- /dev/null +++ b/listati/TCP_echod_second.c @@ -0,0 +1,28 @@ +int main(int argc, char *argv[]) +{ + ... + ... + if (waiting) sleep(waiting); + /* handle echo to client */ + while (1) { + /* accept connection */ + while (((conn_fd = accept(list_fd, (struct sockaddr *)&cli_add, &len)) + < 0) && (errno == EINTR)); + if ( conn_fd < 0) { + PrintErr("accept error"); + exit(1); + } + if (debugging) { + inet_ntop(AF_INET, &cli_add.sin_addr, ipaddr, sizeof(ipaddr)); + snprintf(debug, MAXLINE, "Accepted connection form %s\n", ipaddr); + if (demonize) { + syslog(LOG_DEBUG, debug); + } else { + printf("%s", debug); + } + } + /* fork to handle connection */ + ... + ... + } +} 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");