Correzioni varie al codice ed alle relative citazioni
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 18 Aug 2002 23:24:44 +0000 (23:24 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 18 Aug 2002 23:24:44 +0000 (23:24 +0000)
html/index.html
ipc.tex
signal.tex
sources/ForkTest.c
sources/FortuneServer.c
sources/HandSIGCHLD.c [new file with mode: 0644]
sources/Hand_CHLD.c [deleted file]
sources/Makefile
sources/wrappers.h

index a54c1d847abaab65d4a3efc1207138d53e5b5ae4..0c15b4efccaaf91ded9c8ca55ea7a7fad6dfd858 100644 (file)
                R. W. Stevens. 
            </p>
          </td>
                R. W. Stevens. 
            </p>
          </td>
+       </tr> 
+       <tr>
+         <td width="130" valign="top">
+           <b>
+             <font color="#0000aa">
+               Stato
+             </font>
+           </b>
+         </td>
+         <td bgcolor="lightblue"> 
+           <p>
+             <b>16 - agosto - 2002</b> <br> Sedici capitoli, 347 pagine.
+           </p>
+         </td>
        </tr>
        <tr>
          <td width="130" valign="top">
            <b>
              <font color="#0000aa">
        </tr>
        <tr>
          <td width="130" valign="top">
            <b>
              <font color="#0000aa">
-               News
+               Notizie
              </font>
            </b>
          </td>
          <td bgcolor="lightblue"> 
              </font>
            </b>
          </td>
          <td bgcolor="lightblue"> 
+           <p>
+             <b>7 - agosto - 2002</b> <br> Completata la prima stesura delle
+             sezioni relative all'I/O asincrono ed ai segnali real-time,
+             iniziata la stesura della sezione sul memory mapped I/O.
+           </p>
+           <p>
+             <b>22 - luglio - 2002</b> <br> Iniziata la stesura del capitolo
+             sull'I/O avanzato. Completata la sezione su pipe e fifo (in
+             versione preliminare) inziate le sezioni su I/O asincrono ed una
+             sezione aggiuntiva sui segnali real-time nel relativo capitolo.
+           </p>
            <p>
              <b>3 - luglio - 2002</b> <br> Prima versione del sito, con
              rilascio della prima versione di GaPiL in un HTML passabile.
            <p>
              <b>3 - luglio - 2002</b> <br> Prima versione del sito, con
              rilascio della prima versione di GaPiL in un HTML passabile.
              controllo dei parametri del sistema, gestione dei segnali. Sono
              da ricontrollare, ma di qualità decente, i capitoli dal
              tredicesimo al sedicesimo: reti e socket elementari (il
              controllo dei parametri del sistema, gestione dei segnali. Sono
              da ricontrollare, ma di qualità decente, i capitoli dal
              tredicesimo al sedicesimo: reti e socket elementari (il
-             sedicesimo capitolo è incopleto). Sono in corso di stesura, e
+             sedicesimo capitolo è incompleto). Sono in corso di stesura, e
              pertanto di qualità non classificabile (che può oscillare fra la
              bozza non rivista ed il semplice elenco degli argomenti) gli
              altri capitoli.
              pertanto di qualità non classificabile (che può oscillare fra la
              bozza non rivista ed il semplice elenco degli argomenti) gli
              altri capitoli.
-             <br>
-             <i> 321 pagine </i>
-           </p>
-           <p>
-             <b>22 - luglio - 2002</b> <br> Aggiornamento: iniziata la
-             stesura del capitolo sull'I/O avanzato. Completata la sezione su
-             pipe e fifo (in versione preliminare) inziate le sezioni su I/O
-             asincrono ed una sezione aggiuntiva sui segnali real-time nel
-             relativo capitolo.
-             <br>
-             <i> 333 pagine </i>
-           </p>
-           <p>
-             <b>22 - agosto - 2002</b> <br> Aggiornamento: completata la
-             prima stesura delle sezioni relative all'I/O asincrono ed ai
-             segnali real-time, iniziata la stesura della sezione sul memory
-             mapped I/O.
-             <br>
-             <i> 341 pagine </i>
            </p>
          </td>
        </tr>
            </p>
          </td>
        </tr>
-      </tbody>
+     </tbody>
     </table>
 <!-- CUT HERE -->
   </body>
     </table>
 <!-- CUT HERE -->
   </body>
diff --git a/ipc.tex b/ipc.tex
index 37d55d5b96358c9ef8bd420ddb1d3871f1b4c824..6ae11a30a8e157e0f0d181583034dcb47f7489c9 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -629,7 +629,38 @@ int main(int argc, char *argv[])
   \label{fig:ipc_fifo_server}
 \end{figure}
 
   \label{fig:ipc_fifo_server}
 \end{figure}
 
-
+Il server richiede (\texttt{\small 11}) che sia stata impostata una dimensione
+dell'insieme delle frasi non nulla, stampando, nel caso ciò non avvenga, un
+messaggio apposito ed uscendo. Poi (\texttt{\small 12}) effettua la chiamata
+alla funzione \code{FortuneParse} che legge dal file specificato in
+\var{fortunefilename} le prime \var{n} frasi e le memorizza nel vettore di
+puntatori \var{fortune}. Il codice della funzione non è riportato, in quanto
+non direttamente attinente allo scopo dell'esempio, lo si può trovare nel file
+\file{FortuneParse.c} allegato coi sorgenti degli esempi.
+
+Il passo successivo \texttt{\small 16--21}) è quello di creare, se non esiste
+già, la fifo nota sulla quale il server ascolterà le richieste, qualora si
+riscontri un errore il server uscirà (escludendo ovviamente il caso in cui la
+funzione \func{mkfifo} fallisce per la precedente esistenza della fifo. 
+
+Fatto questo si entra nel ciclo principale del programma \texttt{\small
+  22--36}), che viene eseguito indefinitamente (l'uscita del server deve
+essere effettuata tramite segnale), e che provvede a fornire le risposte ai
+client. Il server è progettato per accettare le richieste dai client che
+devono scrivere il nome della fifo sulla quale vogliono ricevere la risposta
+sulla fifo su cui il server è in ascolto.
+
+Il primo passo è aprire in lettura la fifo (\texttt{\small 23}), se nessun
+client ha effettuato una richiesta la fifo non ha capi aperti in scrittura, e
+pertanto il server si bloccherà. Una volta che un client ha aperto la fifo in
+scrittura il server si sbloccherà ed effetturà la lettura (\texttt{\small 28})
+della richiesta del client (nel caso limitata a 79 byte).
+
+Dopo di che verrà calcolato (\texttt{\small 30}) un numero casuale nel range
+delle frasi disponibili nella nostra lista, e verrà aperta (\texttt{\small
+  31}) la fifo sulla quale il client vuole ricevere la risposta, che sarà poi
+scritta (\texttt{\small 32}). Dopo di che \texttt{\small 34--35}) entrambe le
+fifo verranno chiuse.
 
 
 Benché il nostro sistema client-server funzioni, la sua struttura è piuttosto
 
 
 Benché il nostro sistema client-server funzioni, la sua struttura è piuttosto
index 860a1f522c9984d2975db0d26ea7b3c3f54944ae..801e6ff1a8dc325156d238e85b4d3e4d772144d4 100644 (file)
@@ -1379,11 +1379,13 @@ pu
 completare la procedura di terminazione in modo da evitare la formazione di
 zombie.
 
 completare la procedura di terminazione in modo da evitare la formazione di
 zombie.
 
-In \figref{fig:sig_sigchld_handl} è mostrato il codice della nostra
-implementazione del gestore; se aggiungiamo al codice di
-\file{ForkTest.c} l'installazione di questo gestore potremo verificare che
-ripetendo l'esempio visto in \secref{sec:proc_termination} che non si ha più
-la creazione di zombie.
+In \figref{fig:sig_sigchld_handl} è mostrato il codice contenente una
+implementazione generica di una routine di gestione per \macro{SIGCHLD}, (che
+si trova nei sorgenti allegati nel file \file{HandSIGCHLD.c}); se ripetiamo i
+test di \secref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione
+\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come
+gestore di \macro{SIGCHLD}) potremo verificare che non si ha più la creazione
+di zombie.
 
 %  è pertanto
 % naturale usare un esempio che ci permette di concludere la trattazione della
 
 %  è pertanto
 % naturale usare un esempio che ci permette di concludere la trattazione della
@@ -1402,7 +1404,7 @@ la creazione di zombie.
 #include <sys/wait.h>
 #include "macro.h"
 
 #include <sys/wait.h>
 #include "macro.h"
 
-void sigchld_hand(int sig)
+void HandSIGCHLD(int sig)
 {
     int errno_save;
     int status;
 {
     int errno_save;
     int status;
@@ -1425,18 +1427,19 @@ void sigchld_hand(int sig)
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
-  \caption{Un gestore per il segnale \texttt{SIGCHLD}.} 
+  \caption{Codice di una funzione generica di gestione per il segnale
+    \texttt{SIGCHLD}.}  
   \label{fig:sig_sigchld_handl}
 \end{figure}
 
 Il codice del gestore è di lettura immediata; come buona norma di
 programmazione (si ricordi quanto accennato \secref{sec:sys_errno}) si
 comincia (\texttt{\small 12-13}) con il salvare lo stato corrente di
   \label{fig:sig_sigchld_handl}
 \end{figure}
 
 Il codice del gestore è di lettura immediata; come buona norma di
 programmazione (si ricordi quanto accennato \secref{sec:sys_errno}) si
 comincia (\texttt{\small 12-13}) con il salvare lo stato corrente di
-\var{errno}, in modo da poterlo ripristinare prima del ritorno del
-gestore (\texttt{\small 22-23}). In questo modo si preserva il valore
-della variabile visto dal corso di esecuzione principale del processo, che
-sarebbe altrimenti sarebbe sovrascritto dal valore restituito nella successiva
-chiamata di \func{wait}.
+\var{errno}, in modo da poterlo ripristinare prima del ritorno del gestore
+(\texttt{\small 22-23}). In questo modo si preserva il valore della variabile
+visto dal corso di esecuzione principale del processo, che sarebbe altrimenti
+sarebbe sovrascritto dal valore restituito nella successiva chiamata di
+\func{wait}.
 
 Il compito principale del gestore è quello di ricevere lo stato di
 terminazione del processo, cosa che viene eseguita nel ciclo in
 
 Il compito principale del gestore è quello di ricevere lo stato di
 terminazione del processo, cosa che viene eseguita nel ciclo in
index 03ddf75eadfe4c37ab7536cbe7d4e0401a0fcc1b..a4f0296848ec65564e30bad20005fa5337c5d8df 100644 (file)
@@ -26,7 +26,7 @@
  *
  * Usage: forktest -h give all info's
  *
  *
  * Usage: forktest -h give all info's
  *
- * $Id: ForkTest.c,v 1.6 2001/09/21 17:10:51 piccardi Exp $
+ * $Id: ForkTest.c,v 1.7 2002/08/18 23:24:44 piccardi Exp $
  *
  ****************************************************************/
 /* 
  *
  ****************************************************************/
 /* 
@@ -38,6 +38,9 @@
 #include <stdio.h>      /* standard I/O library */
 #include <string.h>      /* string functions */
 
 #include <stdio.h>      /* standard I/O library */
 #include <string.h>      /* string functions */
 
+#include "wrappers.h"
+#include "macros.h"
+
 /* Help printing routine */
 void usage(void);
 
 /* Help printing routine */
 void usage(void);
 
@@ -56,7 +59,7 @@ int main(int argc, char *argv[])
      * Use getopt function
      */
     opterr = 0;         /* don't want writing to stderr */
      * Use getopt function
      */
     opterr = 0;         /* don't want writing to stderr */
-    while ( (i = getopt(argc, argv, "hp:c:e:")) != -1) {
+    while ( (i = getopt(argc, argv, "hsp:c:e:")) != -1) {
        switch (i) {
        /* 
         * Handling options 
        switch (i) {
        /* 
         * Handling options 
@@ -75,6 +78,9 @@ int main(int argc, char *argv[])
        case 'e':   /* take wait before parent exit */
            wait_end = strtol(optarg, NULL, 10);      /* convert input */
            break;
        case 'e':   /* take wait before parent exit */
            wait_end = strtol(optarg, NULL, 10);      /* convert input */
            break;
+       case 's':
+           Signal(SIGCHLD, HandSIGCHLD);
+           break;
        case '?':   /* unrecognized options */
            printf("Unrecognized options -%c\n",optopt);
            usage();
        case '?':   /* unrecognized options */
            printf("Unrecognized options -%c\n",optopt);
            usage();
@@ -125,6 +131,7 @@ void usage(void) {
     printf("Usage:\n");
     printf("  forktest [-h] [-p sec] [-c sec] [-e sec] child to fork \n");
     printf("  -h          print this help\n");
     printf("Usage:\n");
     printf("  forktest [-h] [-p sec] [-c sec] [-e sec] child to fork \n");
     printf("  -h          print this help\n");
+    printf("  -s          install signal handler\n");
     printf("  -p sec       wait sec seconds before next fork\n");
     printf("  -c sec       wait sec seconds before child termination\n");
     printf("  -e sec       wait sec seconds before parent return\n");
     printf("  -p sec       wait sec seconds before next fork\n");
     printf("  -c sec       wait sec seconds before child termination\n");
     printf("  -e sec       wait sec seconds before parent return\n");
index e767c1c849e8252650c5e91f0fce1c73227f05f4..5f10062960b8dfddfa5daee88c06add0f5fa7d7d 100644 (file)
@@ -26,7 +26,7 @@
  *
  * Usage: fortuned -h give all info
  *
  *
  * Usage: fortuned -h give all info
  *
- * $Id: FortuneServer.c,v 1.2 2002/08/18 14:38:04 piccardi Exp $
+ * $Id: FortuneServer.c,v 1.3 2002/08/18 23:24:44 piccardi Exp $
  *
  ****************************************************************/
 /* 
  *
  ****************************************************************/
 /* 
 void usage(void);
 int FortuneParse(char *file, char **fortune, int n);
 
 void usage(void);
 int FortuneParse(char *file, char **fortune, int n);
 
+/* name of well known fifo */
+char *fifoname = "/tmp/fortune.fifo";
 int main(int argc, char *argv[])
 {
 /* Variables definition */
     int i, n = 0;
     char *fortunefilename = "/usr/share/games/fortunes/kids";
 int main(int argc, char *argv[])
 {
 /* Variables definition */
     int i, n = 0;
     char *fortunefilename = "/usr/share/games/fortunes/kids";
-    char *fifoname = "/tmp/fortune.fifo";
     char **fortune;
     char line[80];
     int fifo_server, fifo_client;
     char **fortune;
     char line[80];
     int fifo_server, fifo_client;
@@ -93,6 +94,9 @@ int main(int argc, char *argv[])
      *               Main code beginning
      * 
      * ***********************************************************/
      *               Main code beginning
      * 
      * ***********************************************************/
+    Signal(SIGTERM, HandSIGTERM);
+    Signal(SIGINT, HandSIGTERM);
+    Signal(SIGQUIT, HandSIGTERM);
     if (n==0) usage();          /* if no pool depth exit printing usage info */
     i = FortuneParse(fortunefilename, fortune, n);          /* parse phrases */
     for (n=0; n<i; n++) debug("%s\n\n", fortune[n]);
     if (n==0) usage();          /* if no pool depth exit printing usage info */
     i = FortuneParse(fortunefilename, fortune, n);          /* parse phrases */
     for (n=0; n<i; n++) debug("%s\n\n", fortune[n]);
@@ -136,3 +140,10 @@ void usage(void) {
     printf("  -n XXX        set pool depth\n");
     exit(1);
 }
     printf("  -n XXX        set pool depth\n");
     exit(1);
 }
+/*
+ * Signal Handler to manage termination
+ */
+void HandSIGTERM(int signo) {
+    unlink(fifoname);
+    exit(0);
+}
diff --git a/sources/HandSIGCHLD.c b/sources/HandSIGCHLD.c
new file mode 100644 (file)
index 0000000..04f9753
--- /dev/null
@@ -0,0 +1,27 @@
+#include <errno.h>       /* error simbol definitions */
+#include <signal.h>      /* signal handling declarations */
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "macros.h"
+
+void HandSIGCHLD(int sig)
+{
+    int errno_save;
+    int status;
+    pid_t pid;
+    /* save errno current value */
+    errno_save = errno;
+    /* loop until no */
+    do {
+       errno = 0;
+       pid = waitpid(WAIT_ANY, &status, WNOHANG);
+       if (pid > 0) {
+           debug("child %d terminated with status %x\n", pid, status);
+       }
+    } while ((pid > 0) && (errno == EINTR));
+    /* restore errno value*/
+    errno = errno_save;
+    /* return */
+    return;
+}
diff --git a/sources/Hand_CHLD.c b/sources/Hand_CHLD.c
deleted file mode 100644 (file)
index c5113ee..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <errno.h>       /* error simbol definitions */
-#include <signal.h>      /* signal handling declarations */
-#include <sys/types.h>
-#include <sys/wait.h>
-#include "macro.h"
-
-void Hand_CHLD(int sig)
-{
-    int errno_save;
-    int status;
-    pid_t pid;
-    /* save errno current value */
-    errno_save = errno;
-    /* loop until no */
-    do {
-       errno = 0;
-       pid = waitpid(WAIT_ANY, &status, WNOHANG);
-       if (pid > 0) {
-           debug("child %d terminated with status %x\n", pid, status);
-       }
-    } while ((pid > 0) && (errno == EINTR));
-    /* restore errno value*/
-    errno = errno_save;
-    /* return */
-    return;
-}
index d572d49ba65142a6b1fe5e73ea55833c5bb97931..cd22c1406c2b16a9f8bc3f9e922741972650bf9c 100644 (file)
@@ -37,7 +37,7 @@ testfopen: test_fopen.c
 testren: TestRen.c
        $(CC) $(CFLAGS) $^ -o $@
 
 testren: TestRen.c
        $(CC) $(CFLAGS) $^ -o $@
 
-forktest: ForkTest.c
+forktest: ForkTest.c HandSIGCHLD.c
        $(CC) $(CFLAGS) $^ -o $@
 
 errcode: ErrCode.c 
        $(CC) $(CFLAGS) $^ -o $@
 
 errcode: ErrCode.c 
index 7120c4348a5fef08fc27671b4c592ffa30773ccd..ee8fa89da88d4d85489ae1bb209807408907eeab 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Author: S. Piccardi
  *
  *
  * Author: S. Piccardi
  *
- * $Id: wrappers.h,v 1.2 2001/06/10 11:47:17 piccardi Exp $
+ * $Id: wrappers.h,v 1.3 2002/08/18 23:24:44 piccardi Exp $
  *
  ***************************************************************/
 #include <sys/sem.h>     /* IPC semaphore declarations */
  *
  ***************************************************************/
 #include <sys/sem.h>     /* IPC semaphore declarations */
@@ -237,3 +237,4 @@ inline SigFunc * Signal(int signo, SigFunc *func)
 ssize_t SockRead(int fd, void *buf, size_t count);
 ssize_t SockWrite(int fd, const void *buf, size_t count);
 
 ssize_t SockRead(int fd, void *buf, size_t count);
 ssize_t SockWrite(int fd, const void *buf, size_t count);
 
+void HandSIGCHLD(int sig);