Ancora correzioni sulle varie versioni di server.
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 29 Jul 2003 22:41:36 +0000 (22:41 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 29 Jul 2003 22:41:36 +0000 (22:41 +0000)
README
elemtcp.tex
listati/TCP_echod.c [deleted file]
listati/TCP_echod_second.c [new file with mode: 0644]
sources/TCP_echod.c

diff --git a/README b/README
index e9cca70..329c28e 100644 (file)
--- 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
index b366d5f..b1748ca 100644 (file)
@@ -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 (file)
index d5c8bba..0000000
+++ /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 (file)
index 0000000..d5c8bba
--- /dev/null
@@ -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 */
+        ...
+       ...
+    }
+}
index 83d0c73..25a4571 100644 (file)
@@ -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");