X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=755f19c2cf6385d237fc22b0c3f7d2604f5213fe;hp=0b497d8033b5052347507c3b6c1c7d3d2d0a9b5c;hb=0345bbfd866e46d3c76d0df7f37a83f9a3924926;hpb=4cef5fd8ce4bc04129a1934fa94ecb2848bcdc88 diff --git a/signal.tex b/signal.tex index 0b497d8..755f19c 100644 --- a/signal.tex +++ b/signal.tex @@ -1409,16 +1409,9 @@ di zombie\index{zombie}. % In questo caso si è tratterà di illustrare un esempio relativo ad un % gestore per che è previsto ritornare, - \begin{figure}[!htb] \footnotesize \begin{lstlisting}{} -#include /* error symbol definitions */ -#include /* signal handling declarations */ -#include -#include -#include "macro.h" - void HandSigCHLD(int sig) { int errno_save; @@ -1963,17 +1956,15 @@ typedef void SigFunc(int); inline SigFunc * Signal(int signo, SigFunc *func) { struct sigaction new_handl, old_handl; - new_handl.sa_handler=func; + new_handl.sa_handler = func; /* clear signal mask: no signal blocked during execution of func */ - if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ - perror("cannot initializes the signal set to empty"); /* see mess. */ - exit(1); + if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */ + return SIG_ERR; } - new_handl.sa_flags=0; /* init to 0 all flags */ + new_handl.sa_flags=0; /* init to 0 all flags */ /* change action for signo signal */ - if (sigaction(signo,&new_handl,&old_handl)){ - perror("sigaction failed on signal action setting"); - exit(1); + if (sigaction(signo, &new_handl, &old_handl)){ + return SIG_ERR; } return (old_handl.sa_handler); } @@ -1985,10 +1976,29 @@ inline SigFunc * Signal(int signo, SigFunc *func) \end{figure} Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata -che abbia le stesse caratteristiche di \func{signal}, a definire una funzione -equivalente attraverso \func{sigaction}; la funzione è \code{Signal}, e si -trova definita nel file \file{SigHand.c} (nei sorgenti allegati), e riportata -in \figref{fig:sig_Signal_code}. La riutilizzeremo spesso in seguito. +che abbia le stesse caratteristiche di \func{signal}, a definire attraverso +\func{sigaction} una funzione equivalente, il cui codice è riportato in +\figref{fig:sig_Signal_code} (il codice completo si trova nel file +\file{SigHand.c} nei sorgenti allegati). Si noti come, essendo la funzione +estremamente semplice, è definita come \direct{inline}.\footnote{la direttiva + \direct{inline} viene usata per dire al compilatore di trattare la funzione + cui essa fa riferimento in maniera speciale inserendo il codice direttamente + nel testo del programma. Anche se i compilatori più moderni sono in grado + di effettuare da soli queste manipolazioni (impostando le opportune + ottimizzazioni) questa è una tecnica usata per migliorare le prestazioni per + le funzioni piccole ed usate di frequente (in particolare nel kernel, dove + in certi casi le ottimizzazioni dal compilatore, tarate per l'uso in user + space, non sono sempre adatte). In tal caso infatti le istruzioni per creare + un nuovo frame nello stack per chiamare la funzione costituirebbero una + parte rilevante del codice, appesantendo inutilmente il programma. + Originariamente questo comportamento veniva ottenuto con delle macro, ma + queste hanno tutta una serie di problemi di sintassi nel passaggio degli + argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono + essere evitati.} + + + + \subsection{La gestione della \textsl{maschera dei segnali} o \textit{signal mask}}