X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=4fbe0b2b94343d61b59caf03f05b40be3b535140;hp=bfacf64b642354ca7d488b2dda271551c3683cc1;hb=3c8d9d27c6d5243c8de979f883dc2f3498a9bdc4;hpb=aa515f91c33e598ff4e139c070dc938bc5134801 diff --git a/signal.tex b/signal.tex index bfacf64..4fbe0b2 100644 --- a/signal.tex +++ b/signal.tex @@ -1275,12 +1275,58 @@ vedremo fra poco). In tal caso mescolare chiamata di \func{alarm} e indefiniti. Nel caso delle \acr{glibc} è stata usata una implementazione completamente indipendente e questi problemi non ci sono. -La granularità di \func{sleep} è +La granularità di \func{sleep} permette di specificare attese in secondi, per +questo sia sotto BSD4.3 che in SUSv2 è stata definita la funzione +\func{usleep} (dove la \texttt{u} è intesa come sostituzione di $\mu$); i due +standard hanno delle definizioni diverse, ma le \acr{glibc} +seguono\footnote{secondo la man page almeno dalla versione 2.2.2.} seguono +quella di SUSv2 che prevede il seguente prototipo: +\begin{prototype}{unistd.h}{int usleep(unsigned long usec)} + + Pone il processo in stato di sleep per \param{usec} microsecondi. + + \bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in + caso di errore, nel qual caso \var{errno} è settata a \macro{EINTR}.} +\end{prototype} + +Anche questa funzione a seconda delle implementazioni può presentare problemi +nell'interazione con \func{alarm} e \macro{SIGALRM}, ed è pertanto deprecata +in favore di \func{nanosleep}, definita dallo standard POSIX1.b, il cui +prototipo è: +\begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct + timespec *rem)} + + Pone il processo in stato di sleep per il tempo specificato da \param{req}. + + \bodydesc{La funzione restituisce zero se l'attesa viene completata, o -1 in + caso di errore, nel qual caso \var{errno} è settata a \macro{EINVAL} o + \macro{EINTR}.} +\end{prototype} + +Lo standard richiede che la funzione sia implementata in maniera del tutto +indipendente da \func{alarm}\footnote{nel caso di Linux direttamente + attraverso il timer del kernel} e sia utilizzabile senza interferenze con +l'uso di \macro{SIGALRM}. + + +\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_alarm_def} +\end{figure} -Come accennato è possibile implementare \func{sleep} a partire da dall'uso di -\func{pause} e \func{alarm}; \subsection{La gestione di \macro{SIGCHLD}} @@ -1292,7 +1338,7 @@ segnale conclusione di un processo è quella di inviare questo segnale al padre;\footnote{in realtà in SRV4 eredita la semantica di System V, in cui il segnale si chiama \macro{SIGCLD} e viene trattato in maniera speciale; se si - setta esplicitamente l'azione a \macro{SIG_IGN} il segnale non viene + setta esplicitamente l'azione a \macro{SIG\_IGN} il segnale non viene generato ed il sistema non genera zombie (lo stato di terminazione viene scartato senza dover chiamare una wait), l'azione di default è sempre quella di ignorare il segnale, ma non attiva questo comportamento. Linux, come BSD @@ -1307,6 +1353,12 @@ gestire questo segnale. \label{sec:sig_control} +\subsection{Un esempio di problema} +\label{sec:sig_example} + +Come accennato è possibile implementare \func{sleep} a partire da dall'uso di +\func{pause} e \func{alarm}; + \subsection{Le funzioni \func{sigprocmask} e \func{sigpending}}