From: Simone Piccardi Date: Mon, 12 May 2003 22:52:29 +0000 (+0000) Subject: Si comincia a correggere il server X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=be0b7b2add1b886196ad5e0847657f85025adfbf Si comincia a correggere il server --- diff --git a/elemtcp.tex b/elemtcp.tex index ca37790..4ad16ac 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -2052,8 +2052,16 @@ manifester 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 +questo corrisponda ad \errcode{EINTR}. Questa soluzione ha però il pregio +della portabilità, infatti lo standard POSIX dice che la funzionalità di +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 \figref{fig:TCP_echo_server_code}. \begin{figure}[!htbp] diff --git a/sources/TCP_echod.c b/sources/TCP_echod.c index 831159a..3cc5ba3 100644 --- a/sources/TCP_echod.c +++ b/sources/TCP_echod.c @@ -26,7 +26,7 @@ * * Usage: echod -h give all info * - * $Id: TCP_echod.c,v 1.2 2003/05/02 10:09:50 piccardi Exp $ + * $Id: TCP_echod.c,v 1.3 2003/05/12 22:52:29 piccardi Exp $ * ****************************************************************/ /* @@ -136,7 +136,9 @@ int main(int argc, char *argv[]) /* handle echo to client */ while (1) { /* accept connection */ - if ( (conn_fd = accept(list_fd, NULL, NULL)) < 0) { + while (((conn_fd = accept(list_fd, NULL, NULL)) < 0) + && (errno == EINTR)); + if ( conn_fd < 0) { PrintErr("accept error"); exit(1); }