%% signal.tex
%%
-%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
Una volta che un segnale viene notificato (che questo avvenga subito o dopo
una attesa più o meno lunga) viene eseguita l'azione specificata per il
-segnale. Per alcuni segnali (\const{SIGKILL} e \const{SIGSTOP}) questa azione
+segnale. Per alcuni segnali (\signal{SIGKILL} e \signal{SIGSTOP}) questa azione
è fissa e non può essere cambiata, ma per tutti gli altri si può selezionare
una delle tre possibilità seguenti:
Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso
diretto di questo numero da parte dei programmi è da evitare, in quanto esso
può variare a seconda dell'implementazione del sistema, e nel caso di Linux,
-anche a seconda dell'architettura hardware.
-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
-implementazioni, che si devono usare nei programmi. Tutti i nomi e le funzioni
-che concernono i segnali sono definiti nell'header di sistema \file{signal.h}.
+anche a seconda dell'architettura hardware. 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 implementazioni, che si devono
+usare nei programmi. Tutti i nomi e le funzioni che concernono i segnali sono
+definiti nell'header di sistema \headfile{signal.h}.
Il numero totale di segnali presenti è dato dalla macro \const{NSIG}, e dato
che i numeri dei segnali sono allocati progressivamente, essa corrisponde
per esaminare lo stato dello \itindex{stack} \textit{stack} e delle variabili
al momento della ricezione del segnale.
-\begin{table}[htb]
+\begin{table}[!htb]
\footnotesize
\centering
- \begin{tabular}[c]{|l|c|c|p{8cm}|}
+ \begin{tabular}[c]{|l|c|c|l|}
\hline
\textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
\hline
\hline
- \const{SIGHUP} &PL & A & Hangup o terminazione del processo di
+ \signal{SIGHUP} &PL & A & Hangup o terminazione del processo di
controllo. \\
- \const{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}). \\
- \const{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}). \\
- \const{SIGILL} &PL & C & Istruzione illecita. \\
- \const{SIGABRT} &PL & C & Segnale di abort da \func{abort}. \\
- \const{SIGFPE} &PL & C & Errore aritmetico. \\
- \const{SIGKILL} &PL &AEF& Segnale di terminazione forzata. \\
- \const{SIGSEGV} &PL & C & Errore di accesso in memoria. \\
- \const{SIGPIPE} &PL & A & Pipe spezzata. \\
- \const{SIGALRM} &PL & A & Segnale del timer da \func{alarm}. \\
- \const{SIGTERM} &PL & A & Segnale di terminazione \texttt{C-\bslash}. \\
- \const{SIGUSR1} &PL & A & Segnale utente numero 1. \\
- \const{SIGUSR2} &PL & A & Segnale utente numero 2. \\
- \const{SIGCHLD} &PL & B & Figlio terminato o fermato. \\
- \const{SIGCONT} &PL & & Continua se fermato. \\
- \const{SIGSTOP} &PL &DEF& Ferma il processo. \\
- \const{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale. \\
- \const{SIGTTIN} &PL & D & Input sul terminale per un processo
+ \signal{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}). \\
+ \signal{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}). \\
+ \signal{SIGILL} &PL & C & Istruzione illecita. \\
+ \signal{SIGABRT} &PL & C & Segnale di abort da \func{abort}. \\
+ \signal{SIGFPE} &PL & C & Errore aritmetico. \\
+ \signal{SIGKILL} &PL &AEF& Segnale di terminazione forzata. \\
+ \signal{SIGSEGV} &PL & C & Errore di accesso in memoria. \\
+ \signal{SIGPIPE} &PL & A & Pipe spezzata. \\
+ \signal{SIGALRM} &PL & A & Segnale del timer da \func{alarm}. \\
+ \signal{SIGTERM} &PL & A & Segnale di terminazione \texttt{C-\bslash}. \\
+ \signal{SIGUSR1} &PL & A & Segnale utente numero 1. \\
+ \signal{SIGUSR2} &PL & A & Segnale utente numero 2. \\
+ \signal{SIGCHLD} &PL & B & Figlio terminato o fermato. \\
+ \signal{SIGCONT} &PL & & Continua se fermato. \\
+ \signal{SIGSTOP} &PL &DEF& Ferma il processo. \\
+ \signal{SIGTSTP} &PL & D & Pressione del tasto di stop sul terminale. \\
+ \signal{SIGTTIN} &PL & D & Input sul terminale per un processo
in background. \\
- \const{SIGTTOU} &PL & D & Output sul terminale per un processo
+ \signal{SIGTTOU} &PL & D & Output sul terminale per un processo
in background. \\
- \const{SIGBUS} &SL & C & Errore sul bus (bad memory access). \\
- \const{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V);
- Sinonimo di \const{SIGIO}. \\
- \const{SIGPROF} &SL & A & Timer del profiling scaduto. \\
- \const{SIGSYS} &SL & C & Argomento sbagliato per una subroutine (SVID).\\
- \const{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint. \\
- \const{SIGURG} &SLB& B & Ricezione di una \textit{urgent condition} su
+ \signal{SIGBUS} &SL & C & Errore sul bus (bad memory access). \\
+ \signal{SIGPOLL} &SL & A & \textit{Pollable event} (Sys V);
+ Sinonimo di \signal{SIGIO}. \\
+ \signal{SIGPROF} &SL & A & Timer del profiling scaduto. \\
+ \signal{SIGSYS} &SL & C & Argomento sbagliato per una subroutine (SVID).\\
+ \signal{SIGTRAP} &SL & C & Trappole per un Trace/breakpoint. \\
+ \signal{SIGURG} &SLB& B & Ricezione di una \textit{urgent condition} su
un socket. \\
- \const{SIGVTALRM}&SLB& A & Timer di esecuzione scaduto. \\
- \const{SIGXCPU} &SLB& C & Ecceduto il limite sul tempo di CPU. \\
- \const{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file. \\
- \const{SIGIOT} &L & C & IOT trap. Sinonimo di \const{SIGABRT}. \\
- \const{SIGEMT} &L & & \\
+ \signal{SIGVTALRM}&SLB& A & Timer di esecuzione scaduto. \\
+ \signal{SIGXCPU} &SLB& C & Ecceduto il limite sul tempo di CPU. \\
+ \signal{SIGXFSZ} &SLB& C & Ecceduto il limite sulla dimensione dei file.\\
+ \signal{SIGIOT} &L & C & IOT trap. Sinonimo di \signal{SIGABRT}. \\
+ \signal{SIGEMT} &L & & \\
% TODO che roba e` SIGEMT
- \const{SIGSTKFLT}&L & A & Errore sullo stack del coprocessore. \\
- \const{SIGIO} &LB & A & L'I/O è possibile (4.2 BSD). \\
- \const{SIGCLD} &L & & Sinonimo di \const{SIGCHLD}. \\
- \const{SIGPWR} &L & A & Fallimento dell'alimentazione. \\
- \const{SIGINFO} &L & & Sinonimo di \const{SIGPWR}. \\
- \const{SIGLOST} &L & A & Perso un lock sul file (per NFS). \\
- \const{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun). \\
- \const{SIGUNUSED}&L & A & Segnale inutilizzato (diventerà
- \const{SIGSYS}). \\
+ \signal{SIGSTKFLT}&L & A & Errore sullo stack del coprocessore. \\
+ \signal{SIGIO} &LB & A & L'I/O è possibile (4.2 BSD). \\
+ \signal{SIGCLD} &L & & Sinonimo di \signal{SIGCHLD}. \\
+ \signal{SIGPWR} &L & A & Fallimento dell'alimentazione. \\
+ \signal{SIGINFO} &L & & Sinonimo di \signal{SIGPWR}. \\
+ \signal{SIGLOST} &L & A & Perso un lock sul file (per NFS). \\
+ \signal{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun). \\
+ \signal{SIGUNUSED}&L & A & Segnale inutilizzato (diventerà
+ \signal{SIGSYS}). \\
\hline
\end{tabular}
\caption{Lista dei segnali in Linux.}
al momento dell'errore, che il debugger può usare per ricostruire lo stato del
programma al momento della terminazione. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
+\item[\signal{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. Se il gestore
ritorna il comportamento del processo è indefinito, ed ignorare questo
segnale può condurre ad un ciclo infinito.
% Per questo segnale le cose sono complicate dal fatto che possono esserci
-% molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo
+% molte diverse eccezioni che \signal{SIGFPE} non distingue, mentre lo
% standard IEEE per le operazioni in virgola mobile definisce varie eccezioni
% aritmetiche e richiede che esse siano notificate.
% TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni
-\item[\const{SIGILL}] Il nome deriva da \textit{illegal instruction},
+\item[\signal{SIGILL}] Il nome deriva da \textit{illegal instruction},
significa che il programma sta cercando di eseguire una istruzione
privilegiata o inesistente, in generale del codice illecito. Poiché il
compilatore del C genera del codice valido si ottiene questo segnale se il
\textit{stack}. Lo stesso segnale viene generato in caso di overflow dello
\itindex{stack} \textit{stack} o di problemi nell'esecuzione di un gestore.
Se il gestore ritorna il comportamento del processo è indefinito.
-\item[\const{SIGSEGV}] Il nome deriva da \itindex{segment~violation}
+\item[\signal{SIGSEGV}] Il nome deriva da \itindex{segment~violation}
\textit{segment violation}, e significa che il programma sta cercando di
leggere o scrivere in una zona di memoria protetta al di fuori di quella che
gli è stata riservata dal sistema. In genere è il meccanismo della
È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
inizializzato leggendo al di là della fine di un vettore.
-\item[\const{SIGBUS}] Il nome deriva da \textit{bus error}. Come
- \const{SIGSEGV} questo è un segnale che viene generato di solito quando si
+\item[\signal{SIGBUS}] Il nome deriva da \textit{bus error}. Come
+ \signal{SIGSEGV} questo è un segnale che viene generato di solito quando si
dereferenzia un puntatore non inizializzato, la differenza è che
- \const{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
+ \signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
(tipo fuori dallo heap o dallo \itindex{stack} \textit{stack}), mentre
- \const{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso di
+ \signal{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso di
un puntatore non allineato.
-\item[\const{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica che
+\item[\signal{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica che
il programma stesso ha rilevato un errore che viene riportato chiamando la
funzione \func{abort} che genera questo segnale.
-\item[\const{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
+\item[\signal{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
dall'attivazione del tracciamento per il processo. È usato dai programmi per
il debugging e un programma normale non dovrebbe ricevere questo segnale.
-\item[\const{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
+\item[\signal{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
richiede l'esecuzione di una system call, ma si è fornito un codice
sbagliato per quest'ultima.
\end{basedescript}
L'azione predefinita di questi segnali è di terminare il processo, questi
segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
+\item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
generico usato per causare la conclusione di un programma. Al contrario di
- \const{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
+ \signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
usa per chiedere in maniera ``\textsl{educata}'' ad un processo di
concludersi.
-\item[\const{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
+\item[\signal{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
interruzione per il programma. È quello che viene generato di default dal
comando \cmd{kill} o dall'invio sul terminale del carattere di controllo
INTR (interrupt, generato dalla sequenza \cmd{C-c}).
-\item[\const{SIGQUIT}] È analogo a \const{SIGINT} con la differenza che è
+\item[\signal{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
controllato da un altro carattere di controllo, QUIT, corrispondente alla
sequenza \texttt{C-\bslash}. A differenza del precedente l'azione
predefinita, oltre alla terminazione del processo, comporta anche la
\textit{core dump}.
-\item[\const{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
+\item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
qualunque programma. Questo segnale non può essere né intercettato, né
ignorato, né bloccato, per cui causa comunque la terminazione del processo.
In genere esso viene generato solo per richiesta esplicita dell'utente dal
comando (o tramite la funzione) \cmd{kill}. Dato che non lo si può
intercettare è sempre meglio usarlo come ultima risorsa quando metodi meno
- brutali, come \const{SIGTERM} o \cmd{C-c} non funzionano.
+ brutali, come \signal{SIGTERM} o \cmd{C-c} non funzionano.
- Se un processo non risponde a nessun altro segnale \const{SIGKILL} ne causa
+ Se un processo non risponde a nessun altro segnale \signal{SIGKILL} ne causa
sempre la terminazione (in effetti il fallimento della terminazione di un
- processo da parte di \const{SIGKILL} costituirebbe un malfunzionamento del
+ processo da parte di \signal{SIGKILL} costituirebbe un malfunzionamento del
kernel). Talvolta è il sistema stesso che può generare questo segnale quando
per condizioni particolari il processo non può più essere eseguito neanche
per eseguire un gestore.
-\item[\const{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
+\item[\signal{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
terminale dell'utente si è disconnesso (ad esempio perché si è interrotta la
rete). Viene usato anche per riportare la terminazione del processo di
controllo di un terminale a tutti i processi della sessione, in modo che
predefinita è irrilevante, in quanto il loro uso presuppone sempre la
necessità di un gestore. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
+\item[\signal{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
usato dalla funzione \func{alarm}.
precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
processo.
-\item[\const{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
+\item[\signal{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
di un timer che misura sia il tempo di CPU speso direttamente dal processo
che quello che il sistema ha speso per conto di quest'ultimo. In genere
viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
generare questi segnali. L'azione predefinita è di essere ignorati. Questi
segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGIO}] Questo segnale viene inviato quando un file descriptor è
+\item[\signal{SIGIO}] Questo segnale viene inviato quando un file descriptor è
pronto per eseguire dell'input/output. In molti sistemi solo i
socket e i terminali possono generare questo segnale, in Linux
questo può essere usato anche per i file, posto che la \func{fcntl} abbia
avuto successo.
-\item[\const{SIGURG}] Questo segnale è inviato quando arrivano dei dati
+\item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati
urgenti o \itindex{out-of-band} \textit{out-of-band} su di un
socket; per maggiori dettagli al proposito si veda
sez.~\ref{sec:TCP_urgent_data}.
-\item[\const{SIGPOLL}] Questo segnale è equivalente a \const{SIGIO}, è
+\item[\signal{SIGPOLL}] Questo segnale è equivalente a \signal{SIGIO}, è
definito solo per compatibilità con i sistemi System V.
\end{basedescript}
loro uso è specializzato e viene trattato in maniera specifica nelle sezioni
in cui si trattano gli argomenti relativi. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
+\item[\signal{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
figlio termina o viene fermato. L'azione predefinita è di ignorare il
segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
-\item[\const{SIGCLD}] Per Linux questo è solo un segnale identico al
+\item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al
precedente, il nome è obsoleto e andrebbe evitato.
-\item[\const{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
+\item[\signal{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
usato per fare ripartire un programma precedentemente fermato da
- \const{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
+ \signal{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
ripartire il processo prima della sua consegna. Il comportamento predefinito
è di fare solo questo; il segnale non può essere bloccato. Si può anche
installare un gestore, ma il segnale provoca comunque il riavvio del
gestori per far si che un programma produca una qualche azione speciale
se viene fermato e riavviato, come per esempio riscrivere un prompt, o
inviare un avviso.
-\item[\const{SIGSTOP}] Il segnale ferma un processo (lo porta cioè in uno
+\item[\signal{SIGSTOP}] Il segnale ferma un processo (lo porta cioè in uno
stato di sleep, vedi sez.~\ref{sec:proc_sched}); il segnale non può essere né
intercettato, né ignorato, né bloccato.
-\item[\const{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
+\item[\signal{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
ferma il processo interattivamente, ed è generato dal carattere SUSP
(prodotto dalla combinazione \cmd{C-z}), ed al contrario di
- \const{SIGSTOP} può essere intercettato e ignorato. In genere un programma
+ \signal{SIGSTOP} può essere intercettato e ignorato. In genere un programma
installa un gestore per questo segnale quando vuole lasciare il sistema
o il terminale in uno stato definito prima di fermarsi; se per esempio un
programma ha disabilitato l'eco sul terminale può installare un gestore
per riabilitarlo prima di fermarsi.
-\item[\const{SIGTTIN}] Un processo non può leggere dal terminale se esegue una
+\item[\signal{SIGTTIN}] Un processo non può leggere dal terminale se esegue una
sessione di lavoro in \textit{background}. Quando un processo in background
tenta di leggere da un terminale viene inviato questo segnale a tutti i
processi della sessione di lavoro. L'azione predefinita è di fermare il
processo. L'argomento è trattato in
sez.~\ref{sec:sess_job_control_overview}.
-\item[\const{SIGTTOU}] Segnale analogo al precedente \const{SIGTTIN}, ma
+\item[\signal{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
generato quando si tenta di scrivere o modificare uno dei modi del
terminale. L'azione predefinita è di fermare il processo, l'argomento è
trattato in sez.~\ref{sec:sess_job_control_overview}.
resto del sistema. L'azione predefinita di questi segnali è di terminare il
processo, questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle pipe,
+\item[\signal{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle pipe,
(o delle FIFO o dei socket) è necessario, prima che un processo inizi a
scrivere su una di esse, che un altro l'abbia aperta in lettura (si veda
sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
lo ha causato fallisce, restituendo l'errore \errcode{EPIPE}.
-\item[\const{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
+\item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
segnale che viene generato quando si perde un advisory lock su un file su
NFS perché il server NFS è stato riavviato. Il progetto GNU lo utilizza per
indicare ad un client il crollo inaspettato di un server. In Linux è
- definito come sinonimo di \const{SIGIO}.\footnote{ed è segnalato come BUG
+ definito come sinonimo di \signal{SIGIO}.\footnote{ed è segnalato come BUG
nella pagina di manuale.}
-\item[\const{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
+\item[\signal{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
segnale è generato quando un processo eccede il limite impostato per il
tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}.
-\item[\const{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
+\item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
segnale è generato quando un processo tenta di estendere un file oltre le
dimensioni specificate dal limite impostato per le dimensioni massime di un
file, vedi sez.~\ref{sec:sys_resource_limit}.
Raccogliamo qui infine una serie di segnali che hanno scopi differenti non
classificabili in maniera omogenea. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{SIGUSR1}] Insieme a \const{SIGUSR2} è un segnale a disposizione
+\item[\signal{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
dell'utente che lo può usare per quello che vuole. Viene generato solo
attraverso l'invocazione della funzione \func{kill}. Entrambi i segnali
possono essere utili per implementare una comunicazione elementare fra
processi diversi, o per eseguire a richiesta una operazione utilizzando un
gestore. L'azione predefinita è di terminare il processo.
-\item[\const{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Vedi
- quanto appena detto per \const{SIGUSR1}.
-\item[\const{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
+\item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Vedi
+ quanto appena detto per \signal{SIGUSR1}.
+\item[\signal{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
programmi testuali per riformattare l'uscita su schermo quando si cambia
dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
-\item[\const{SIGINFO}] Il segnale indica una richiesta di informazioni. È
+\item[\signal{SIGINFO}] Il segnale indica una richiesta di informazioni. È
usato con il controllo di sessione, causa la stampa di informazioni da parte
del processo leader del gruppo associato al terminale di controllo, gli
altri processi lo ignorano.
Una modalità alternativa per utilizzare le descrizioni restituite da
\func{strsignal} e \func{psignal} è quello di usare la variabile
-\var{sys\_siglist}, che è definita in \file{signal.h} e può essere acceduta
-con la dichiarazione:
+\var{sys\_siglist}, che è definita in \headfile{signal.h} e può essere
+acceduta con la dichiarazione:
\includecodesnip{listati/siglist.c}
L'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione,
Si noti che questo vale solo per le azioni per le quali è stato installato un
gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a
\const{SIG\_IGN}. Questo permette ad esempio alla shell di impostare ad
-\const{SIG\_IGN} le risposte per \const{SIGINT} e \const{SIGQUIT} per i
+\const{SIG\_IGN} le risposte per \signal{SIGINT} e \signal{SIGQUIT} per i
programmi eseguiti in background, che altrimenti sarebbero interrotti da una
successiva pressione di \texttt{C-c} o \texttt{C-y}.
-Per quanto riguarda il comportamento di tutte le altre system call si danno
-sostanzialmente due casi, a seconda che esse siano \index{system~call~lente}
-\textsl{lente} (\textit{slow}) o \textsl{veloci} (\textit{fast}). La gran
-parte di esse appartiene a quest'ultima categoria, che non è influenzata
-dall'arrivo di un segnale. Esse sono dette \textsl{veloci} in quanto la loro
-esecuzione è sostanzialmente immediata; la risposta al segnale viene sempre
-data dopo che la system call è stata completata, in quanto attendere per
-eseguire un gestore non comporta nessun inconveniente.
+Per quanto riguarda il comportamento di tutte le altre \textit{system call} si
+danno sostanzialmente due casi, a seconda che esse siano
+\index{system~call~lente} \textsl{lente} (\textit{slow}) o \textsl{veloci}
+(\textit{fast}). La gran parte di esse appartiene a quest'ultima categoria,
+che non è influenzata dall'arrivo di un segnale. Esse sono dette
+\textsl{veloci} in quanto la loro esecuzione è sostanzialmente immediata; la
+risposta al segnale viene sempre data dopo che la \textit{system call} è stata
+completata, in quanto attendere per eseguire un gestore non comporta nessun
+inconveniente.
In alcuni casi però alcune system call (che per questo motivo vengono chiamate
\textsl{lente}) possono bloccarsi indefinitamente. In questo caso non si può
della funzione da chiamare all'occorrenza del segnale, può assumere anche i
due valori costanti \const{SIG\_IGN} e \const{SIG\_DFL}; il primo indica che
il segnale deve essere ignorato,\footnote{si ricordi però che i due segnali
- \const{SIGKILL} e \const{SIGSTOP} non possono essere né ignorati né
+ \signal{SIGKILL} e \signal{SIGSTOP} non possono essere né ignorati né
intercettati; l'uso di \const{SIG\_IGN} per questi segnali non ha alcun
effetto.} mentre il secondo ripristina l'azione predefinita.\footnote{e
serve a tornare al comportamento di default quando non si intende più
semantica inaffidabile; anche Linux seguiva questa convenzione con le vecchie
librerie del C come le \acr{libc4} e le \acr{libc5}.\footnote{nelle
\acr{libc5} esiste però la possibilità di includere \file{bsd/signal.h} al
- posto di \file{signal.h}, nel qual caso la funzione \func{signal} viene
+ posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} viene
ridefinita per seguire la semantica affidabile usata da BSD.}
Al contrario BSD segue la semantica affidabile, non disinstallando il gestore
\acr{glibc} dalla versione 2 anche Linux è passato a questo comportamento. Il
comportamento della versione originale della funzione, il cui uso è deprecato
per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto
-chiamando \func{sysv\_signal}, una volta che si sia definita la macro
+chiamando \funcm{sysv\_signal}, una volta che si sia definita la macro
\macro{\_XOPEN\_SOURCE}. In generale, per evitare questi problemi, l'uso di
\func{signal}, che tra l'altro ha un comportamento indefinito in caso di
processo \itindex{thread} multi-\textit{thread}, è da evitare; tutti i nuovi
programmi dovrebbero usare \func{sigaction}.
È da tenere presente che, seguendo lo standard POSIX, il comportamento di un
-processo che ignora i segnali \const{SIGFPE}, \const{SIGILL}, o
-\const{SIGSEGV} (qualora questi non originino da una chiamata ad una
+processo che ignora i segnali \signal{SIGFPE}, \signal{SIGILL}, o
+\signal{SIGSEGV} (qualora questi non originino da una chiamata ad una
\func{kill} o ad una \func{raise}) è indefinito. Un gestore che ritorna da
questi segnali può dare luogo ad un ciclo infinito.
non viene inviato nessun segnale, ma viene eseguito il controllo degli errori,
in tal caso si otterrà un errore \errcode{EPERM} se non si hanno i permessi
necessari ed un errore \errcode{ESRCH} se il processo specificato non esiste.
-Si tenga conto però che il sistema ricicla i \acr{pid} (come accennato in
+Si tenga conto però che il sistema ricicla i \ids{PID} (come accennato in
sez.~\ref{sec:proc_pid}) per cui l'esistenza di un processo non significa che
esso sia realmente quello a cui si intendeva mandare il segnale.
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- $>0$ & Il segnale è mandato al processo con il \acr{pid} indicato.\\
+ $>0$ & Il segnale è mandato al processo con il \ids{PID} indicato.\\
0 & Il segnale è mandato ad ogni processo del \itindex{process~group}
\textit{process group} del chiamante.\\
$-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
\end{table}
Solo l'amministratore può inviare un segnale ad un processo qualunque, in
-tutti gli altri casi l'user-ID reale o l'user-ID effettivo del processo
-chiamante devono corrispondere all'user-ID reale o all'user-ID salvato della
-destinazione. Fa eccezione il caso in cui il segnale inviato sia
-\const{SIGCONT}, nel quale occorre che entrambi i processi appartengano alla
+tutti gli altri casi l'\ids{UID} reale o l'\ids{UID} effettivo del processo
+chiamante devono corrispondere all'\ids{UID} reale o all'\ids{UID} salvato
+della destinazione. Fa eccezione il caso in cui il segnale inviato sia
+\signal{SIGCONT}, nel quale occorre che entrambi i processi appartengano alla
stessa sessione. Inoltre, dato il ruolo fondamentale che riveste nel sistema
(si ricordi quanto visto in sez.~\ref{sec:sig_termination}), non è possibile
inviare al processo 1 (cioè a \cmd{init}) segnali per i quali esso non abbia
\label{sec:sig_alarm_abort}
Un caso particolare di segnali generati a richiesta è quello che riguarda i
-vari segnali di temporizzazione e \const{SIGABRT}, per ciascuno di questi
+vari segnali di temporizzazione e \signal{SIGABRT}, per ciascuno di questi
segnali sono previste funzioni specifiche che ne effettuino l'invio. La più
comune delle funzioni usate per la temporizzazione è \funcd{alarm} il cui
prototipo è:
\begin{prototype}{unistd.h}{unsigned int alarm(unsigned int seconds)}
- Predispone l'invio di \const{SIGALRM} dopo \param{seconds} secondi.
+ Predispone l'invio di \signal{SIGALRM} dopo \param{seconds} secondi.
\bodydesc{La funzione restituisce il numero di secondi rimanenti ad un
precedente allarme, o zero se non c'erano allarmi pendenti.}
La funzione fornisce un meccanismo che consente ad un processo di predisporre
un'interruzione nel futuro, (ad esempio per effettuare una qualche operazione
dopo un certo periodo di tempo), programmando l'emissione di un segnale (nel
-caso in questione \const{SIGALRM}) dopo il numero di secondi specificato da
+caso in questione \signal{SIGALRM}) dopo il numero di secondi specificato da
\param{seconds}.
Se si specifica per \param{seconds} un valore nullo non verrà inviato nessun
\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
- l'emissione di \const{SIGALRM};
+ l'emissione di \signal{SIGALRM};
\item un \textit{virtual timer} che calcola il tempo di processore usato dal
processo in user space (che corrisponde all'\textit{user time}). La scadenza
- di questo timer provoca l'emissione di \const{SIGVTALRM};
+ di questo timer provoca l'emissione di \signal{SIGVTALRM};
\item un \textit{profiling timer} che calcola la somma dei tempi di processore
utilizzati direttamente dal processo in user space, e dal kernel nelle
system call ad esso relative (che corrisponde a quello che in
sez.~\ref{sec:sys_unix_time} abbiamo chiamato \textit{CPU time}). La scadenza
- di questo timer provoca l'emissione di \const{SIGPROF}.
+ di questo timer provoca l'emissione di \signal{SIGPROF}.
\end{itemize*}
Il timer usato da \func{alarm} è il \textit{clock time}, e corrisponde cioè al
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 mostrata in
+\cite{GlibcMan} che ne riporta la definizione mostrata in
fig.~\ref{fig:sig_alarm_def}.\footnote{questo comporta anche che non è il caso
di mescolare chiamate ad \func{abort} e a \func{setitimer}.}
L'ultima funzione che permette l'invio diretto di un segnale è \funcd{abort},
che, come accennato in sez.~\ref{sec:proc_termination}, permette di abortire
-l'esecuzione di un programma tramite l'invio di \const{SIGABRT}. Il suo
+l'esecuzione di un programma tramite l'invio di \signal{SIGABRT}. Il suo
prototipo è:
\begin{prototype}{stdlib.h}{void abort(void)}
Abortisce il processo corrente.
\bodydesc{La funzione non ritorna, il processo è terminato inviando il
- segnale di \const{SIGABRT}.}
+ segnale di \signal{SIGABRT}.}
\end{prototype}
La differenza fra questa funzione e l'uso di \func{raise} è che anche se il
aspettare.
In alcune implementazioni inoltre l'uso di \func{sleep} può avere conflitti
-con quello di \const{SIGALRM}, dato che la funzione può essere realizzata con
+con quello di \signal{SIGALRM}, dato che la funzione può essere realizzata con
l'uso di \func{pause} e \func{alarm} (in maniera analoga all'esempio che
vedremo in sez.~\ref{sec:sig_example}). In tal caso mescolare chiamata di
-\func{alarm} e \func{sleep} o modificare l'azione di \const{SIGALRM}, può
+\func{alarm} e \func{sleep} o modificare l'azione di \signal{SIGALRM}, può
causare risultati indefiniti. Nel caso delle \acr{glibc} è stata usata una
implementazione completamente indipendente e questi problemi non ci sono.
\end{prototype}
Anche questa funzione, a seconda delle implementazioni, può presentare
-problemi nell'interazione con \func{alarm} e \const{SIGALRM}. È pertanto
+problemi nell'interazione con \func{alarm} e \signal{SIGALRM}. È pertanto
deprecata in favore della funzione \funcd{nanosleep}, definita dallo standard
POSIX1.b, il cui prototipo è:
\begin{prototype}{unistd.h}{int nanosleep(const struct timespec *req, struct
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 \const{SIGALRM}. La funzione prende come argomenti
+interferenze con l'uso di \signal{SIGALRM}. La funzione prende come argomenti
delle strutture di tipo \struct{timespec}, la cui definizione è riportata in
fig.~\ref{fig:sys_timespec_struct}, che permette di specificare un tempo con
una precisione fino al nanosecondo.
\label{sec:sig_sigchld}
Un semplice esempio per illustrare il funzionamento di un gestore di segnale è
-quello della gestione di \const{SIGCHLD}. Abbiamo visto in
+quello della gestione di \signal{SIGCHLD}. Abbiamo visto in
sez.~\ref{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 SVr4 eredita la semantica di System V, in cui il
- segnale si chiama \const{SIGCLD} e viene trattato in maniera speciale; in
+ segnale si chiama \signal{SIGCLD} e viene trattato in maniera speciale; in
System V infatti se si imposta esplicitamente l'azione a \const{SIG\_IGN} il
- segnale non viene generato ed il sistema non genera \index{zombie} zombie
- (lo stato di terminazione viene scartato senza dover chiamare una
- \func{wait}). L'azione predefinita è 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 \const{SIGCLD} come sinonimo di
- \const{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo
+ segnale non viene generato ed il sistema non genera \itindex{zombie}
+ \textit{zombie} (lo stato di terminazione viene scartato senza dover
+ chiamare una \func{wait}). L'azione predefinita è 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 \signal{SIGCLD} come sinonimo di
+ \signal{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo
stato di uscita di un processo, si può completare la gestione della
-terminazione installando un gestore per \const{SIGCHLD} il cui unico compito
+terminazione installando un gestore per \signal{SIGCHLD} il cui unico compito
sia quello di chiamare \func{waitpid} per completare la procedura di
-terminazione in modo da evitare la formazione di \index{zombie} zombie.
+terminazione in modo da evitare la formazione di \itindex{zombie}
+\textit{zombie}.
In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una
-implementazione generica di una funzione di gestione per \const{SIGCHLD}, (che
-si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i test
-di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione
-\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come
-gestore di \const{SIGCHLD}) potremo verificare che non si ha più la creazione
-di \index{zombie} zombie.
+implementazione generica di una funzione di gestione per \signal{SIGCHLD},
+(che si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i
+test di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con
+l'opzione \cmd{-s} (che si limita ad effettuare l'installazione di questa
+funzione come gestore di \signal{SIGCHLD}) potremo verificare che non si ha
+più la creazione di \itindex{zombie} \textit{zombie}.
\begin{figure}[!htbp]
\footnotesize \centering
\end{minipage}
\normalsize
\caption{Codice di una funzione generica di gestione per il segnale
- \texttt{SIGCHLD}.}
+ \signal{SIGCHLD}.}
\label{fig:sig_sigchld_handl}
\end{figure}
i segnali successivi vengono ``\textsl{fusi}'' col primo ed al processo ne
viene recapitato soltanto uno.
-Questo può essere un caso comune proprio con \const{SIGCHLD}, qualora capiti
+Questo può essere un caso comune proprio con \signal{SIGCHLD}, qualora capiti
che molti processi figli terminino in rapida successione. Esso inoltre si
presenta tutte le volte che un segnale viene bloccato: per quanti siano i
segnali emessi durante il periodo di blocco, una volta che quest'ultimo sarà
Allora, nel caso della terminazione dei processi figli, se si chiamasse
\func{waitpid} una sola volta, essa leggerebbe lo stato di terminazione per un
solo processo, anche se i processi terminati sono più di uno, e gli altri
-resterebbero in stato di \index{zombie} zombie per un tempo indefinito.
+resterebbero in stato di \itindex{zombie} \textit{zombie} per un tempo
+indefinito.
Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non
ritorni un valore nullo, segno che non resta nessun processo di cui si debba
\label{fig:sig_sleep_wrong}
\end{figure}
-Dato che è nostra intenzione utilizzare \const{SIGALRM} il primo passo della
+Dato che è nostra intenzione utilizzare \signal{SIGALRM} il primo passo della
nostra implementazione sarà quello di installare il relativo gestore salvando
il precedente (\texttt{\small 14-17}). Si effettuerà poi una chiamata ad
\func{alarm} per specificare il tempo d'attesa per l'invio del segnale a cui
Infatti, se il processo viene interrotto fra la chiamata di \func{alarm} e
\func{pause}, può capitare (ad esempio se il sistema è molto carico) che il
tempo di attesa scada prima dell'esecuzione di quest'ultima, cosicché essa
-sarebbe eseguita dopo l'arrivo di \const{SIGALRM}. In questo caso ci si
+sarebbe eseguita dopo l'arrivo di \signal{SIGALRM}. In questo caso ci si
troverebbe di fronte ad un \itindex{deadlock} deadlock, in quanto \func{pause}
non verrebbe mai più interrotta (se non in caso di un altro segnale).
nel gestore un opportuno flag da controllare nel corpo principale del
programma (con un codice del tipo di quello riportato in
fig.~\ref{fig:sig_event_wrong}). La logica è quella di far impostare al
-gestore (\texttt{\small 14-19}) una variabile globale preventivamente
-inizializzata nel programma principale, il quale potrà determinare,
-osservandone il contenuto, l'occorrenza o meno del segnale, e prendere le
-relative azioni conseguenti (\texttt{\small 6-11}).
+gestore (\texttt{\small 14-19}) una \index{variabili!globali} variabile
+globale preventivamente inizializzata nel programma principale, il quale potrà
+determinare, osservandone il contenuto, l'occorrenza o meno del segnale, e
+prendere le relative azioni conseguenti (\texttt{\small 6-11}).
\begin{figure}[!htbp]
\footnotesize\centering
errore, nel qual caso \var{errno} assumerà i valori:
\begin{errlist}
\item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è
- cercato di installare il gestore per \const{SIGKILL} o
- \const{SIGSTOP}.
+ cercato di installare il gestore per \signal{SIGKILL} o
+ \signal{SIGSTOP}.
\item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
\end{errlist}}
\end{prototype}
fig.~\ref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
allarme avesse interrotto un altro gestore questo non sarebbe stato eseguito
correttamente; la cosa poteva essere prevenuta installando gli altri gestori
-usando \var{sa\_mask} per bloccare \const{SIGALRM} durante la loro esecuzione.
+usando \var{sa\_mask} per bloccare \signal{SIGALRM} durante la loro esecuzione.
Il valore di \var{sa\_flag} permette di specificare vari aspetti del
comportamento di \func{sigaction}, e della reazione del processo ai vari
segnali; i valori possibili ed il relativo significato sono riportati in
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{SA\_NOCLDSTOP}& Se il segnale è \const{SIGCHLD} allora non deve
+ \const{SA\_NOCLDSTOP}& Se il segnale è \signal{SIGCHLD} allora non deve
essere notificato quando il processo figlio viene
- fermato da uno dei segnali \const{SIGSTOP},
- \const{SIGTSTP}, \const{SIGTTIN} o
- \const{SIGTTOU}.\\
+ fermato da uno dei segnali \signal{SIGSTOP},
+ \signal{SIGTSTP}, \signal{SIGTTIN} o
+ \signal{SIGTTOU}.\\
\const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore
predefinito una volta che il gestore è stato
lanciato, riproduce cioè il comportamento della
gestore in forma estesa usando
\var{sa\_sigaction} al posto di
\var{sa\_handler}.\\
- \const{SA\_NOCLDWAIT}& Se il segnale è \const{SIGCHLD} allora i processi
- figli non diventano \textit{zombie} quando
- terminano.\footnotemark \\
+ \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} allora i processi
+ figli non diventano \itindex{zombie}
+ \textit{zombie} quando terminano.\footnotemark \\
\hline
\end{tabular}
\caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.}
rispettivamente attraverso i campi \var{sa\_sigaction} o
\var{sa\_handler},\footnote{i due campi devono essere usati in maniera
alternativa, in certe implementazioni questi campi vengono addirittura
- definiti come \ctyp{union}.} Quest'ultima è quella classica usata anche con
+ definiti come \direct{union}.} Quest'ultima è quella classica usata anche con
\func{signal}, mentre la prima permette di usare un gestore più complesso, in
grado di ricevere informazioni più dettagliate dal sistema, attraverso la
struttura \struct{siginfo\_t}, riportata in fig.~\ref{fig:sig_siginfo_t}.
Nel caso di alcuni segnali però il valore di \var{si\_code} viene usato per
fornire una informazione specifica relativa alle motivazioni della ricezione
-dello stesso; ad esempio i vari segnali di errore (\const{SIGILL},
-\const{SIGFPE}, \const{SIGSEGV} e \const{SIGBUS}) lo usano per fornire
+dello stesso; ad esempio i vari segnali di errore (\signal{SIGILL},
+\signal{SIGFPE}, \signal{SIGSEGV} e \signal{SIGBUS}) lo usano per fornire
maggiori dettagli riguardo l'errore, come il tipo di errore aritmetico, di
istruzione illecita o di violazione di memoria; mentre alcuni segnali di
-controllo (\const{SIGCHLD}, \const{SIGTRAP} e \const{SIGPOLL}) forniscono
+controllo (\signal{SIGCHLD}, \signal{SIGTRAP} e \signal{SIGPOLL}) forniscono
altre informazioni specifiche.
\begin{table}[!htb]
messaggi POSIX (vedi
sez.~\ref{sec:ipc_posix_mq}).\footnotemark\\
\const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi
- sez.~\ref{sec:file_asyncronous_access}) è stata
+ sez.~\ref{sec:file_asyncronous_io}) è stata
completata.\\
- \const{SI\_SIGIO} & segnale di \const{SIGIO} da una coda (vedi
+ \const{SI\_SIGIO} & segnale di \signal{SIGIO} da una coda (vedi
sez.~\ref{sec:file_asyncronous_operation}).\\
\const{SI\_TKILL} & inviato da \func{tkill} o \func{tgkill} (vedi
sez.~\ref{cha:threads_xxx}).\footnotemark\\
\hline
\end{tabular}
\caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
- impostati rispettivamente dai segnali \const{SIGILL}, \const{SIGFPE},
- \const{SIGSEGV}, \const{SIGBUS}, \const{SIGCHLD}, \const{SIGTRAP} e
- \const{SIGPOLL}/\const{SIGIO}.}
+ impostati rispettivamente dai segnali \signal{SIGILL}, \signal{SIGFPE},
+ \signal{SIGSEGV}, \signal{SIGBUS}, \signal{SIGCHLD}, \signal{SIGTRAP} e
+ \signal{SIGPOLL}/\signal{SIGIO}.}
\label{tab:sig_si_code_special}
\end{table}
-Il resto della struttura \struct{siginfo\_t} è definito come \ctyp{union} ed i
-valori eventualmente presenti dipendono dal segnale, così \const{SIGCHLD} ed i
+Il resto della struttura \struct{siginfo\_t} è definito come \direct{union} ed i
+valori eventualmente presenti dipendono dal segnale, così \signal{SIGCHLD} ed i
segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) inviati tramite
\func{kill} avvalorano \var{si\_pid} e \var{si\_uid} coi valori corrispondenti
-al processo che ha emesso il segnale, \const{SIGCHLD} avvalora anche i campi
+al processo che ha emesso il segnale, \signal{SIGCHLD} avvalora anche i campi
\var{si\_status}, \var{si\_utime} e \var{si\_stime} che indicano
rispettivamente lo stato di uscita, l'\textit{user time} e il \textit{system
time} (vedi sez.~\ref{sec:sys_cpu_times}) usati dal processo;
-\const{SIGILL}, \const{SIGFPE}, \const{SIGSEGV} e \const{SIGBUS} avvalorano
-\var{si\_addr} con l'indirizzo in cui è avvenuto l'errore, \const{SIGIO} (vedi
+\signal{SIGILL}, \signal{SIGFPE}, \signal{SIGSEGV} e \signal{SIGBUS} avvalorano
+\var{si\_addr} con l'indirizzo in cui è avvenuto l'errore, \signal{SIGIO} (vedi
sez.~\ref{sec:file_asyncronous_io}) avvalora \var{si\_fd} con il numero del
file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti
(vedi sez.~\ref{sec:TCP_urgent_data}) su un socket, il segnale inviato alla
Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta
l'esempio di implementazione di \code{sleep}. Abbiamo accennato in
sez.~\ref{sec:sig_sigaction} come con \func{sigaction} sia possibile bloccare
-\const{SIGALRM} nell'installazione dei gestori degli altri segnali, per poter
+\signal{SIGALRM} nell'installazione dei gestori degli altri segnali, per poter
usare l'implementazione vista in fig.~\ref{fig:sig_sleep_incomplete} senza
interferenze. Questo però comporta una precauzione ulteriore al semplice uso
della funzione, vediamo allora come usando la nuova interfaccia è possibile
programma messo in attesa.
La prima parte della funzione (\texttt{\small 6-10}) provvede ad installare
-l'opportuno gestore per \const{SIGALRM}, salvando quello originario, che
+l'opportuno gestore per \signal{SIGALRM}, salvando quello originario, che
sarà ripristinato alla conclusione della stessa (\texttt{\small 23}); il passo
-successivo è quello di bloccare \const{SIGALRM} (\texttt{\small 11-14}) per
+successivo è quello di bloccare \signal{SIGALRM} (\texttt{\small 11-14}) per
evitare che esso possa essere ricevuto dal processo fra l'esecuzione di
\func{alarm} (\texttt{\small 16}) e la sospensione dello stesso. Nel fare
questo si salva la maschera corrente dei segnali, che sarà ripristinata alla
fine (\texttt{\small 22}), e al contempo si prepara la maschera dei segnali
-\var{sleep\_mask} per riattivare \const{SIGALRM} all'esecuzione di
+\var{sleep\_mask} per riattivare \signal{SIGALRM} all'esecuzione di
\func{sigsuspend}.
In questo modo non sono più possibili \itindex{race~condition} \textit{race
- condition} dato che \const{SIGALRM} viene disabilitato con
+ condition} dato che \signal{SIGALRM} viene disabilitato con
\func{sigprocmask} fino alla chiamata di \func{sigsuspend}. Questo metodo è
assolutamente generale e può essere applicato a qualunque altra situazione in
cui si deve attendere per un segnale, i passi sono sempre i seguenti:
\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{poll}, \funcm{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{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{sigprocmask}, \func{sigqueue}, \funcm{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},
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.
+il gestore per impostare il valore di una qualche \index{variabili!globali}
+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.
\section{Funzionalità avanzate}
In particolare i campi utilizzati dai segnali \textit{real-time} sono
\var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il
-\acr{pid} e l'user-ID effettivo del processo che ha inviato il segnale, mentre
+\ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale, mentre
per la restituzione dei dati viene usato il campo \var{si\_value}.
\begin{figure}[!htb]
\label{fig:sig_sigval}
\end{figure}
-Questo è una \ctyp{union} di tipo \struct{sigval} (la sua definizione è in
+Questo è una \direct{union} di tipo \struct{sigval} (la sua definizione è in
fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico,
se usata nella forma \var{sival\_int}, o un indirizzo, se usata nella forma
\var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
-vari meccanismi di notifica\footnote{un campo di tipo \struct{sigval\_t} è
+vari meccanismi di notifica\footnote{un campo di tipo \type{sigval\_t} è
presente anche nella struttura \struct{sigevent} (definita in
fig.~\ref{fig:struct_sigevent}) che viene usata dai meccanismi di notifica
come quelli per i timer POSIX (vedi sez.~\ref{sec:sig_timer_adv}), l'I/O
\const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una
dimensione variabile; fino alla versione 2.6.7 c'era un limite massimo globale
che poteva essere impostato come parametro del kernel in
-\procfile{/proc/sys/kernel/rtsig-max};\footnote{ed il valore predefinito era
+\sysctlfile{kernel/rtsig-max};\footnote{ed il valore predefinito era
pari a 1024.} a partire dal kernel 2.6.8 il valore globale è stato rimosso e
sostituito dalla risorsa \const{RLIMIT\_SIGPENDING} associata al singolo
utente, che può essere modificata con \func{setrlimit} come illustrato in
Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la
macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale
di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i
-programmi che le usano devono essere collegati con la libreria delle estensioni
-\textit{real-time} usando esplicitamente l'opzione \texttt{-lrt}. Si tenga
-presente inoltre che la disponibilità di queste funzionalità avanzate può
-essere controllato dalla definizione della macro \macro{\_POSIX\_TIMERS} ad un
-valore maggiore di 0, e che le ulteriori macro
+programmi che le usano devono essere collegati con la libreria delle
+estensioni \textit{real-time} usando esplicitamente l'opzione
+\texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste
+funzionalità avanzate può essere controllato dalla definizione della macro
+\macro{\_POSIX\_TIMERS} ad un valore maggiore di 0, e che le ulteriori macro
\macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e
\macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi
di tipo \const{CLOCK\_MONOTONIC}, \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
\const{CLOCK\_PROCESS\_CPUTIME\_ID}.\footnote{tutte queste macro sono definite
- in \texttt{unistd.h}, che pertanto deve essere incluso per poterle
+ in \headfile{unistd.h}, che pertanto deve essere incluso per poterle
controllarle.} Infine se il kernel ha il supporto per gli \textit{high
resolution timer} un elenco degli orologi e dei timer può essere ottenuto
tramite il file \procfile{/proc/timer\_list}.
}
\end{functions}
-
% TODO, dal 2.6.39 aggiunta clock_adjtime
+% TODO manca clock_nanosleep
Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile
ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in
\label{fig:struct_sigevent}
\end{figure}
-La struttura \struct{sigevent} (accessibile includendo \texttt{time.h}) è
+La struttura \struct{sigevent} (accessibile includendo \headfile{time.h}) è
riportata in fig.~\ref{fig:struct_sigevent};\footnote{la definizione effettiva
dipende dall'implementazione, quella mostrata è la versione descritta nella
- pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è il
-più importante essendo quello che indica le modalità della notifica, gli altri
-dipendono dal valore che si è specificato per \var{sigev\_notify}, si sono
-riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del meccanismo di
-notifica viene fatta impostando uno dei valori di
+ pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è
+il più importante essendo quello che indica le modalità della notifica, gli
+altri dipendono dal valore che si è specificato per \var{sigev\_notify}, si
+sono riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del
+meccanismo di notifica viene fatta impostando uno dei valori di
tab.~\ref{tab:sigevent_sigev_notify} per \var{sigev\_notify}, e fornendo gli
eventuali ulteriori argomenti necessari a secondo della scelta
effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione
segnale è stato installato con
\const{SA\_SIGINFO} gli verrà restituito il
valore specificato con \var{sigev\_value} (una
- \ctyp{union} \texttt{sigval}, la cui definizione
+ \direct{union} \texttt{sigval}, la cui definizione
è in fig.~\ref{fig:sig_sigval}) come valore del
campo \var{si\_value} di \struct{siginfo\_t}.\\
\const{SIGEV\_THREAD} & La notifica viene effettuata creando un nuovo
argomento l'indirizzo di una di queste strutture per indicare le modalità con
cui si vuole essere notificati della scadenza del timer, se non si specifica
nulla (passando un valore \val{NULL}) verrà inviato il segnale
-\const{SIGALRM} al processo corrente, o per essere più precisi verrà
+\signal{SIGALRM} al processo corrente, o per essere più precisi verrà
utilizzato un valore equivalente all'aver specificato \const{SIGEV\_SIGNAL}
-per \var{sigev\_notify}, \const{SIGALRM} per \var{sigev\_signo} e
+per \var{sigev\_notify}, \signal{SIGALRM} per \var{sigev\_signo} e
l'identificatore del timer come valore per \var{sigev\_value.sival\_int}.
Il terzo argomento deve essere l'indirizzo di una variabile di tipo
(la cui definizione è riportata fig.~\ref{fig:sys_timespec_struct}). Il campo
\var{it\_value} indica la prima scadenza dell'allarme. Di default, quando il
valore di \param{flags} è nullo, questo valore viene considerato come un
-intervallo relativo al tempo corrente,\footnote{il primo allarme scatterà cioè
- dopo il numero di secondi e nanosecondi indicati da questo campo.} se invece
-si usa per \param{flags} il valore \const{TIMER\_ABSTIME},\footnote{al momento
- questo è l'unico valore valido per \param{flags}.} \var{it\_value} viene
-considerato come un valore assoluto rispetto al valore usato dall'orologio a
-cui è associato il timer.\footnote{quindi a seconda dei casi lo si potrà
- indicare o come un tempo assoluto, quando si opera rispetto all'orologio di
- sistema (nel qual caso il valore deve essere in secondi e nanosecondi dalla
- \textit{epoch}) o come numero di secondi o nanosecondi rispetto alla
- partenza di un orologio di CPU, quando si opera su uno di questi.} Infine
-un valore nullo di \var{it\_value}\footnote{per nullo si intende con valori
- nulli per entrambi i i campi \var{tv\_sec} e \var{tv\_nsec}.} può essere
-utilizzato, indipendentemente dal tipo di orologio utilizzato, per disarmare
-l'allarme.
+intervallo relativo al tempo corrente, il primo allarme scatterà cioè dopo il
+numero di secondi e nanosecondi indicati da questo campo. Se invece si usa
+per \param{flags} il valore \const{TIMER\_ABSTIME}, che al momento è l'unico
+valore valido per \param{flags}, allora \var{it\_value} viene considerato come
+un valore assoluto rispetto al valore usato dall'orologio a cui è associato il
+timer.\footnote{quindi a seconda dei casi lo si potrà indicare o come un tempo
+ assoluto, quando si opera rispetto all'orologio di sistema (nel qual caso il
+ valore deve essere in secondi e nanosecondi dalla \textit{epoch}) o come
+ numero di secondi o nanosecondi rispetto alla partenza di un orologio di
+ CPU, quando si opera su uno di questi.} Infine un valore nullo di
+\var{it\_value}, dover per nullo si intende con valori nulli per entrambi i
+campi \var{tv\_sec} e \var{tv\_nsec}, può essere utilizzato, indipendentemente
+dal tipo di orologio utilizzato, per disarmare l'allarme.
Il campo \var{it\_interval} di \struct{itimerspec} viene invece utilizzato per
-impostare un allarme periodico. Se il suo valore è nullo (se cioè sono nulli
-tutti e due i valori di detta struttura \struct{timespec}) l'allarme scatterà
-una sola volta secondo quando indicato con \var{it\_value}, altrimenti il
-valore specificato verrà preso come l'estensione del periodo di ripetizione
-della generazione dell'allarme, che proseguirà indefinitamente fintanto che
-non si disarmi il timer.
+impostare un allarme periodico. Se il suo valore è nullo, se cioè sono nulli
+tutti e due i due campi \var{tv\_sec} e \var{tv\_nsec} di detta struttura
+\struct{timespec}, l'allarme scatterà una sola volta secondo quando indicato
+con \var{it\_value}, altrimenti il valore specificato nella struttura verrà
+preso come l'estensione del periodo di ripetizione della generazione
+dell'allarme, che proseguirà indefinitamente fintanto che non si disarmi il
+timer.
Se il timer era già stato armato la funzione sovrascrive la precedente
impostazione, se invece si indica come prima scadenza un tempo già passato,
\end{enumerate*}
In genere il primo passo viene effettuato allocando un'opportuna area di
-memoria con \code{malloc}; in \file{signal.h} sono definite due costanti,
+memoria con \code{malloc}; in \headfile{signal.h} sono definite due costanti,
\const{SIGSTKSZ} e \const{MINSIGSTKSZ}, che possono essere utilizzate per
allocare una quantità di spazio opportuna, in modo da evitare overflow. La
prima delle due è la dimensione canonica per uno \itindex{stack}
standard o di superamento di un limite (vedi
sez.~\ref{sec:sys_resource_limit}) imposto con chiamate del tipo
\code{setrlimit(RLIMIT\_STACK, \&rlim)}. In tal caso infatti si avrebbe un
-segnale di \const{SIGSEGV}, che potrebbe essere gestito soltanto avendo
+segnale di \signal{SIGSEGV}, che potrebbe essere gestito soltanto avendo
abilitato uno \itindex{stack} \textit{stack} alternativo.
Si tenga presente che le funzioni chiamate durante l'esecuzione sullo
\func{longjmp}.
+% TODO: se e quando si troverà un argomento adeguato inserire altre funzioni
+% sparse attinenti ai segnali, al momento sono note solo:
+% * sigreturn (funzione interna, scarsamente interessante)
+% argomento a priorità IDLE (fare quando non resta niente altro da trattare)
% LocalWords: kernel POSIX timer shell control ctrl kill raise signal handler