\subsection{Il server: prima versione}
\label{sec:TCPsimp_server_main}
-La prima versione del server, contenuta nel file \file{TCP\_echod.c}, è
-riportata in \figref{fig:TCP_echo_server_code}. Come abbiamo fatto per il
-client anche il server è stato diviso in un corpo principale, costituito dalla
-funzione \code{main}, che è molto simile a quello visto nel precedente esempio
-per il server del servizio \textit{daytime} di
+La prima versione del server, contenuta nel file \file{TCP\_echod_first.c}, è
+riportata in \figref{fig:TCP_echo_server_first_code}. Come abbiamo fatto per
+il client anche il server è stato diviso in un corpo principale, costituito
+dalla funzione \code{main}, che è molto simile a quello visto nel precedente
+esempio per il server del servizio \textit{daytime} di
\secref{sec:TCP_daytime_cunc_server}, e da una funzione ausiliaria
\code{ServEcho} che si cura della gestione del servizio.
\begin{figure}[!htbp]
\footnotesize \centering
\begin{minipage}[c]{15.6cm}
- \includecodesample{listati/TCP_echod.c}
+ \includecodesample{listati/TCP_echod_first.c}
\end{minipage}
\normalsize
\caption{Codice del corpo principale della prima versione del server
per il servizio \textit{echo}.}
- \label{fig:TCP_echo_server_code}
+ \label{fig:TCP_echo_server_first_code}
\end{figure}
In questo caso però, rispetto a quanto visto nell'esempio di
Basterà allora aggiungere il seguente codice:
\includecodesnip{listati/sigchildhand.c}
\noindent
-all'esempio illustrato in \figref{fig:TCP_echo_server_code}.
+all'esempio illustrato in \figref{fig:TCP_echo_server_first_code}.
In questo modo però si introduce un altro problema, il fatto che, come
spiegato in \secref{sec:sig_gen_beha}, quando un programma si trova in stato
arriva durante l'esecuzione del programma in risposta ad una connessione) con
un errore di \errcode{EINTR}, terminando a sua volta con un errore del tipo:
\begin{verbatim}
-
-\end{verbatim}
-
+[root@gont sources]# ./echod -i
+accept error: Interrupted system call
+\end{verbatim}%#
Come accennato in \secref{sec:sig_gen_beha} questo ci mette di fronte a due
\end{minipage}
\normalsize
\caption{La funzione \funcd{SignalRestart}, che installa un gestore di
- segnali in semantica BSD.}
+ segnali in semantica BSD per il riavvio delle system call interrotte.}
\label{fig:sig_SignalRestart_code}
\end{figure}
Come si può notare questa funzione è identica a \func{Signal}, solo che in
questo caso invece di inizializzare a zero il campo \var{sa\_flags} di
-\struct{sigaction} lo si inizializza (\texttt{\small 5}) al valore
-\const{SA\_RESTART}.
+\struct{sigaction}, lo si inizializza (\texttt{\small 5}) al valore
+\const{SA\_RESTART}. Usando questa funzione al posto di \func{Signal} nel
+server non è necessaria nessuna altra modifica: le system call interrotte
+saranno automaticamente riavviate, e l'errore \errcode{EINTR} non si
+manifesterà più.
-Usando questa funzione al posto di \func{Signal} nel server non è necessaria
-nessuna altra modifica, le system call interrotte saranno automaticamente
-riavviate, e l'errore \errcode{EINTR} non si manifesterà più.
+La seconda soluzione è più invasiva e richiede di controllare tutte le volte
+l'errore restituito dalle varie system call, ripetendo la chiamata qualora
+questo corrisponda ad \errcode{EINTR}, questo comporta una riscrittura
+parziale del server secondo quanto mostrato in
+\begin{figure}[!htbp]
+ \footnotesize \centering
+ \begin{minipage}[c]{15.6cm}
+ \includecodesample{listati/TCP_echod.c}
+ \end{minipage}
+ \normalsize
+ \caption{Codice del corpo principale della seconda versione del server
+ per il servizio \textit{echo}.}
+ \label{fig:TCP_echo_server_code}
+\end{figure}
\section{I vari scenari critici}