X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=09f8325543a3370c5247a3f9877952a6502e02e6;hp=adbec4db3e49f90de92da980d3a064b2cf2716b1;hb=2c682ba44f85eb183ddf75760b38bf048f89de53;hpb=996f31582fc276069a62f707bc5bdb4255342062 diff --git a/signal.tex b/signal.tex index adbec4d..09f8325 100644 --- a/signal.tex +++ b/signal.tex @@ -1141,12 +1141,6 @@ struct itimerval struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ }; - -struct timeval -{ - long tv_sec; /* seconds */ - long tv_usec; /* microseconds */ -}; \end{lstlisting} \end{minipage} \normalsize @@ -1336,9 +1330,9 @@ Lo standard richiede che la funzione sia implementata in maniera del tutto indipendente da \func{alarm}\footnote{nel caso di Linux questo è fatto utilizzando direttamente il timer del kernel.} e sia utilizzabile senza interferenze con l'uso di \macro{SIGALRM}. La funzione prende come parametri -delle strutture di tipo \var{timespec}, la cui definizione è riportata in -\figref{fig:sig_timespec_def}, che permettono di specificare un tempo con una -precisione (teorica) fino al nanosecondo. +delle strutture di tipo \var{timespec}, la cui definizione è riportata in +\figref{fig:sys_timeval_struct}, che permettono di specificare un tempo con +una precisione (teorica) fino al nanosecondo. La funzione risolve anche il problema di proseguire l'attesa dopo l'interruzione dovuta ad un segnale; infatti in tal caso in \param{rem} viene @@ -1355,21 +1349,6 @@ sia scarico ed il processa venga immediatamente rimesso in esecuzione); per questo motivo il valore restituito in \param{rem} è sempre arrotondato al multiplo successivo di 1/\macro{HZ}. -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15cm} - \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} -struct timespec { - time_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ -}; - \end{lstlisting} - \end{minipage} - \normalsize - \caption{La struttura \var{timespec} di \func{nanosleep}.} - \label{fig:sig_timespec_def} -\end{figure} - In realtà è possibile ottenere anche pause più precise del centesimo di secondo usando politiche di scheduling real time come \macro{SCHED\_FIFO} o \macro{SCHED\_RR}; in tal caso infatti il meccanismo di scheduling ordinario @@ -1839,11 +1818,10 @@ dell'implementazione di \code{sleep} mostrata in allarme avesse interrotto un altro manipolatore questo non sarebbe stato eseguito correttamente; la cosa poteva essere prevenuta installando gli altri manipolatori usando \var{sa\_mask} per bloccare \macro{SIGALRM} durante la -loro esecuzione. -Il valore di \var{sa\_flag} permette di specificare vari aspetti del -comportamento di \func{sigaction}, e della reazione del processo ai vari -segnali; i valori possibili ed il relativo significato sono riportati in -\tabref{tab:sig_sa_flag}. +loro esecuzione. Il valore di \var{sa\_flag} permette di specificare vari +aspetti del comportamento di \func{sigaction}, e della reazione del processo +ai vari segnali; i valori possibili ed il relativo significato sono riportati +in \tabref{tab:sig_sa_flag}. \begin{table}[htb] \footnotesize @@ -1900,9 +1878,11 @@ che non si sia vincolati allo standard ISO C, l'uso di \func{signal} a favore di \func{sigaction}. Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata -che abbia le stesse caratteristiche di \func{signal} a definire una funzione -equivalente (che si trova come \code{inline} nel file \file{wrapper.h} dei -sorgenti allegati) \code{Signal}, riportata in \figref{fig:sig_Signal_code}. +che abbia le stesse caratteristiche di \func{signal}, a definire una funzione +equivalente attraverso \func{sigaction}; la funzione è \code{Signal}, e si +trova definita come \code{inline} nel file \file{wrapper.h} (nei sorgenti +allegati), riportata in \figref{fig:sig_Signal_code}. La riutilizzeremo spesso +in seguito. \begin{figure}[!htb] \footnotesize \centering @@ -2263,11 +2243,11 @@ modificarlo con \func{sigprocmask}. Resta quindi il problema di cosa succede alla maschera dei segnali quando si esce da un manipolatore usando questa funzione. Il comportamento dipende dall'implementazione; in particolare BSD ripristina la maschera dei segnali -precedente l'invocazione, come per un normale ritorno, mentre SYSV no. Lo +precedente l'invocazione, come per un normale ritorno, mentre System V no. Lo standard POSIX.1 non specifica questo comportamento per \func{setjmp} e \func{longjmp}, ed il comportamento delle \acr{glibc} dipende da quale delle caratteristiche si sono abilitate con le macro viste in -\secref{sec:intro_gcc_glibc_std}. +\secref{sec:intro_gcc_glibc_std}. Lo standard POSIX però prevede anche la presenza di altre due funzioni \func{sigsetjmp} e \func{siglongjmp}, che permettono di decidere quale dei due @@ -2298,6 +2278,24 @@ ripristinata in un successivo \func{siglongjmp}; quest'ultima funzione, a parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a \func{longjmp}. +\begin{prototype}{signal.h} +{int sigaltstack(const stack\_t *ss, stack\_t *oss)} + +Installa un nuovo stack per i segnali. + + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso \var{errno} assumerà i valori: + + \begin{errlist} + \item[\macro{ENOMEM}] La dimensione specificata per il nuovo stack è minore + di \macro{MINSIGSTKSZ}. + \item[\macro{EPERM}] Uno degli indirizzi non è valido. + \item[\macro{EFAULT}] Si è cercato di cambiare lo stack alternativo mentre + questo è attivo (cioè il processo è in esecuzione su di esso). + \item[\macro{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un + valore diverso da zero che non è \macro{SS\_DISABLE}. + \end{errlist}} +\end{prototype}