From: Simone Piccardi Date: Sun, 3 Aug 2003 22:32:23 +0000 (+0000) Subject: Altre correzioni X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=37951943f527f822911d0c45439cf6f114347651 Altre correzioni --- diff --git a/elemtcp.tex b/elemtcp.tex index da7219c..a49c48c 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -1843,7 +1843,7 @@ dati di cui \end{figure} In caso di errore di scrittura (si ricordi che \func{FullWrite} restituisce un -vamore nullo in caso di successo) si provvede (\texttt{\small 8--10}) a +valore nullo in caso di successo) si provvede (\texttt{\small 8--10}) a stampare il relativo messaggio con \func{PrintErr}. Quando il client chiude la connessione il ricevimento del FIN fa ritornare la \func{read} con un numero di byte letti pari a zero, il che causa l'uscita dal ciclo e il ritorno @@ -2096,9 +2096,10 @@ specificato in secondi fra il ritorno della funzione \func{listen} e la chiamata di \func{accept}, specificabile con l'opzione \texttt{-w}, che permette di impostare la variabile \var{waiting}. Infine si è introdotta una opzione \texttt{-d} per abilitare il debugging che imposta ad un valore non -nullo la variabile \var{debugging}. Al solito la gestione di tutte queste -opzioni si è omessa da \figref{fig:TCP_echo_server_code_second}, ma può essere -visionata nel sorgente del programma. +nullo la variabile \var{debugging}. Al solito si è omessa da +\figref{fig:TCP_echo_server_code_second} la sezione di codice relativa alla +gestione di tutte queste opzioni, che può essere trovata nel sorgente del +programma. \begin{figure}[!htb] \footnotesize \centering @@ -2121,23 +2122,26 @@ funzione \func{Signal} (\texttt{\small 10}) o con \texttt{SignalRestart} Tutta la sezione seguente, che crea il socket, cede i privilegi di amministratore ed eventualmente lancia il programma come demone, è rimasta -invariata e pertanto non la si è riportata in -\figref{fig:TCP_echo_server_code_second}; l'unica modifica effettuata è stata -quella di aver introdotto (\texttt{\small 21}) l'eventuale pausa specificata -con l'opzione \code{-w Nsec}, che inizializza la variabile \var{waiting} al -numero di secondi da aspettare, subito dopo la chiamata (\texttt{\small - 17--20}) alla funzione \func{listen}. - -Si è potuto far questo perché l'unica chiamata critica che può essere -interrotta da \const{SIGCHLD} nel server è quella ad \func{accept}, che è -l'unica funzione che può mettere il processo 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 ciclo principale (\texttt{\small - 23--42}) rispetto precedente versione di \figref{fig:TCP_ServEcho_first}, è +invariata e pertanto è stata omessa in +\figref{fig:TCP_echo_server_code_second}; l'unica modifica effettuata prima +dell'entrata nel ciclo principale è stata quella di aver introdotto, subito +dopo la chiamata (\texttt{\small 17--20}) alla funzione \func{listen}, una +eventuale pausa con una condizione (\texttt{\small 21}) sulla variabile +\var{waiting}, che viene inizializzata, con l'opzione \code{-w Nsec}, al +numero di secondi da aspettare (il valore preimpostato è nullo). + +Si è potuto lasciare inalterata tutta la sezione di creazione del socket +perché nel server l'unica chiamata ad una system call critica, che può essere +interrotta dall'arrivo di \const{SIGCHLD}, è quella ad \func{accept}, che è +l'unica funzione che può mettere il processo padre in stato di sleep nel +periodo in cui un figlio può terminare; si noti infatti come le altre +\textit{slow system call}\footnote{si ricordi la distinzione fatta in + \secref{sec:sig_gen_beha}.} o sono chiamate prima di entrare nel ciclo +principale, quando ancora non esistono processi figli, o sono chiamate dai +figli stessi e non risentono di \const{SIGCHLD}. + +Per questo l'unica modifica sostanziale nel ciclo principale (\texttt{\small + 23--42}), rispetto precedente versione di \figref{fig:TCP_ServEcho_first}, è nella sezione (\texttt{\small 26--30}) in cui si effettua la chiamata di \func{accept}. Quest'ultima viene effettuata (\texttt{\small 26--27}) all'interno di un ciclo di \code{while}\footnote{la sintassi del C relativa a @@ -2222,14 +2226,18 @@ ritorno di \func{accept}, sono \errcode{ENETDOWN}, \errcode{EPROTO}, \errcode{EHOSTUNREACH}, \errcode{EOPNOTSUPP} e \errcode{ENETUNREACH}. Si tenga presente che questo tipo di terminazione non è riproducibile -terminando il client prima della chiamata ad \func{accept}; in tal caso -infatti il socket associato alla connessione viene semplicemente chiuso, +terminando il client prima della chiamata ad \func{accept}, come si potrebbe +fare usando l'opzione \texttt{-w} per introdurre una pausa dopo il lancio del +demone, in modo da poter avere il tempo per lanciare e terminare una +connessione usando il programma client. In tal caso infatti, alla terminazione +del client, il socket associato alla connessione viene semplicemente chiuso, attraverso la sequenza vista in \secref{sec:TCP_conn_term}, per cui la \func{accept} ritornerà senza errori, e si avrà semplicemente un end-of-file -al primo accesso al socket. Nel caso di Linux inoltre anche l'invio da parte -del client di un segmento di RST non provoca nessun errore al ritorno di -\funcd{accept} quanto un errore di \errcode{ECONNRESET} al primo tentativo di -accesso al socket. +al primo accesso al socket. Nel caso di Linux inoltre, anche qualora si +modifichi il client per fargli gestire l'invio di un segmento di RST alla +chiusura dal socket (come suggerito da Stevens in \cite{UNP1}), non si ha +nessun errore al ritorno di \funcd{accept} quanto un errore di +\errcode{ECONNRESET} al primo tentativo di accesso al socket. @@ -2248,15 +2256,6 @@ della chiusura del socket. - -Nella funzione si è anche inserita (\texttt{\small 16--24}) la possibilità di -inviare dei messaggi di debug (abilitabile con l'uso dell'opzione \texttt{-d} -che imposta opportunamente \var{debugging}), gestendo entrambi i casi in cui -la stampa deve essere effettuata tramite \func{syslog} (\texttt{\small 20}) o -direttamente sullo standard output (\texttt{\small 22}). - - - %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil"