diretto di questo numero da parte dei programmi è da evitare, in quanto esso
può variare a seconda dell'implementazione del sistema, e nel caso si Linux,
anche a seconda dell'architettura hardware.
-
-\begin{table}[htb]
- \footnotesize
- \centering
- \begin{tabular}[c]{|l|c|c|p{8cm}|}
- \hline
- \textbf{Segnale}&\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
- \hline
- \hline
- \macro{SIGHUP} &PL & A & Hangup o fine del processo di controllo \\
- \macro{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\
- \macro{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\
- \macro{SIGILL} &PL & C & Istruzione illegale \\
- \macro{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\
- \macro{SIGFPE} &PL & C & Errore aritmetico \\
- \macro{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\
- \macro{SIGSEGV} &PL & C & Errore di accesso in memoria \\
- \macro{SIGPIPE} &PL & A & Pipe spezzata \\
- \macro{SIGALRM} &PL & A & Segnale del timer da \func{alarm} \\
- \macro{SIGTERM} &PL & A & Segnale di terminazione \verb|C-\| \\
- \macro{SIGUSR1} &PL & A & Segnale utente numero 1 \\
- \macro{SIGUSR2} &PL & A & Segnale utente numero 2 \\
- \macro{SIGCHLD} &PL & B & Figlio terminato o fermato \\
- \macro{SIGCONT} &PL & & Continua se fermato \\
- \macro{SIGSTOP} &PL &DEF& Ferma il processo \\
- \macro{SIGTSTP} &PL & D & Stop typed at tty \\
- \macro{SIGTTIN} &PL & D & Input sul terminale per un processo
- in background \\
- \macro{SIGTTOU} &PL & D & Output sul terminale per un processo
- in background \\
- \macro{SIGBUS} &SL & C & Errore sul bus (bad memory access) \\
- \macro{SIGPOLL} &SL & A & Pollable event (Sys V).
- Sinonimo di \macro{SIGIO} \\
- \macro{SIGPROF} &SL & A & Timer del profiling scaduto \\
- \macro{SIGSYS} &SL & C & Bad argument to routine (SVID) \\
- \macro{SIGTRAP} &SL & C & Trace/breakpoint trap \\
- \macro{SIGURG} &SLB& B & Urgent condition on socket \\
- \macro{SIGVTALRM}&SLB& A & Virtual alarm clock \\
- \macro{SIGXCPU} &SLB& C & Ecceduto il limite sul CPU time \\
- \macro{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file \\
- \macro{SIGIOT} &L & C & IOT trap. A synonym for \macro{SIGABRT} \\
- \macro{SIGEMT} &L & & \\
- \macro{SIGSTKFLT}&L & A & Stack fault on coprocessor \\
- \macro{SIGIO} &LB & A & I/O now possible (4.2 BSD) \\
- \macro{SIGCLD} &L & & A synonym for \macro{SIGCHLD} \\
- \macro{SIGPWR} &L & A & Fallimento dell'alimentazione \\
- \macro{SIGINFO} &L & & A synonym for \macro{SIGPWR} \\
- \macro{SIGLOST} &L & A & Perso un lock sul file (per NFS) \\
- \macro{SIGWINCH} &LB & B & Window resize signal (4.3 BSD, Sun) \\
- \macro{SIGUNUSED}&L & A & Unused signal (will be SIGSYS) \\
- \hline
- \end{tabular}
- \caption{Lista dei segnali in Linux.}
- \label{tab:sig_signal_list}
-\end{table}
-
Per questo motivo ad ogni segnale viene associato un nome, definendo con una
macro di preprocessore una costante uguale al suddetto numero. Sono questi
nomi, che sono standardizzati e sostanzialmente uniformi rispetto alle varie
definiti in Linux (estratto dalle man page), comparati con quelli definiti in
vari standard.
-In \tabref{tab:sig_signal_list} si sono anche riportate le azioni di default
-di ciascun segnale (riassunte con delle lettere, la cui legenda completa è in
-\tabref{tab:sig_action_leg}), quando nessun manipolatore è installato un
-segnale può essere ignorato o causare la terminazione del processo. Nella
-colonna standard sono stati indicati anche gli standard in cui ciascun segnale
-è definito, secondo lo schema di \tabref{tab:sig_standard_leg}.
\begin{table}[htb]
\footnotesize
\label{tab:sig_action_leg}
\end{table}
-In alcuni casi alla terminazione del processo è associata la creazione di un
-file (posto nella directory corrente del processo e chiamato \file{core}) su
-cui viene salvata un'immagine della memoria del processo (il cosiddetto
-\textit{core dump}), che può essere usata da un debugger per esaminare lo
-stato dello stack e delle variabili al momento della ricezione del segnale.
+In \tabref{tab:sig_signal_list} si sono anche riportate le azioni di default
+di ciascun segnale (riassunte con delle lettere, la cui legenda completa è in
+\tabref{tab:sig_action_leg}), quando nessun manipolatore è installato un
+segnale può essere ignorato o causare la terminazione del processo. Nella
+colonna standard sono stati indicati anche gli standard in cui ciascun segnale
+è definito, secondo lo schema di \tabref{tab:sig_standard_leg}.
+
\begin{table}[htb]
\footnotesize
\label{tab:sig_standard_leg}
\end{table}
+In alcuni casi alla terminazione del processo è associata la creazione di un
+file (posto nella directory corrente del processo e chiamato \file{core}) su
+cui viene salvata un'immagine della memoria del processo (il cosiddetto
+\textit{core dump}), che può essere usata da un debugger per esaminare lo
+stato dello stack e delle variabili al momento della ricezione del segnale.
+
+\begin{table}[htb]
+ \footnotesize
+ \centering
+ \begin{tabular}[c]{|l|c|c|p{8cm}|}
+ \hline
+ \textbf{Segnale}&\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
+ \hline
+ \hline
+ \macro{SIGHUP} &PL & A & Hangup o fine del processo di controllo \\
+ \macro{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\
+ \macro{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\
+ \macro{SIGILL} &PL & C & Istruzione illegale \\
+ \macro{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\
+ \macro{SIGFPE} &PL & C & Errore aritmetico \\
+ \macro{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\
+ \macro{SIGSEGV} &PL & C & Errore di accesso in memoria \\
+ \macro{SIGPIPE} &PL & A & Pipe spezzata \\
+ \macro{SIGALRM} &PL & A & Segnale del timer da \func{alarm} \\
+ \macro{SIGTERM} &PL & A & Segnale di terminazione \verb|C-\| \\
+ \macro{SIGUSR1} &PL & A & Segnale utente numero 1 \\
+ \macro{SIGUSR2} &PL & A & Segnale utente numero 2 \\
+ \macro{SIGCHLD} &PL & B & Figlio terminato o fermato \\
+ \macro{SIGCONT} &PL & & Continua se fermato \\
+ \macro{SIGSTOP} &PL &DEF& Ferma il processo \\
+ \macro{SIGTSTP} &PL & D & Stop typed at tty \\
+ \macro{SIGTTIN} &PL & D & Input sul terminale per un processo
+ in background \\
+ \macro{SIGTTOU} &PL & D & Output sul terminale per un processo
+ in background \\
+ \macro{SIGBUS} &SL & C & Errore sul bus (bad memory access) \\
+ \macro{SIGPOLL} &SL & A & Pollable event (Sys V).
+ Sinonimo di \macro{SIGIO} \\
+ \macro{SIGPROF} &SL & A & Timer del profiling scaduto \\
+ \macro{SIGSYS} &SL & C & Bad argument to routine (SVID) \\
+ \macro{SIGTRAP} &SL & C & Trace/breakpoint trap \\
+ \macro{SIGURG} &SLB& B & Urgent condition on socket \\
+ \macro{SIGVTALRM}&SLB& A & Virtual alarm clock \\
+ \macro{SIGXCPU} &SLB& C & Ecceduto il limite sul CPU time \\
+ \macro{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file \\
+ \macro{SIGIOT} &L & C & IOT trap. A synonym for \macro{SIGABRT} \\
+ \macro{SIGEMT} &L & & \\
+ \macro{SIGSTKFLT}&L & A & Stack fault on coprocessor \\
+ \macro{SIGIO} &LB & A & I/O now possible (4.2 BSD) \\
+ \macro{SIGCLD} &L & & A synonym for \macro{SIGCHLD} \\
+ \macro{SIGPWR} &L & A & Fallimento dell'alimentazione \\
+ \macro{SIGINFO} &L & & A synonym for \macro{SIGPWR} \\
+ \macro{SIGLOST} &L & A & Perso un lock sul file (per NFS) \\
+ \macro{SIGWINCH} &LB & B & Window resize signal (4.3 BSD, Sun) \\
+ \macro{SIGUNUSED}&L & A & Unused signal (will be SIGSYS) \\
+ \hline
+ \end{tabular}
+ \caption{Lista dei segnali in Linux.}
+ \label{tab:sig_signal_list}
+\end{table}
+
La descrizione dettagliata del significato dei vari segnali, raggruppati per
tipologia, verrà affrontate nel seguito.
alle sue azioni.
Quando si mette in esecuzione un nuovo programma con \func{exec} (si ricordi
-quanto detto in \secref{sec:prog_exec}) tutti i segnali per i quali è stato
+quanto detto in \secref{sec:proc_exec}) tutti i segnali per i quali è stato
installato un manipolatore vengono resettati a \macro{SIG\_DFL}. Non ha più
senso infatti fare riferimento a funzioni definite nel programma originario,
-che non sono nemmeno presenti nello spazio di indirizzi del nuovo programma.
+che non sono presenti nello spazio di indirizzi del nuovo programma.
Si noti che questo vale solo per le azioni per le quali è stato installato un
manipolatore; viene mantenuto invece ogni eventuale settaggio dell'azione a
\end{functions}
La funzione \code{raise(sig)} è sostanzialmente equivalente ad una
-\code{kill(getpid(), sig)}. Siccome \func{raise} è definita nello standard ISO
-C non esiste in alcune vecchie versioni di Unix, per cui in generale l'uso di
-\func{kill} è più portabile.
+\code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello
+standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale
+l'uso di \func{kill} finisce per essere più portabile.
Lo standard POSIX poi prevede che il valore 0 sia usato per specificare il
segnale nullo. Se le funzioni vengono chiamate con questo valore non viene
\secref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
esso sia realmente quello a cui si intendeva mandare il segnale.
-Il valore dell'argomento \param{pid} specifica la destinazione a cui inviare
-il segnale e può assumere i seguenti significati:
-\begin{basedescript}{\desclabelwidth{2cm}\desclabelstyle{\nextlinelabel}}
-\item[$\texttt{pid}>0$] il segnale è mandato al processo con il \acr{pid}
- indicato.
-\item[$\texttt{pid}=0$] il segnale è mandato ad ogni processo del
- \textit{process group} del chiamante.
-\item[$\texttt{pid}=-1$] il segnale è mandato ad ogni processo (eccetto
- \cmd{init}).
-\item[$\texttt{pid}<-1$] il segnale è mandato ad ogni processo del process
- group $|\code{pid}|$.
-\end{basedescript}
+Il valore dell'argomento \param{pid} specifica il processo (o i processi) di
+destinazione a cui il segnale deve essere inviato e può assumere i valori
+riportati in \tabref{tab:sig_kill_values}.
+\begin{table}[htb]
+ \centering
+ \begin{tabular}[c]{|r|l|}
+ \hline
+ \textbf{Valore} & \textbf{Significato} \\
+ \hline
+ \hline
+ $>0$ & il segnale è mandato al processo con il \acr{pid} indicato.\\
+ 0 & il segnale è mandato ad ogni processo del \textit{process group}
+ del chiamante.\\
+ $-1$ & il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
+ $<-1$ & il segnale è mandato ad ogni processo del process group
+ $|\code{pid}|$.\\
+ \hline
+ \end{tabular}
+ \caption{Valori dell'argomento \param{pid} per la funzione
+ \func{kill}.}
+ \label{tab:sig_kill_values}
+\end{table}
+
Solo l'amministratore può inviare un segnale ad un processo qualunque, in
tutti gli altri casi il \textit{real user id} o l'\textit{effective user id}
In \secref{sec:sys_unix_time} abbiamo visto che ad ogni processo sono
associati tre tempi diversi: \textit{clock time}, \textit{user time} e
-\textit{system time}. Per poterli calcolare il kernel mantiene tre diversi
-timer per ciascun processo:
+\textit{system time}. Per poterli calcolare il kernel mantiene per ciascun
+processo tre diversi timer:
\begin{itemize}
\item un \textit{real-time timer} che calcola il tempo reale trascorso (che
corrisponde al \textit{clock time}). La scadenza di questo timer provoca
caratteristiche dei timer, ed in effetti la stessa \func{alarm}, benché
definita direttamente nello standard POSIX.1, può a sua volta essere espressa
in termini di \func{setitimer}, come evidenziato dal manuale delle \acr{glibc}
-\cite[glibc] che ne riporta la definizione in \figref{fig:sig_alarm_def}.
+\cite{glibc} che ne riporta la definizione in \figref{fig:sig_alarm_def}.
\begin{figure}[!htb]
\footnotesize \centering
-\subsection{La gestione di \macro{SIGCHLD}}
+\subsection{Un esempio elementare}
\label{sec:sig_sigchld}
Un semplice esempio per illustrare il funzionamento di un manipolatore di
-segnale è quello della gestione di \macro{SIGCHLD}. Abbiamo visto in
+segnale è quello della gestione di \macro{SIGCHLD}. Abbiamo visto in
\secref{sec:proc_termination} che una delle azioni eseguite dal kernel alla
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
terminazione viene scartato senza dover chiamare una \func{wait}). L'azione
di default è sempre quella di ignorare il segnale, ma non attiva questo
comportamento. Linux, come BSD e POSIX, non supporta questa semantica ed usa
- il nome di \macro{SIGCLD} come sinonimo di \macro{SIGCHLD}.} è pertanto
-naturale completare qui la trattazione della terminazione dei processi
-illustrando le modalità per gestire questo segnale.
+ il nome di \macro{SIGCLD} come sinonimo di \macro{SIGCHLD}.} in questo caso
+tutto quello che dovrà fare il manipolatore è ricevere lo stato di
+terminazione in modo da evitare la formazione di zombie.
+
+% è pertanto
+% naturale usare un esempio che ci permette di concludere la trattazione della
+% terminazione dei processi.
+% In questo caso si è tratterà di illustrare un esempio relativo ad un
+% manipolatore per che è previsto ritornare,
+
+In
+
+
+
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+#include <errno.h> /* error simbol definitions */
+#include <signal.h> /* signal handling declarations */
+#include <sys/types.h>
+#include <sys/wait.h>
+#include "macro.h"
+void Hand_CHLD(int sig)
+{
+ int errno_save;
+ int status;
+ pid_t pid;
+ /* save errno current value */
+ errno_save = errno;
+ /* loop until no */
+ do {
+ errno = 0;
+ pid = waitpid(WAIT_ANY, &status, WNOHANG);
+ if (pid > 0) {
+ debug("child %d terminated with status %x\n", pid, status);
+ }
+ } while ((pid > 0) && (errno == EINTR));
+ /* restore errno value*/
+ errno = errno_save;
+ /* return */
+ return;
+}
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{Una implementazione sbagliata di \func{sleep}.}
+ \label{fig:sig_timespec_def}
+\end{figure}