X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=simpltcp.tex;h=38df63e18b241f3dc0f99d3cabba23a58346f41f;hb=f226d67a85c76d482da1f06f2c34c6231dfb5312;hp=61013877ea457e43633ae7f8401e4af449b6582f;hpb=6e3e4f4d9d97e5643f85a13904412f4f4e46631f;p=gapil.git diff --git a/simpltcp.tex b/simpltcp.tex index 6101387..38df63e 100644 --- a/simpltcp.tex +++ b/simpltcp.tex @@ -48,7 +48,7 @@ corpo principale, costituito dalla funzione \texttt{main}. Questa si incarica di creare il socket, metterlo in ascolto di connessioni in arrivo e creare un processo figlio a cui delegare la gestione di ciascuna connessione. Questa parte, riportata in \nfig, è analoga a quella vista nel precedente esempio -esaminato in \secref{sec:TCPelem_serv_code}. +esaminato in \secref{sec:TCPel_cunc_serv}. \begin{figure}[!htb] \footnotesize @@ -114,7 +114,7 @@ int main(int argc, char *argv[]) La struttura di questa prima versione del server è sostanzialmente identica a quella dell'esempio citato, ed ad esso si applicano le considerazioni fatte in \secref{sec:TCPel_cunc_daytime}. Le uniche differenze rispetto all'esempio in -\figref{fig:TCPelem_serv_code} sono che in questo caso per il socket in +\figref{fig:TCPel_serv_code} sono che in questo caso per il socket in ascolto viene usata la porta 7 e tutta la gestione della comunicazione è delegata alla funzione \texttt{ServEcho}. % Per ogni connessione viene creato un @@ -147,7 +147,7 @@ void ServEcho(int sockfd) { \end{lstlisting} \caption{Codice della prima versione della funzione \texttt{ServEcho} per la gestione del servizio \texttt{echo}.} - \label{fig:TCPsimpl_sockecho_code} + \label{fig:TCPsimpl_server_elem_sub} \end{figure} Quando il client chiude la connessione il ricevimento del FIN fa ritornare la @@ -157,7 +157,7 @@ del processo figlio. \subsection{Il client} -\label{sec:TCPsimp_server_main} +\label{sec:TCPsimp_client_main} Il codice del client è riportato in \nfig, anche esso ricalca la struttura del precedente client per il servizio \texttt{daytime} (vedi @@ -201,7 +201,7 @@ int main(int argc, char *argv[]) } \end{lstlisting} \caption{Codice della prima versione del client \texttt{echo}.} - \label{fig:TCPsimpl_sockecho_code} + \label{fig:TCPsimpl_client_elem} \end{figure} La funzione \texttt{main} si occupa della creazione del socket e della @@ -234,7 +234,7 @@ void ClientEcho(FILE * filein, int socket) \end{lstlisting} \caption{Codice della prima versione della funzione \texttt{ClientEcho} per la gestione del servizio \texttt{echo}.} - \label{fig:TCPsimpl_sockecho_code} + \label{fig:TCPsimpl_client_echo_sub} \end{figure} La funzione utilizza due buffer per gestire i dati inviati e letti sul socket @@ -337,7 +337,7 @@ l'immediatamente stampa a video. \subsection{La conclusione normale} -\label{sec:TCPsimpl_startup} +\label{sec:TCPsimpl_conclusion} Tutto quello che scriveremo sul client sarà rimandato indietro dal server e ristampato a video fintanto che non concluderemo l'immissione dei dati; una @@ -388,9 +388,24 @@ casi seguenti: \end{enumerate} +\subsection{La gestione dei procesi figli} +\label{sec:TCPsimpl_child_hand} - +Tutto questo riguarda la connessione, c'è però un'altro effetto del +procedimento di chiusura del processo figlio nel server, e cioè l'invio del +segnale \texttt{SIGCHILD} al padre. Dato che non si è installato un +manipolatore (vedi \secref{cha:signals} per le problematiche relative) e che +l'azione di default per questo segnale è quella di essere ignorato quello che +avremo è che il processo figlio entrerà nello stato di zombie, come risulta +una volta che ripetiamo il comando \texttt{ps}: \begin{verbatim} 2356 pts/0 S 0:00 ./echod 2359 pts/0 Z 0:00 [echod ] \end{verbatim} + +Poiché non è possibile lasciare processi zombie (che pur inattivi occupano +spazio nella tabella dei processi e a lungo andare saturerebbero le risorse +del kernel occorrerà gestire il segnale, per questo installeremo un +manipolatore usando la funzione \texttt{Signal} (trattata in dettaglio in +\secref{sec:sig_xxx}). +