From: Simone Piccardi Date: Fri, 1 Mar 2002 23:24:25 +0000 (+0000) Subject: Qualche altra riga X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=b1ebfb4b1e0eaaaa50b20e510cf4f394ed5ea62c;ds=sidebyside Qualche altra riga --- diff --git a/signal.tex b/signal.tex index aafb4ec..5f00b4d 100644 --- a/signal.tex +++ b/signal.tex @@ -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. +\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 @@ -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. -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}} @@ -896,7 +916,6 @@ installare l'azione di di default\footnote{si ricordi per intercettati}. - \subsection{Funzioni rientranti e default dei segnali} \label{sec:sig_reentrant}