X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=ae4c057b0bc8e840034f83e3325a8977710ff491;hp=400f689bded9ec25c821e43ed85522f779161e76;hb=dcf2c2df897955ff3503a7c426025457ab456fd7;hpb=986894c4d6a1bce56a1e24893e9f4322782fcd4e diff --git a/signal.tex b/signal.tex index 400f689..ae4c057 100644 --- a/signal.tex +++ b/signal.tex @@ -1,6 +1,6 @@ %% 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", @@ -103,9 +103,9 @@ viene perso (se l'impostazione predefinita era quello di ignorarlo) o la terminazione immediata del processo; in entrambi i casi l'azione prevista non verrà eseguita. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/unreliable_sig.c} \end{minipage} \normalsize @@ -230,7 +230,7 @@ i segnali successivi alla nuova specificazione saranno notificati). 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: @@ -282,12 +282,12 @@ di identificarli, e le funzioni che ne stampano la descrizione. 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 @@ -352,59 +352,59 @@ cui viene salvata un'immagine della memoria del processo (il cosiddetto 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.} @@ -440,19 +440,19 @@ che viene scritto in un file \file{core} nella directory corrente del processo 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 @@ -463,7 +463,7 @@ programma al momento della terminazione. Questi segnali sono: \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 @@ -472,20 +472,20 @@ programma al momento della terminazione. Questi segnali sono: È 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} @@ -508,18 +508,18 @@ periferica). 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 @@ -533,22 +533,22 @@ segnali sono: \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 @@ -569,7 +569,7 @@ causare la terminazione del programma, ma con questi segnali la scelta 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}. @@ -577,7 +577,7 @@ necessità di un gestore. Questi segnali sono: 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 @@ -593,18 +593,18 @@ questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a 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} @@ -616,16 +616,16 @@ Questi sono i segnali usati dal controllo delle sessioni e dei processi, il 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 @@ -637,27 +637,27 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: 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}. @@ -673,23 +673,23 @@ che impediscono il completamento dell'esecuzione dovute all'interazione con il 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}. @@ -702,20 +702,20 @@ processo, questi segnali sono: 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. @@ -751,8 +751,8 @@ La seconda funzione, \funcd{psignal}, deriva da BSD ed è analoga alla funzione 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, @@ -802,18 +802,19 @@ 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 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ò @@ -917,7 +918,7 @@ L'argomento \param{handler} che indica il gestore invece, oltre all'indirizzo 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ù @@ -937,7 +938,7 @@ primi Unix in cui il gestore viene disinstallato alla sua chiamata, secondo la 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 @@ -945,15 +946,15 @@ e bloccando il segnale durante l'esecuzione dello stesso. Con l'utilizzo delle \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. @@ -1014,7 +1015,7 @@ specificare il segnale nullo. Se la funzione viene chiamata con questo valore 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. @@ -1050,7 +1051,7 @@ Una seconda funzione che può essere definita in termini di \func{kill} è \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}).\\ @@ -1064,10 +1065,10 @@ Una seconda funzione che può essere definita in termini di \func{kill} è \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 @@ -1085,12 +1086,12 @@ segnale al processo che ha effettuato la chiamata. \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.} @@ -1099,7 +1100,7 @@ prototipo è: 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 @@ -1118,15 +1119,15 @@ 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 - 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 @@ -1188,7 +1189,7 @@ questo modo il ciclo verrà ripetuto; se invece il valore di \var{it\_interval} \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/itimerval.h} \end{minipage} \normalsize @@ -1207,7 +1208,7 @@ fig.~\ref{fig:sig_alarm_def}.\footnote{questo comporta anche che non è il caso \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/alarm_def.c} \end{minipage} \normalsize @@ -1266,14 +1267,14 @@ valore corrente di un timer senza modificarlo, è possibile usare la funzione 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 @@ -1342,10 +1343,10 @@ termine per l'attesa, e ricalcolare tutte le volte il numero di secondi da 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. @@ -1366,7 +1367,7 @@ seguono quella di SUSv2 che prevede il seguente prototipo: \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 @@ -1387,7 +1388,7 @@ POSIX1.b, il cui prototipo è: 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. @@ -1432,39 +1433,40 @@ precisione disponibile sull'hardware della propria macchina. \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. - -\begin{figure}[!htb] +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 - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/hand_sigchild.c} \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} @@ -1486,7 +1488,7 @@ generazione di ulteriori segnali dello stesso tipo. In questo caso normalmente 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à @@ -1495,7 +1497,8 @@ rimosso verrà recapitato un solo segnale. 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 @@ -1531,9 +1534,9 @@ questo può sembrare di implementazione immediata; ad esempio una semplice versione di \func{sleep} potrebbe essere quella illustrata in fig.~\ref{fig:sig_sleep_wrong}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/sleep_danger.c} \end{minipage} \normalsize @@ -1541,7 +1544,7 @@ fig.~\ref{fig:sig_sleep_wrong}. \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 @@ -1558,7 +1561,7 @@ presenta una pericolosa \itindex{race~condition} \textit{race condition}. 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). @@ -1568,9 +1571,9 @@ uscire dal gestore; in questo modo, con una condizione sullo stato di uscita di quest'ultima, si può evitare la chiamata a \func{pause}, usando un codice del tipo di quello riportato in fig.~\ref{fig:sig_sleep_incomplete}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/sleep_defect.c} \end{minipage} \normalsize @@ -1598,14 +1601,14 @@ qualche forma di evento; in genere quello che si fa in questo caso è impostare 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}[!htb] +\begin{figure}[!htbp] \footnotesize\centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/sig_alarm.c} \end{minipage} \normalsize @@ -1720,8 +1723,8 @@ da un processo. Il suo prototipo è: 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} @@ -1751,7 +1754,7 @@ più usato. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/sigaction.h} \end{minipage} \normalsize @@ -1772,7 +1775,7 @@ dell'implementazione di \code{sleep} mostrata in 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 @@ -1786,11 +1789,11 @@ tab.~\ref{tab:sig_sa_flag}. \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 @@ -1813,9 +1816,9 @@ tab.~\ref{tab:sig_sa_flag}. 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}.} @@ -1836,7 +1839,7 @@ specificare, a seconda dell'uso o meno del flag \const{SA\_SIGINFO}, 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}. @@ -1851,7 +1854,7 @@ causato l'emissione del segnale. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/siginfo_t.h} \end{minipage} \normalsize @@ -1869,11 +1872,11 @@ in questo caso sono riportati in tab.~\ref{tab:sig_si_code_generic}. 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] @@ -1896,7 +1899,7 @@ altre informazioni specifiche. \const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_access}) è 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\\ @@ -1973,22 +1976,22 @@ cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome \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 @@ -2012,9 +2015,9 @@ che in certi sistemi questi possono essere diversi. In definitiva dunque, a meno che non si sia vincolati all'aderenza stretta allo standard ISO C, è sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}. -\begin{figure}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15.6cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/Signal.c} \end{minipage} \normalsize @@ -2155,16 +2158,16 @@ sospensione del processo lo standard POSIX ha previsto la funzione 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 ottenere un'implementazione, riportata in fig.~\ref{fig:sig_sleep_ok} che non presenta neanche questa necessità. -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15.6cm} +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/sleep.c} \end{minipage} \normalsize @@ -2179,18 +2182,18 @@ non esegue nessuna operazione, limitandosi a ritornare per interrompere il 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: @@ -2260,7 +2263,7 @@ lista riportata in fig.~\ref{fig:sig_safe_functions}. \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}, @@ -2268,7 +2271,7 @@ lista riportata in fig.~\ref{fig:sig_safe_functions}. \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}, @@ -2309,10 +2312,11 @@ ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}. 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} @@ -2419,12 +2423,12 @@ fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa. 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] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/sigval_t.h} \end{minipage} \normalsize @@ -2433,11 +2437,11 @@ per la restituzione dei dati viene usato il campo \var{si\_value}. \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 @@ -2492,7 +2496,7 @@ Secondo lo standard POSIX la profondità della coda è indicata dalla costante \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 @@ -2696,21 +2700,24 @@ tab.~\ref{tab:sig_timer_clockid_types}. % TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il % funzionamento, vedi http://lwn.net/Articles/429595/ -% TODO, dal 2.6.39 anche CLOCK_BOOTTIME, vedi http://lwn.net/Articles/432757/ +% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME, vedi +% http://lwn.net/Articles/429925/ +% TODP: dal 3.0 anche i cosiddetti Posix Alarm Timers, con +% CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/ 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}. @@ -2874,8 +2881,8 @@ l'orologio associato ad un \textit{thread} invece che a un processo, è } \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 @@ -2931,7 +2938,7 @@ meccanismo di notifica. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/sigevent.h} \end{minipage} \normalsize @@ -2940,14 +2947,14 @@ meccanismo di notifica. \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 @@ -2969,7 +2976,7 @@ 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 @@ -3005,9 +3012,9 @@ Nel caso di \func{timer\_create} occorrerà passare alla funzione come secondo 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 @@ -3061,7 +3068,7 @@ state allocate. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/itimerspec.h} \end{minipage} \normalsize @@ -3255,7 +3262,7 @@ procedura: \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} @@ -3298,7 +3305,7 @@ restituito dalla funzione per un successivo ripristino). \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/stack_t.h} \end{minipage} \normalsize @@ -3326,7 +3333,7 @@ segnali quando si teme di avere problemi di esaurimento dello \textit{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 @@ -3385,6 +3392,10 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a \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