X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=519cf44d2804030e95e9a13ffab91d43c549672f;hp=411538c7fb1586d257abebd01ae962deb9fd4f46;hb=aa5d63f2af4475ae1188f695a33e4d0bee55f787;hpb=525464ecdd7e6cbdccc733e73b5f1cc9dbe6022a diff --git a/signal.tex b/signal.tex index 411538c..519cf44 100644 --- a/signal.tex +++ b/signal.tex @@ -1801,9 +1801,45 @@ indicate dai campi \var{sa\_handler} e \var{sa\_sigaction}; esse devono essere usate in maniera alternativa (in certe implementazioni questi vengono specificati come \ctyp{union}): la prima è quella classica usata anche con \func{signal}, la seconda permette invece di usare un manipolatore in grado di -ricevere informazioni più dettagliate dal sistema (ad esempio il tipo di -errore in caso di \macro{SIGFPE}), attraverso dei parametri aggiuntivi; per i -dettagli si consulti la man page di \func{sigaction}). +ricevere informazioni più dettagliate dal sistema, attraverso la struttura +\var{siginfo\_t}, riportata in \figref{fig:sig_siginfo_t}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} +siginfo_t { + int si_signo; /* Signal number */ + int si_errno; /* An errno value */ + int si_code; /* Signal code */ + pid_t si_pid; /* Sending process ID */ + uid_t si_uid; /* Real user ID of sending process */ + int si_status; /* Exit value or signal */ + clock_t si_utime; /* User time consumed */ + clock_t si_stime; /* System time consumed */ + sigval_t si_value; /* Signal value */ + int si_int; /* POSIX.1b signal */ + void * si_ptr; /* POSIX.1b signal */ + void * si_addr; /* Memory location which caused fault */ + int si_band; /* Band event */ + int si_fd; /* File descriptor */ +} + \end{lstlisting} + \end{minipage} + \normalsize + \caption{La struttura \var{siginfo\_t}.} + \label{fig:sig_siginfo_t} +\end{figure} + +Installando un manipolatore di tipo \var{sa\_sigaction} diventa allora +possibile accedere al risultato restituito attraverso il puntatore a questa +struttura. Tutti i segnali settano i campi \var{si\_signo}, \var{si\_errno} e +\var{si\_code}, ed il resto della struttura può essere definito come +\ctyp{union} ed i valori eventualmente presenti dipendono dal segnale (ad +esempio può essere il tipo di errore nel caso di \macro{SIGFPE}); vedremo un +esempio di tutto ciò per \macro{SIGIO} in \secref{sec:file_asyncronous_io}, +per i dettagli degli altri segnali si consulti la man page di +\func{sigaction}). Il campo \var{sa\_mask} serve ad indicare l'insieme dei segnali che devono essere bloccati durante l'esecuzione del manipolatore, ad essi viene comunque @@ -2279,26 +2315,6 @@ 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} - - %%% Local Variables: %%% mode: latex