X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=f7bae08adb1e6ff6dff15e03bcdf1a872670aa8a;hp=4b5ff406b275d30a37c3826d17bf5b8e1b09fd2d;hb=9571a19b1524491a8e43f2c0176243d2483cf986;hpb=8363203066864251f55edeb8e41bcce81fa7da7b diff --git a/signal.tex b/signal.tex index 4b5ff40..f7bae08 100644 --- a/signal.tex +++ b/signal.tex @@ -52,20 +52,22 @@ dei segnali (dette semantiche) che vengono chiamate rispettivamente Nella semantica \textit{unreliable} la routine di gestione del segnale specificata dall'utente non resta installata una volta chiamata; è perciò a carico dell'utente stesso ripetere l'installazione all'interno della routine -stessa in tutti i casi in cui si vuole che il signal handler esterno resti -attivo. - -Per questo motivo è possibile una race-condition in cui il segnale arriva -prima che il suo manipolatore sia installato, nel qual caso il segnale può -essere perso o causare il comportamento originale (in genere la terminazione -del processo). Questa è la ragione per cui detti segnali sono chiamati -\textit{inaffidabili}, in quanto la ricezione del segnale e la reinstallazione -del suo manipolatore non sono operazioni atomiche. - -In caso di implementazione inaffidabile le chiamate di sistema non sono fatte -ripartire automaticamente quando sono interrotte da un segnale, per questo il -programma deve controllare lo stato di uscita della chiamata al sistema e -riperterla nel caso l'errore riportato da \texttt{errno} sia \texttt{EINTR}. +di gestione stessa in tutti i casi in cui si vuole che il signal handler +esterno resti attivo. + +Per questo motivo è possibile una race-condition in cui un secondo segnale +arriva prima che il manipolatore abbia eseguito la re-installazione di se +stesso, nel qual caso il segnale può essere perso o causare il comportamento +originale assegnato al segnale (in genere la terminazione del processo). +Questa è la ragione per cui detti segnali sono chiamati \textit{inaffidabili}, +in quanto la ricezione del segnale e la reinstallazione del suo manipolatore +non sono operazioni atomiche. + +Nel caso di implementazione inaffidabile le chiamate di sistema non +sono fatte ripartire automaticamente quando sono interrotte da un segnale, per +questo il programma deve controllare lo stato di uscita della chiamata al +sistema e riperterla nel caso l'errore riportato da \texttt{errno} sia +\texttt{EINTR}. Inoltre in questo caso non esiste una modalità semplice per ottenere una operazione di pausa atomica (cioè mandare in sleep un processo fino all'arrivo @@ -82,7 +84,6 @@ ottenere un'operazione di pausa atomica (usando la funzione POSIX \subsubsection{Tipi di segnali} \label{sec:sig_types} - In generale gli eventi che generano i segnali si possono dividere in tre categorie principali: errori, eventi e richieste esplicite. @@ -194,7 +195,60 @@ segnali sono definiti nell'header di sistema \texttt{signal.h}. Il numero totale di segnali presenti è dato dalla macro \texttt{NSIG}, e dato che i numeri dei segnali sono allocati progressivamente, essa corrisponde -anche al successivo del valore numerico assegnato all'ultimo segnale definito. +anche al successivo del valore numerico assegnato all'ultimo segnale definito, +in \ntab\ si è riportato l'elenco completo dei segnali definiti in Linux, +comparati con quelli definiti in vari standard. + +\begin{table}[htb] + \centering + \begin{tabular}[c]{|l|c|c|c||c|l|} + \hline + Segnale & POSIX.1 & SUSv2 & Linux &Azione & Descrizione \\ + \hline + \hline + SIGHUP &$\bullet$&&$\bullet$& A & Hangup \\ + SIGINT &$\bullet$&&$\bullet$& A & Interrupt from keyboard \\ + SIGQUIT &$\bullet$&&$\bullet$& C & Quit from keyboard \\ + SIGILL &$\bullet$&&$\bullet$& C & Illegal Instruction \\ + SIGABRT &$\bullet$&&$\bullet$& C & Abort signal from abort(3) \\ + SIGFPE &$\bullet$&&$\bullet$& C & Floating point exception \\ + SIGKILL &$\bullet$&&$\bullet$& AEF & Kill signal \\ + SIGSEGV &$\bullet$&&$\bullet$& C & Invalid memory reference \\ + SIGPIPE &$\bullet$&&$\bullet$& A & Broken pipe \\ + SIGALRM &$\bullet$&&$\bullet$& A & Timer signal from alarm(2) \\ + SIGTERM &$\bullet$&&$\bullet$& A & Termination signal \\ + SIGUSR1 &$\bullet$&&$\bullet$& A & User-defined signal 1 \\ + SIGUSR2 &$\bullet$&&$\bullet$& A & User-defined signal 2 \\ + SIGCHLD &$\bullet$&&$\bullet$& B & Child stopped or terminated \\ + SIGCONT &$\bullet$&&$\bullet$& & Continue if stopped \\ + SIGSTOP &$\bullet$&&$\bullet$& DEF & Stop process \\ + SIGTSTP &$\bullet$&&$\bullet$& D & Stop typed at tty \\ + SIGTTIN &$\bullet$&&$\bullet$& D & tty input for background process \\ + SIGTTOU &$\bullet$&&$\bullet$& D & tty output for background process \\ + SIGBUS &&$\bullet$&$\bullet$& C & Bus error (bad memory access) \\ + SIGPOLL &&$\bullet$&$\bullet$& A & Pollable event (Sys V). Synonym of SIGIO\\ + SIGPROF &&$\bullet$&$\bullet$& A & Profiling timer expired \\ + SIGSYS &&$\bullet$&$\bullet$& C & Bad argument to routine (SVID) \\ + SIGTRAP &&$\bullet$&$\bullet$& C & Trace/breakpoint trap \\ + SIGURG &&$\bullet$&$\bullet$& B & Urgent condition on socket (4.2 BSD) \\ + SIGVTALRM &&$\bullet$&$\bullet$& A & Virtual alarm clock (4.2 BSD) \\ + SIGXCPU &&$\bullet$&$\bullet$& C & CPU time limit exceeded (4.2 BSD) \\ + SIGXFSZ &&$\bullet$&$\bullet$& C & File size limit exceeded (4.2 BSD) \\ + SIGIOT &&&$\bullet$& C & IOT trap. A synonym for SIGABRT \\ + SIGEMT &&&$\bullet$& & \\ + SIGSTKFLT &&&$\bullet$& A & Stack fault on coprocessor \\ + SIGIO &&&$\bullet$& A & I/O now possible (4.2 BSD) \\ + SIGCLD &&&$\bullet$& & A synonym for SIGCHLD \\ + SIGPWR &&&$\bullet$& A & Power failure (System V) \\ + SIGINFO &&&$\bullet$& & A synonym for SIGPWR \\ + SIGLOST &&&$\bullet$& A & File lock lost \\ + SIGWINCH &&&$\bullet$& B & Window resize signal (4.3 BSD, Sun) \\ + SIGUNUSED &&&$\bullet$& A & Unused signal (will be SIGSYS) \\ + \hline + \end{tabular} + \caption{Lista dei segnali in Linux} + \label{tab:sign_signal_list} +\end{table} \subsubsection{Segnali di errore di programma} @@ -225,7 +279,7 @@ Questi segnali sono: \begin{itemize} \item \texttt{SIGFPE} Riporta un errore aritmetico fatale. Benché il nome derivi da \textit{floating point exception} si applica a tutti gli errori - aritmetici compresa la divisione per zero e l'overflow. + aritmetici compresa la divisione per zero e l'overflow. % Per questo segnale le cose sono complicate dal fatto che possono esserci % molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo