Qualche altra riga
[gapil.git] / signal.tex
index aafb4ecebfd83541240c676c89f5f59970ec2dec..5f00b4d6cbf1dbe88144066825b5f182d4ce10cb 100644 (file)
@@ -830,6 +830,11 @@ dei casi in cui si presenta questa situazione 
   per una una risposta. 
 \item operazioni eseguite con \func{ioctl} che non è detto possano essere
   eseguite immediatamente.
   per una una risposta. 
 \item operazioni eseguite con \func{ioctl} che non è detto possano essere
   eseguite immediatamente.
+\item le funzioni di intercomunicazione che si bloccano in attesa di risposte
+  da altri processi.
+\item la funzione \func{pause} (usata appunto per attendere l'arrivo di un
+  segnale).
+\item la funzione \func{wait} (se nessun processo figlio è ancora terminato).
 \end{itemize*}
 
 In questo caso si pone il problema di cosa fare una volta che il manipolatore
 \end{itemize*}
 
 In questo caso si pone il problema di cosa fare una volta che il manipolatore
@@ -839,8 +844,23 @@ tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei
 manipolatori controllino lo stato di uscita delle funzioni per ripeterne la
 chiamata qualora l'errore fosse questo.
 
 manipolatori controllino lo stato di uscita delle funzioni per ripeterne la
 chiamata qualora l'errore fosse questo.
 
-Dato che dimenticarsi di richiamare una funzione interrotta è un errore comune 
+Dimenticarsi di richiamare una system call interrotta da un segnale è un
+errore comune, tanto che le \acr{glibc} provvedono una macro
+\code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente,
+ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato
+non è diverso dall'uscita con un errore \macro{EINTR}.
 
 
+La soluzione è comunque poco elegante e BSD ha scelto un approccio molto
+diverso, che è quello di fare ripartire automaticamente la system call invece
+di farla fallire. In questo caso ovviamente non c'è da preoccuparsi di
+controllare il codice di errore; si perde però la possibilità di eseguire
+azioni specifiche all'occorrenza di questa particolare condizione. 
+
+Linux e le \acr{glibc} consentono di utilizzare entrambi gli approcci,
+attraverso una opportuna opzione di \func{sigaction} (vedi
+\secref{sec:sig_sigaction}). È da chiarire comunque che nel caso di
+interruzione nel mezzo di un trasferimento parziale di dati, le system call
+ritornano sempre indicando i byte trasferiti.
 
 
 \subsection{La funzione \func{signal}}
 
 
 \subsection{La funzione \func{signal}}
@@ -896,7 +916,6 @@ installare l'azione di di default\footnote{si ricordi per
   intercettati}.
 
 
   intercettati}.
 
 
-
 \subsection{Funzioni rientranti e default dei segnali}
 \label{sec:sig_reentrant}
 
 \subsection{Funzioni rientranti e default dei segnali}
 \label{sec:sig_reentrant}