Sezione sulle limitazioni dei gestori di segnali, e avanti sui
[gapil.git] / signal.tex
index 5b28acdf9f6d19a5c107dfe0365961d21ea70d72..7d3751b5c58e048b1e61eb5e81d80e8e331fe3d3 100644 (file)
@@ -2227,11 +2227,88 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, 
 \func{longjmp}.
 
 
+\subsection{Criteri di programmazione per i gestori dei segnali}
+\label{sec:sig_signal_handler}
+
+Abbiamo finora parlato dei gestori dei segnali come funzioni chiamate in
+corrispondenza della consegna di un segnale. In realtà un gestore non può
+essere una funzione qualunque, in quanto esso può essere eseguito in
+corrispondenza all'interruzione in un punto qualunque del programma principale,
+ed ad esempio può essere problematico chiamare all'interno di un gestore di
+segnali la stessa funzione che dal segnale è stata interrotta.
+
+\index{funzioni~sicure|(}
+
+Il concetto è comunque più generale e porta ad una distinzione fra quelle che
+che POSIX chiama \textsl{funzioni insicure} (\textit{n'Usane function}) e
+\textsl{funzioni sicure} (\textit{safe function}); quando un segnale
+interrompe una funzione insicura ed il gestore chiama al suo interno una
+funzione insicura il sistema può dare luogo ad un comportamento indefinito.
+
+Tutto questo significa che un gestore di segnale deve essere programmato con
+molta cura per evitare questa evenienza, pertanto è non è possibile chiamare
+al suo interno una funzione qualunque, e si può ricorrere soltanto all'uso di
+funzioni sicure.
+
+L'elenco delle funzioni sicure varia a secondo dello standard a cui si fa
+riferimento, secondo quanto riportato dallo standard POSIX 1003.1 nella
+revisione del 2003, le ``\textit{signal safe function}'' che possono essere
+chiamate anche all'interno di un gestore di segnali sono quelle della lista
+riportata in fig.~\ref{fig:sig_safe_functions}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \func{\_exit}, \func{abort}, \func{accept}, \func{access},
+    \func{aio\_error} \func{aio\_return}, \func{aio\_suspend}, \func{alarm},
+    \func{bind}, \func{cfgetispeed}, \func{cfgetospeed}, \func{cfsetispeed},
+    \func{cfsetospeed}, \func{chdir}, \func{chmod}, \func{chown},
+    \func{clock\_gettime}, \func{close}, \func{connect}, \func{creat},
+    \func{dup}, \func{dup2}, \func{execle}, \func{execve}, \func{fchmod},
+    \func{fchown}, \func{fcntl}, \func{fdatasync}, \func{fork},
+    \func{fpathconf}, \func{fstat}, \func{fsync}, \func{ftruncate},
+    \func{getegid}, \func{geteuid}, \func{getgid}, \func{getgroups},
+    \func{getpeername}, \func{getpgrp}, \func{getpid}, \func{getppid},
+    \func{getsockname}, \func{getsockopt}, \func{getuid}, \func{kill},
+    \func{link}, \func{listen}, \func{lseek}, \func{lstat}, \func{mkdir},
+    \func{mkfifo}, \func{open}, \func{pathconf}, \func{pause}, \func{pipe},
+    \func{poll}, \func{posix\_trace\_event}, \func{pselect}, \func{raise},
+    \func{read}, \func{readlink}, \func{recv}, \func{recvfrom},
+    \func{recvmsg}, \func{rename}, \func{rmdir}, \func{select},
+    \func{sem\_post}, \func{send}, \func{sendmsg}, \func{sendto},
+    \func{setgid}, \func{setpgid}, \func{setsid}, \func{setsockopt},
+    \func{setuid}, \func{shutdown}, \func{sigaction}, \func{sigaddset},
+    \func{sigdelset}, \func{sigemptyset}, \func{sigfillset},
+    \func{sigismember}, \func{signal}, \func{sigpause}, \func{sigpending},
+    \func{sigprocmask}, \func{sigqueue}, \func{sigset}, \func{sigsuspend},
+    \func{sleep}, \func{socket}, \func{socketpair}, \func{stat},
+    \func{symlink}, \func{sysconf}, \func{tcdrain}, \func{tcflow},
+    \func{tcflush}, \func{tcgetattr}, \func{tcgetgrp}, \func{tcsendbreak},
+    \func{tcsetattr}, \func{tcsetpgrp}, \func{time}, \func{timer\_getoverrun},
+    \func{timer\_gettime}, \func{timer\_settime}, \func{times}, \func{umask},
+    \func{uname}, \func{unlink}, \func{utime}, \func{wait}, \func{waitpid},
+    \func{write}.
+  \end{minipage} 
+  \normalsize 
+  \caption{Elenco delle funzioni sicure secondo lo standard POSIX
+    1003.1-2003.}
+  \label{fig:sig_safe_functions}
+\end{figure}
+
+\index{funzioni~sicure|)}
+
+Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni
+effettuate all'interno di un gestore di segnali, qualora si debbano compiere
+operazioni complesse è sempre preferibile utilizzare la tecnica in cui si usa
+il gestore per impostare il valore di una qualche variabile globale, e poi si
+eseguono le operazioni complesse nel programma verificando (con tutti gli
+accorgimenti visti in precedenza) il valore di questa variabile tutte le volte
+che si è rilevata una interruzione dovuta ad un segnale.
+
 
 \subsection{I segnali real-time}
 \label{sec:sig_real_time}
 
-
 Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi
 real-time, ha introdotto una estensione del modello classico dei segnali che
 presenta dei significativi miglioramenti,\footnote{questa estensione è stata
@@ -2465,6 +2542,8 @@ questa maniera devono essere mascherati per tutti i thread, compreso quello
 dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 
 
+
+
 % LocalWords:  kernel POSIX timer shell control ctrl kill raise signal handler
 % LocalWords:  reliable unreliable fig race condition sez struct process table
 % LocalWords:  delivered pending scheduler sigpending l'I suspend SIGKILL wait
@@ -2495,8 +2574,20 @@ dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 % LocalWords:  how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc
 % LocalWords:  SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB
 % LocalWords:  RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr
-% LocalWords:  SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl
-% LocalWords:  QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB
+% LocalWords:  SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl safe
+% LocalWords:  QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB bind
+% LocalWords:  function accept return cfgetispeed cfgetospeed cfsetispeed chdir
+% LocalWords:  cfsetospeed chmod chown gettime close connect creat dup execle
+% LocalWords:  execve fchmod fchown fdatasync fpathconf fstat fsync ftruncate
+% LocalWords:  getegid geteuid getgid getgroups getpeername getpgrp getppid sem
+% LocalWords:  getsockname getsockopt getuid listen lseek lstat mkdir mkfifo
+% LocalWords:  pathconf poll posix pselect read readlink recv recvfrom recvmsg
+% LocalWords:  rename rmdir select send sendmsg sendto setgid setpgid setsid
+% LocalWords:  setsockopt setuid shutdown sigpause socketpair stat symlink
+% LocalWords:  sysconf tcdrain tcflow tcflush tcgetattr tcgetgrp tcsendbreak
+% LocalWords:  tcsetattr tcsetpgrp getoverrun times umask uname unlink utime
+% LocalWords:  write sival
+
 
 %%% Local Variables: 
 %%% mode: latex