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 e9cca70686f571bbbc1b7475e96a70a394c59c1d..329c28e1059e32f8f67eb52e6730b3d14abc0fca 100644 (file)
--- a/README
+++ b/README
@@ -17,24 +17,9 @@ stack_size = 500
 
 Fatto questo con make si puo` ottenere tutto. 
 
 
 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
 
 PS:
 latex gapil
index b366d5f12b0d08e5a46fb16684486dcfb315c752..b1748ca71db8e56d4c318161736ebb62d236b8c7 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
 
 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
 (\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}.}
   \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
 \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}.
 
 \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
 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,
 
 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}%#
 
 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
 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
 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
 \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}
 
 \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
   \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
     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 è
 
 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 83d0c738f294743dd66478dfcb9b17d0e0bc7548..25a457187e4d000071e59623967d67938163a216 100644 (file)
@@ -26,7 +26,7 @@
  *
  * Usage: echod -h give all info
  *
  *
  * 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 */
      * 
      * ***********************************************************/
     /* 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");
     /* create socket */
     if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("Socket creation error");