Si prosegue con nanosleep ...
[gapil.git] / signal.tex
index c2345f01e1c49dc0ba19659c9775ca2a2d6d81f6..eb939d9e8578d8c1f60a6086f91bdf35f9c32f24 100644 (file)
@@ -1290,20 +1290,50 @@ quella di SUSv2 che prevede il seguente prototipo:
 
 \end{prototype}
 
-Anche questa funzione 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 è:
+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}.
+  In caso di interruzione restituisce il tempo restante in \param{rem}.
   
   \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}.}
+    caso di errore, nel qual caso \var{errno} è settata a 
+    \begin{errlist}
+    \item[\macro{EINVAL}] si è specificato un numero di secondi negativo o un
+      numero di nanosecondi maggiore di 999.999.999.
+    \item[\macro{EINTR}] la funzione è stata interrotta da un segnale.
+    \end{errlist}}
 \end{prototype}
 
+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. 
+
+\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}
 
+La