From: Simone Piccardi Date: Tue, 1 May 2012 14:52:13 +0000 (+0000) Subject: Reviosione segnali e riferimenti vari. Piu' qualche punto mancante X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=90b50663eb332777d4bcab79324215d97d923aa7;p=gapil.git Reviosione segnali e riferimenti vari. Piu' qualche punto mancante nelle tabelle. --- diff --git a/filedir.tex b/filedir.tex index b88d34b..6b85246 100644 --- a/filedir.tex +++ b/filedir.tex @@ -5534,8 +5534,8 @@ tab.~\ref{tab:acl_type}. \textbf{Tipo} & \textbf{Descrizione} \\ \hline \hline - \const{ACL\_TYPE\_ACCESS} & indica una ACL di accesso.\\ - \const{ACL\_TYPE\_DEFAULT}& indica una ACL di default.\\ + \const{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\ + \const{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\ \hline \end{tabular} \caption{Le costanti che identificano il tipo di ACL.} diff --git a/fileio.tex b/fileio.tex index 6c0a30e..883e829 100644 --- a/fileio.tex +++ b/fileio.tex @@ -178,7 +178,7 @@ tab.~\ref{tab:file_std_files}. \itindex{standard~output} \textit{standard output}.\\ \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard - error}\\ + error}.\\ \hline \end{tabular} \caption{Costanti definite in \headfile{unistd.h} per i file standard.} @@ -495,7 +495,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il e viene emulata, per questo possono verificarsi \itindex{race~condition} \textit{race condition} con una sovrapposizione dei dati se - più di un processo scrive allo stesso tempo. \\ + più di un processo scrive allo stesso tempo.\\ \const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi sez.~\ref{sec:signal_driven_io}). Quando è impostato viene generato il segnale \signal{SIGIO} @@ -805,8 +805,8 @@ posizione corrente nel file con \code{lseek(fd, 0, SEEK\_CUR)}. porta alla fine del file se non ci sono \textit{hole} dopo \param{offset} (dal kernel 3.1).\\ \hline - \end{tabular} \caption{Possibili valori per l'argomento \param{whence} di - \func{lseek}.} + \end{tabular} + \caption{Possibili valori per l'argomento \param{whence} di \func{lseek}.} \label{tab:lseek_whence_values} \end{table} @@ -3595,7 +3595,7 @@ specificati in questo ordine: \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \val{\#} & Chiede la conversione in forma alternativa. \\ + \val{\#} & Chiede la conversione in forma alternativa.\\ \val{0} & La conversione è riempita con zeri alla sinistra del valore.\\ \val{-} & La conversione viene allineata a sinistra sul bordo del campo.\\ \val{' '}& Mette uno spazio prima di un numero con segno di valore diff --git a/intro.tex b/intro.tex index 443cd33..f802851 100644 --- a/intro.tex +++ b/intro.tex @@ -1037,18 +1037,18 @@ possono recuperare varie (e di norma piuttosto intricate) informazioni è \textbf{Standard} & \textbf{IEEE} & \textbf{ISO} & \textbf{Contenuto} \\ \hline \hline - POSIX.1 & 1003.1 & 9945-1& Interfacce di base \\ - POSIX.1a& 1003.1a& 9945-1& Estensioni a POSIX.1 \\ - POSIX.2 & 1003.2 & 9945-2& Comandi \\ - POSIX.3 & 2003 &TR13210& Metodi di test \\ - POSIX.4 & 1003.1b & --- & Estensioni real-time \\ - POSIX.4a& 1003.1c & --- & \itindex{thread} Thread \\ - POSIX.4b& 1003.1d &9945-1& Ulteriori estensioni real-time \\ - POSIX.5 & 1003.5 & 14519& Interfaccia per il linguaggio ADA \\ - POSIX.6 & 1003.2c,1e& 9945-2& Sicurezza \\ - POSIX.8 & 1003.1f& 9945-1& Accesso ai file via rete \\ - POSIX.9 & 1003.9 & --- & Interfaccia per il Fortran-77 \\ - POSIX.12& 1003.1g& 9945-1& Socket \\ + POSIX.1 & 1003.1 & 9945-1& Interfacce di base. \\ + POSIX.1a& 1003.1a& 9945-1& Estensioni a POSIX.1. \\ + POSIX.2 & 1003.2 & 9945-2& Comandi. \\ + POSIX.3 & 2003 &TR13210& Metodi di test. \\ + POSIX.4 & 1003.1b & --- & Estensioni real-time. \\ + POSIX.4a& 1003.1c & --- & \itindex{thread} Thread. \\ + POSIX.4b& 1003.1d &9945-1& Ulteriori estensioni real-time. \\ + POSIX.5 & 1003.5 & 14519& Interfaccia per il linguaggio ADA. \\ + POSIX.6 & 1003.2c,1e& 9945-2& Sicurezza. \\ + POSIX.8 & 1003.1f& 9945-1& Accesso ai file via rete. \\ + POSIX.9 & 1003.9 & --- & Interfaccia per il Fortran-77. \\ + POSIX.12& 1003.1g& 9945-1& Socket. \\ \hline \end{tabular} \caption{Elenco dei vari standard POSIX e relative denominazioni.} diff --git a/ipc.tex b/ipc.tex index 81ca6a8..458c8fa 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2067,6 +2067,10 @@ vengono effettuate con la funzione \funcd{semop}, il cui prototipo è: } \end{functions} + +%TODO manca semtimedop, trattare qui, referenziata in +%sez.~\ref{sec:sig_gen_beha}. + La funzione permette di eseguire operazioni multiple sui singoli semafori di un insieme. La funzione richiede come primo argomento l'identificatore \param{semid} dell'insieme su cui si vuole operare. Il numero di operazioni da diff --git a/process.tex b/process.tex index 2e06276..407c39c 100644 --- a/process.tex +++ b/process.tex @@ -1966,22 +1966,22 @@ queste ed ulteriori variabili si può ottenere con il comando \cmd{man 7 & \textbf{Linux} & \textbf{Descrizione} \\ \hline \hline - \texttt{USER} &$\bullet$&$\bullet$&$\bullet$& Nome utente\\ - \texttt{LOGNAME}&$\bullet$&$\bullet$&$\bullet$& Nome di login\\ + \texttt{USER} &$\bullet$&$\bullet$&$\bullet$& Nome utente.\\ + \texttt{LOGNAME}&$\bullet$&$\bullet$&$\bullet$& Nome di login.\\ \texttt{HOME} &$\bullet$&$\bullet$&$\bullet$& Directory base - dell'utente\\ - \texttt{LANG} &$\bullet$&$\bullet$&$\bullet$& Localizzazione\\ + dell'utente.\\ + \texttt{LANG} &$\bullet$&$\bullet$&$\bullet$& Localizzazione.\\ \texttt{PATH} &$\bullet$&$\bullet$&$\bullet$& Elenco delle directory - dei programmi\\ - \texttt{PWD} &$\bullet$&$\bullet$&$\bullet$& Directory corrente\\ - \texttt{SHELL} &$\bullet$&$\bullet$&$\bullet$& Shell in uso\\ - \texttt{TERM} &$\bullet$&$\bullet$&$\bullet$& Tipo di terminale\\ + dei programmi.\\ + \texttt{PWD} &$\bullet$&$\bullet$&$\bullet$& Directory corrente.\\ + \texttt{SHELL} &$\bullet$&$\bullet$&$\bullet$& Shell in uso.\\ + \texttt{TERM} &$\bullet$&$\bullet$&$\bullet$& Tipo di terminale.\\ \texttt{PAGER} &$\bullet$&$\bullet$&$\bullet$& Programma per vedere i - testi\\ - \texttt{EDITOR} &$\bullet$&$\bullet$&$\bullet$& Editor preferito\\ - \texttt{BROWSER}&$\bullet$&$\bullet$&$\bullet$& Browser preferito\\ + testi.\\ + \texttt{EDITOR} &$\bullet$&$\bullet$&$\bullet$& Editor preferito.\\ + \texttt{BROWSER}&$\bullet$&$\bullet$&$\bullet$& Browser preferito.\\ \texttt{TMPDIR} &$\bullet$&$\bullet$&$\bullet$& Directory dei file - temporanei\\ + temporanei.\\ \hline \end{tabular} \caption{Esempi delle variabili di ambiente più comuni definite da vari diff --git a/prochand.tex b/prochand.tex index d82076e..f9a48c0 100644 --- a/prochand.tex +++ b/prochand.tex @@ -2571,7 +2571,7 @@ l'utente correnti. \hline \const{PRIO\_PROCESS} & \type{pid\_t} & processo \\ \const{PRIO\_PRGR} & \type{pid\_t} & \itindex{process~group} - \textit{process group} \\ + \textit{process group}\\ \const{PRIO\_USER} & \type{uid\_t} & utente \\ \hline \end{tabular} @@ -2774,9 +2774,9 @@ corrente. \const{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\ \const{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione ulteriore di lavoro \textit{CPU - intensive} (dal kernel 2.6.16)\\ + intensive} (dal kernel 2.6.16).\\ \const{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente - bassa (dal kernel 2.6.23)\\ + bassa (dal kernel 2.6.23).\\ \hline \end{tabular} \caption{Valori dell'argomento \param{policy} per la funzione diff --git a/signal.tex b/signal.tex index 6e1579b..357526d 100644 --- a/signal.tex +++ b/signal.tex @@ -55,17 +55,13 @@ il seguente: \item la scadenza di un timer o di un allarme; \item il tentativo di effettuare un'operazione di input/output che non può essere eseguita; -\item una richiesta dell'utente di terminare o fermare il programma. In genere - si realizza attraverso un segnale mandato dalla shell in corrispondenza - della pressione di tasti del terminale come \code{C-c} o - \code{C-z};\footnote{indichiamo con \code{C-x} la pressione simultanea al - tasto \code{x} del tasto control (ctrl in molte tastiere).} -\item l'esecuzione di una \func{kill} o di una \func{raise} da parte del - processo stesso o di un altro (solo nel caso della \func{kill}). +\item una richiesta dell'utente dal terminale di terminare o fermare il + programma. +\item l'invio esplicito da parte del processo stesso o di un altro. \end{itemize*} -Ciascuno di questi eventi (compresi gli ultimi due che pure sono controllati -dall'utente o da un altro processo) comporta l'intervento diretto da parte del +Ciascuno di questi eventi, compresi gli ultimi due che pure sono controllati +dall'utente o da un altro processo, comporta l'intervento diretto da parte del kernel che causa la generazione di un particolare tipo di segnale. Quando un processo riceve un segnale, invece del normale corso del programma, @@ -154,6 +150,14 @@ consente di cambiare l'azione per il segnale prima che esso venga consegnato, e si può usare la funzione \func{sigpending} (vedi sez.~\ref{sec:sig_sigmask}) per determinare quali segnali sono bloccati e quali sono pendenti. +Infine occorre precisare che i segnali predatano il supporto per i +\textit{thread} e vengono sempre inviati al processo come insieme, cosa che +può creare incertezza nel caso questo sia multi-\textit{thread}. In tal caso +quando è possibile determinare quale è il \textit{thread} specifico che deve +ricevere il segnale, come avviene per i segnali di errore, questo sarà inviato +solo a lui, altrimenti sarà inviato a discrezione del kernel ad uno qualunque +dei \textit{thread} del processo che possa riceverlo (che cioè non blocchi il +segnale), torneremo sull'argomento in sez.~\ref{sec:thread_signal}. \subsection{Tipi di segnali} \label{sec:sig_types} @@ -177,8 +181,9 @@ ingresso, scadenze di un timer, terminazione di processi figli, la pressione dei tasti di stop o di suspend su un terminale. Una richiesta esplicita significa l'uso da parte di un programma delle -apposite funzioni di sistema (in sostanza \func{kill} o \func{raise}) per la -generazione ``\textsl{manuale}'' di un segnale. +apposite funzioni di sistema, come \func{kill} ed affini (vedi +sez.~\ref{sec:sig_kill_raise}) per la generazione ``\textsl{manuale}'' di un +segnale. Si dice poi che i segnali possono essere \textsl{asincroni} o \textsl{sincroni}. Un segnale \textsl{sincrono} è legato ad una azione @@ -260,7 +265,11 @@ Nel caso non sia stata specificata un'azione, viene utilizzata la cosiddetta azione predefinita che, come vedremo in sez.~\ref{sec:sig_standard}, è propria di ciascun segnale. Nella maggior parte dei casi questa azione comporta la terminazione immediata del processo, ma per alcuni segnali che rappresentano -eventi innocui l'azione predefinita è di essere ignorati. +eventi innocui l'azione predefinita è di essere ignorati. Inoltre esistono +alcuni segnali la cui azione è semplicemente quella di fermare l'esecuzione +del programma, vale a dire portarlo nello stato di \textit{stopped} (lo stato +\texttt{T}, si ricordi tab.~\ref{tab:proc_proc_states} e quanto illustrato in +sez.~\ref{sec:proc_sched}). Quando un segnale termina un processo il padre può determinare la causa della terminazione esaminandone lo stato di uscita così come viene riportato dalle @@ -268,15 +277,29 @@ funzioni \func{wait} e \func{waitpid} (vedi sez.~\ref{sec:proc_wait}). Questo ad esempio è il modo in cui la shell determina i motivi della terminazione di un programma e scrive un eventuale messaggio di errore. +\itindbeg{core~dump} + I segnali che rappresentano errori del programma (divisione per zero o violazioni di accesso) hanno come ulteriore caratteristica della loro azione -di default quella di scrivere un file chiamato \itindex{core~dump} -\textit{core dump}. Si tratta di un file binario che registra lo stato del -processo, ed in particolare della memoria e dello \itindex{stack} -\textit{stack}, prima della terminazione. Questo file può essere esaminato in -un secondo tempo con un apposito programma (un \textit{debugger} come -\cmd{gdb}) per investigare sulla causa dell'errore. Lo stesso avviene se i -suddetti segnali vengono generati con la funzione \func{kill}. +predefinita, oltre a terminare il processo, quella di scrivere nella directory +di lavoro corrente del processo di un file \file{core} su cui viene salvata +l'immagine della memoria del processo. + +Questo file costituisce il cosiddetto \textit{core dump}, e contenendo +l'immagine della memoria del processo, consente di risalire allo stato dello +\itindex{stack} \textit{stack} (vedi sez.~\ref{sec:proc_mem_layout}) prima +della terminazione. Questo permette di esaminare il contenuto del file un +secondo tempo con un apposito programma (un \textit{debugger} come \cmd{gdb}) +per investigare sulla causa dell'errore, ed in particolare, grazie appunto ai +dati dello \itindex{stack} \textit{stack}, consente di identificare quale +funzione ha causato l'errore. + +Si tenga presente che il \textit{core dump} viene creato non solo in caso di +errore effettivo, ma anche se il segnale per cui la sua creazione è prevista +nell'azione dell'azione predefinita viene inviato al programma con una delle +funzioni \func{kill}, \func{raise}, ecc. + +\itindend{core~dump} \section{La classificazione dei segnali} @@ -293,7 +316,7 @@ che ne stampano la descrizione. Ciascun segnale è identificato dal kernel con un numero, ma benché per alcuni segnali questi numeri siano sempre gli stessi, tanto da essere usati come -sinomini, l'uso diretto degli identificativi numerici da parte dei programmi è +sinonimi, l'uso diretto degli identificativi numerici da parte dei programmi è comunque da evitare, in quanto essi non sono mai stati standardizzati e possono variare a seconda dell'implementazione del sistema, e nel caso di Linux anche a seconda della architettura hardware e della versione del kernel. @@ -312,53 +335,53 @@ esse sono definite nell'header di sistema \headfile{signal.h}. \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\ \hline \hline - \signal{SIGHUP} &P & A & Hangup o terminazione del processo di - controllo. \\ - \signal{SIGINT} &PA& A & Interrupt da tastiera (\cmd{C-c}). \\ - \signal{SIGQUIT} &P & C & Quit da tastiera (\cmd{C-y}). \\ - \signal{SIGILL} &PA & C & Istruzione illecita. \\ - \signal{SIGTRAP} &S & C & Trappole per un Trace/breakpoint. \\ - \signal{SIGABRT} &PA & C & Segnale di abort da \func{abort}. \\ - \signal{SIGIOT} &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\ - \signal{SIGBUS} &S & C & Errore sul bus (bad memory access). \\ - \signal{SIGFPE} &P & C & Errore aritmetico. \\ - \signal{SIGKILL} &P &AEF& Segnale di terminazione forzata. \\ - \signal{SIGUSR1} &P & A & Segnale utente numero 1. \\ - \signal{SIGSEGV} &P & C & Errore di accesso in memoria. \\ - \signal{SIGUSR2} &P & A & Segnale utente numero 2. \\ - \signal{SIGPIPE} &P & A & Pipe spezzata. \\ - \signal{SIGALRM} &P & A & Segnale del timer da \func{alarm}. \\ - \signal{SIGTERM} &P & A & Segnale di terminazione \texttt{C-\bslash}. \\ - \signal{SIGSTKFLT}& & A & Errore sullo stack del coprocessore. \\ - \signal{SIGCHLD} &P & B & Figlio terminato o fermato. \\ - \signal{SIGCONT} &P & & Continua se fermato. \\ - \signal{SIGSTOP} &P &DEF& Ferma il processo. \\ - \signal{SIGTSTP} &P & D & Pressione del tasto di stop sul terminale. \\ - \signal{SIGTTIN} &P & D & Input sul terminale per un processo - in background. \\ - \signal{SIGTTOU} &P & D & Output sul terminale per un processo - in background. \\ - \signal{SIGURG} &SB& B & Ricezione di una \textit{urgent condition} su - un socket. \\ - \signal{SIGXCPU} &SB& C & Ecceduto il limite sul tempo di CPU. \\ - \signal{SIGXFSZ} &SB& C & Ecceduto il limite sulla dimensione dei file.\\ - \signal{SIGVTALRM}&SB& A & Timer di esecuzione scaduto. \\ - \signal{SIGPROF} &S & A & Timer del profiling scaduto. \\ - \signal{SIGWINCH} &B & B & Finestra ridimensionata (4.3 BSD, Sun). \\ - \signal{SIGIO} &B & A & L'I/O è possibile (4.2 BSD). \\ - \signal{SIGPOLL} &S & A & \textit{Pollable event} (Sys V); - Sinonimo di \signal{SIGIO}. \\ - \signal{SIGPWR} & & A & Fallimento dell'alimentazione. \\ - \signal{SIGSYS} &S & C & \textit{sistem call} sbagliata (SVID).\\ - \signal{SIGUNUSED}& & A & Segnale inutilizzato (sinonimo di - \signal{SIGSYS}). \\ + \signal{SIGHUP} &P & T & Hangup o terminazione del processo di + controllo.\\ + \signal{SIGINT} &PA& T & Interrupt da tastiera (\cmd{C-c}).\\ + \signal{SIGQUIT} &P & C & Quit da tastiera (\cmd{C-y}).\\ + \signal{SIGILL} &PA& C & Istruzione illecita.\\ + \signal{SIGTRAP} &S & C & Trappole per un Trace/breakpoint.\\ + \signal{SIGABRT} &PA& C & Segnale di abort da \func{abort}.\\ + \signal{SIGIOT} &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\ + \signal{SIGBUS} &BS& C & Errore sul bus (bad memory access).\\ + \signal{SIGFPE} &AP& C & Errore aritmetico.\\ + \signal{SIGKILL} &P & T& Segnale di terminazione forzata.\\ + \signal{SIGUSR1} &P & T & Segnale utente numero 1.\\ + \signal{SIGSEGV} &AP& C & Errore di accesso in memoria.\\ + \signal{SIGUSR2} &P & T & Segnale utente numero 2.\\ + \signal{SIGPIPE} &P & T & Pipe spezzata.\\ + \signal{SIGALRM} &P & T & Segnale del timer da \func{alarm}.\\ + \signal{SIGTERM} &AP& T & Segnale di terminazione (\texttt{C-\bslash}).\\ + \signal{SIGCHLD} &P & I & Figlio terminato o fermato.\\ + \signal{SIGCONT} &P &-- & Continua se fermato.\\ + \signal{SIGSTOP} &P & S & Ferma il processo.\\ + \signal{SIGTSTP} &P & S & Pressione del tasto di stop sul terminale.\\ + \signal{SIGTTIN} &P & S & Input sul terminale per un processo + in background.\\ + \signal{SIGTTOU} &P & S & Output sul terminale per un processo + in background.\\ + \signal{SIGURG} &BS& I & Ricezione di una \textit{urgent condition} su + un socket.\\ + \signal{SIGXCPU} &BS& C & Ecceduto il limite sul tempo di CPU.\\ + \signal{SIGXFSZ} &BS& C & Ecceduto il limite sulla dimensione dei file.\\ + \signal{SIGVTALRM}&BS& T& Timer di esecuzione scaduto.\\ + \signal{SIGPROF} &BS& T & Timer del profiling scaduto.\\ + \signal{SIGWINCH}&B & I & Finestra ridimensionata (4.3BSD, Sun).\\ + \signal{SIGIO} &B & T & L'I/O è possibile.\\ + \signal{SIGPOLL} &VS& T & \textit{Pollable event}, sinonimo di + \signal{SIGIO}.\\ + \signal{SIGPWR} &V & T & Fallimento dell'alimentazione.\\ + \signal{SIGSYS} &VS& C & \textit{system call} sbagliata.\\ \hline - \signal{SIGCLD} & & & Sinonimo di \signal{SIGCHLD}. \\ - \signal{SIGEMT} & & & Trappola di emulatore \\ - \signal{SIGINFO} & & & Sinonimo di \signal{SIGPWR}. \\ - \signal{SIGLOST} &-- & & Perso un lock sul file, sinonimo - di \signal{SIGIO}.\\ - + \signal{SIGSTKFLT}&?& T & Errore sullo stack del coprocessore (inusato).\\ + \signal{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di + \signal{SIGSYS}).\\ + \hline + \signal{SIGCLD} &V & I & Sinonimo di \signal{SIGCHLD}.\\ + \signal{SIGEMT} &V & C & Trappola di emulatore.\\ + \signal{SIGINFO} &B & T & Sinonimo di \signal{SIGPWR}.\\ + \signal{SIGLOST} &? & T & Perso un lock sul file, sinonimo + di \signal{SIGIO} (inusato).\\ \hline \end{tabular} \caption{Lista dei segnali ordinari in Linux.} @@ -366,17 +389,24 @@ esse sono definite nell'header di sistema \headfile{signal.h}. \end{table} In tab.~\ref{tab:sig_signal_list} si è riportato l'elenco completo dei segnali -definiti su Linux per tutte le possibili architetture. Ma si tenga presente -che alcuni di questi (quelli nella sezione finale della tabella) non esistono -sull'architettura PC, ma sono definiti sulle architetture \textit{alpha} o -\textit{mips}. - -Dato che alcuni segnali erano previsti fin dallo standard ANSI C, e che i -segnali sono presenti in tutti i sistemi unix-like, con differenze dovute alle -implementazioni ed all'uso degli stessi la seconda colonna della tabella -riporta con altrettante lettere gli standard in cui ciascun segnale è stato -definito, da interpretare secondo la legenda di -tab.~\ref{tab:sig_standard_leg}. +ordinari definiti su Linux per tutte le possibili architetture (tratteremo +quelli \textit{real-time} in sez.~\ref{sec:sig_real_time}). Ma si tenga +presente che solo quelli elencati nella prima sezione della tabella sono +presenti su tutte le architetture. Nelle sezioni successive si sono riportati +rispettivamente quelli che esistono solo sull'architettura PC e quelli che non +esistono sull'architettura PC, ma sono definiti sulle architetture +\textit{alpha} o \textit{mips}. + +Alcuni segnali erano previsti fin dallo standard ANSI C, ed i segnali sono +presenti in tutti i sistemi unix-like, ma l'elenco di quelli disponibili non è +uniforme, ed alcuni di essi sono presenti solo su alcune implementazioni o +architetture hardware, ed anche il loro significato può variare. Per questo si +sono riportati nella seconda colonna della tabella riporta gli standard in cui +ciascun segnale è stato definito, indicati con altrettante lettere da +interpretare secondo la legenda di tab.~\ref{tab:sig_standard_leg}. Si tenga +presente che il significato dei segnali è abbastanza indipendente dalle +implementazioni solo per quelli definiti negli standard POSIX.1-1990 e +POSIX.1-2001. \begin{table}[htb] \footnotesize @@ -386,11 +416,12 @@ tab.~\ref{tab:sig_standard_leg}. \textbf{Sigla} & \textbf{Standard} \\ \hline \hline - P & POSIX.1-1990\\ - B & BSD (4.2 BSD e Sun)\\ - A & ANSI C\\ - S & SUSv2 (e POSIX.1-2001)\\ - V & System V\\ + P & POSIX.1-1990.\\ + B & BSD (4.2 BSD e Sun).\\ + A & ANSI C.\\ + S & SUSv2 (e POSIX.1-2001).\\ + V & System V.\\ + ? & Ignoto.\\ \hline \end{tabular} \caption{Legenda dei valori degli standard riportati nella seconda colonna @@ -398,27 +429,13 @@ tab.~\ref{tab:sig_standard_leg}. \label{tab:sig_standard_leg} \end{table} - Come accennato in sez.~\ref{sec:sig_notification} a ciascun segnale è associata una specifica azione predefinita che viene eseguita quando nessun -gestore è installato. Anche queste sono riportate in -tab.~\ref{tab:sig_signal_list} nella terza colonna, di nuovo identificate con -delle lettere, la cui legenda completa è illustrate in -tab.~\ref{tab:sig_action_leg}). Nella stessa colonna si sono indicate anche, -le condizioni specifiche dei segnali che non possono essere intercettati o -ignorati. - -Si noti come \const{SIGCONT} sia l'unico segnale a non avere una -azione predefinita, in quanto il suo unico effetto è quello di far ripartire -un programma fermato da un segnale di stop. - -In alcuni casi alla terminazione del processo è associata la creazione di un -file (posto nella directory corrente del processo e chiamato \file{core}) su -cui viene salvata un'immagine della memoria del processo (il cosiddetto -\itindex{core~dump} \textit{core dump}), che può essere usata da un debugger -per esaminare lo stato dello \itindex{stack} \textit{stack} e delle variabili -al momento della ricezione del segnale. - +gestore è installato. Le azioni predefinite possibili, che abbiamo già +descritto in sez.~\ref{sec:sig_notification}, sono state riportate in +tab.~\ref{tab:sig_signal_list} nella terza colonna, e di nuovo sono state +indicate con delle lettere la cui legenda completa è illustrata in +tab.~\ref{tab:sig_action_leg}). \begin{table}[htb] \footnotesize @@ -428,13 +445,11 @@ al momento della ricezione del segnale. \textbf{Sigla} & \textbf{Significato} \\ \hline \hline - A & L'azione predefinita è terminare il processo.\\ - B & L'azione predefinita è ignorare il segnale.\\ + T & L'azione predefinita è terminare il processo.\\ C & L'azione predefinita è terminare il processo e scrivere un \itindex{core~dump} \textit{core dump}.\\ - D & L'azione predefinita è fermare il processo.\\ - E & Il segnale non può essere intercettato.\\ - F & Il segnale non può essere ignorato.\\ + I & L'azione predefinita è ignorare il segnale.\\ + S & L'azione predefinita è fermare il processo.\\ \hline \end{tabular} \caption{Legenda delle azioni predefinite dei segnali riportate nella terza @@ -443,23 +458,32 @@ al momento della ricezione del segnale. \end{table} -Il numero totale di segnali presenti è dato dalla macro \const{NSIG}, e dato -che i numeri dei segnali sono allocati progressivamente, essa corrisponde -anche al successivo del valore numerico assegnato all'ultimo segnale definito. +Si inoltre noti come \const{SIGCONT} sia l'unico segnale a non avere +l'indicazione di una azione predefinita nella terza colonna di +tab.~\ref{tab:sig_signal_list}, questo perché il suo effetto è sempre quello +di far ripartire un programma in stato \texttt{T} fermato da un segnale di +stop. Inoltre i segnali \const{SIGSTOP} e \const{SIGKILL} si distinguono da +tutti gli altri per la specifica caratteristica di non potere essere né +intercettati, né bloccati, né ignorati. -La descrizione dettagliata del significato dei vari segnali, raggruppati per -tipologia, verrà affrontata nei paragrafi successivi. +Il numero totale di segnali presenti è dato dalla macro \const{NSIG} (e tiene +conto anche di quelli \textit{real-time}) e dato che i numeri dei segnali sono +allocati progressivamente, essa corrisponde anche al successivo del valore +numerico assegnato all'ultimo segnale definito. La descrizione dettagliata +del significato dei precedenti segnali, raggruppati per tipologia, verrà +affrontata nei paragrafi successivi. -\subsection{Segnali di errore di programma} +\subsection{I segnali di errore} \label{sec:sig_prog_error} Questi segnali sono generati quando il sistema, o in certi casi direttamente -l'hardware (come per i \itindex{page~fault} \textit{page fault} non validi) -rileva un qualche errore insanabile nel programma in esecuzione. In generale -la generazione di questi segnali significa che il programma ha dei gravi -problemi (ad esempio ha dereferenziato un puntatore non valido o ha eseguito -una operazione aritmetica proibita) e l'esecuzione non può essere proseguita. +l'hardware (come per i \itindex{page~fault} \textit{page fault} non validi o +le eccezioni del processore) rileva un qualche errore insanabile nel programma +in esecuzione. In generale la generazione di questi segnali significa che il +programma ha dei gravi problemi (ad esempio ha dereferenziato un puntatore non +valido o ha eseguito una operazione aritmetica proibita) e l'esecuzione non +può essere proseguita. In genere si intercettano questi segnali per permettere al programma di terminare in maniera pulita, ad esempio per ripristinare le impostazioni della @@ -471,10 +495,9 @@ gestore non ci fosse stato. L'azione predefinita per tutti questi segnali è causare la terminazione del processo che li ha causati. In genere oltre a questo il segnale provoca pure -la registrazione su disco di un file di \itindex{core~dump} \textit{core dump} -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: +la registrazione su disco di un file di \itindex{core~dump} \textit{core + dump}, che un debugger può usare per ricostruire lo stato del programma al +momento della terminazione. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\signal{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome derivi da \textit{floating point exception} si applica a tutti gli errori @@ -499,31 +522,40 @@ 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[\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 protezione della memoria che si accorge dell'errore ed il kernel genera il - segnale. Se il gestore ritorna il comportamento del processo è indefinito. + segnale. È tipico ottenere questo segnale dereferenziando un puntatore + nullo o non inizializzato leggendo al di là della fine di un vettore. Se il + gestore ritorna il comportamento del processo è indefinito. - È tipico ottenere questo segnale dereferenziando un puntatore nullo o non - inizializzato leggendo al di là della fine di un vettore. \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 \signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente - (tipo fuori dallo heap o dallo \itindex{stack} \textit{stack}), mentre - \signal{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso di - un puntatore non allineato. -\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. + (al di fuori dallo \itindex{heap} \textit{heap} o dallo \itindex{stack} + \textit{stack}), mentre \signal{SIGBUS} indica l'accesso ad un indirizzo non + valido, come nel caso di un puntatore non allineato. + +\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[\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[\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. + richiede l'esecuzione di una \textit{system call}, ma si è fornito un codice + sbagliato per quest'ultima. + +\item[\signal{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non + è previsto da nessuno standard ed è definito solo su alcune architetture che + come il vecchio PDP11 prevedono questo tipo di interruzione, non è presente + sui normali PC. \end{basedescript} @@ -534,40 +566,38 @@ Questo tipo di segnali sono usati per terminare un processo; hanno vari nomi a causa del differente uso che se ne può fare, ed i programmi possono trattarli in maniera differente. -La ragione per cui può essere necessario trattare questi segnali è che il +La ragione per cui può essere necessario intercettare questi segnali è che il programma può dover eseguire una serie di azioni di pulizia prima di terminare, come salvare informazioni sullo stato in cui si trova, cancellare file temporanei, o ripristinare delle condizioni alterate durante il funzionamento (come il modo del terminale o le impostazioni di una qualche -periferica). - -L'azione predefinita di questi segnali è di terminare il processo, questi -segnali sono: +periferica). L'azione predefinita di questi segnali è di terminare il +processo, questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale - generico usato per causare la conclusione di un programma. Al contrario di - \signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si - usa per chiedere in maniera ``\textsl{educata}'' ad un processo di + generico usato per causare la conclusione di un programma. È quello che + viene generato di default dal comando \cmd{kill}. Al contrario di + \signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo + si usa per chiedere in maniera ``\textsl{educata}'' ad un processo di concludersi. \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}). + dall'invio sul terminale del carattere di controllo ``\textit{INTR}'', + \textit{interrupt} appunto, che viene generato normalmente dalla sequenza + \cmd{C-c} sulla tastiera. \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 - creazione di un \itindex{core~dump} \textit{core dump}. - + controllato da un altro carattere di controllo, ``\textit{QUIT}'', + corrispondente alla sequenza \texttt{C-\bslash} sulla tastiera. A differenza + del precedente l'azione predefinita, oltre alla terminazione del processo, + comporta anche la creazione di un \itindex{core~dump} \textit{core dump}. In genere lo si può pensare come corrispondente ad una condizione di errore del programma rilevata dall'utente. Per questo motivo non è opportuno fare eseguire al gestore di questo segnale le operazioni di pulizia normalmente previste (tipo la cancellazione di file temporanei), dato che in certi casi esse possono eliminare informazioni utili nell'esame dei \itindex{core~dump} \textit{core dump}. - \item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata qualunque programma. Questo segnale non può essere né intercettato, né @@ -585,14 +615,15 @@ segnali sono: per eseguire un gestore. \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 - essi possano disconnettersi dal relativo terminale. - - Viene inoltre usato in genere per segnalare ai demoni (che non hanno un - terminale di controllo) la necessità di reinizializzarsi e rileggere il/i - file di configurazione. + 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 (vedi + sez.~\ref{sec:sess_job_control}), in modo che essi possano disconnettersi + dal relativo terminale. Viene inoltre usato in genere per segnalare ai + programmi di servizio (i cosiddetti \textsl{demoni}, vedi + sez.~\ref{sec:sess_daemon}), che non hanno un terminale di controllo, la + necessità di reinizializzarsi e rileggere il file (o i file) di + configurazione. \end{basedescript} @@ -630,9 +661,9 @@ generare questi segnali. L'azione predefinita è di essere ignorati. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \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 + 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 chiamata a \func{fcntl} che lo attiva abbia avuto successo. \item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati @@ -640,8 +671,9 @@ segnali sono: socket; per maggiori dettagli al proposito si veda sez.~\ref{sec:TCP_urgent_data}. -\item[\signal{SIGPOLL}] Questo segnale è equivalente a \signal{SIGIO}, è - definito solo per compatibilità con i sistemi System V. +\item[\signal{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001, + ed è equivalente a \signal{SIGIO} che invece deriva da BSD. Su Linux è + definito per compatibilità con i sistemi System V. \end{basedescript} @@ -657,7 +689,8 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}. \item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al - precedente, il nome è obsoleto e andrebbe evitato. + precedente e definito come sinonimo. Il nome è obsoleto, deriva dalla + definizione del segnale su System V, ed oggi deve essere evitato. \item[\signal{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene usato per fare ripartire un programma precedentemente fermato da @@ -673,30 +706,32 @@ 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[\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[\signal{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta + cioè nello stato \textit{stopped} (vedi sez.~\ref{sec:proc_sched}). Il + segnale non può essere né intercettato, né ignorato, né bloccato. \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 - \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[\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 + ferma il processo interattivamente, ed è generato dal carattere + ``\textit{SUSP}'', prodotto dalla combinazione di tasti \cmd{C-z}, ed al + contrario di \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[\signal{SIGTTIN}] Un processo non può leggere dal terminale se esegue + una sessione di lavoro in \textit{background}. Quando un processo in + \textit{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[\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}. + generato quando si tenta di scrivere sul terminale o modificarne uno dei + modi con un processo in \textit{background}. L'azione predefinita è di + fermare il processo, l'argomento è trattato in + sez.~\ref{sec:sess_job_control_overview}. \end{basedescript} @@ -706,8 +741,8 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: Questi segnali sono usati per riportare al programma errori generati da operazioni da lui eseguite; non indicano errori del programma quanto errori 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: +resto del sistema. L'azione predefinita di questi segnali è normalmente +quella di terminare il processo, questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \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 @@ -716,19 +751,27 @@ processo, questi segnali sono: 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[\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 \signal{SIGIO}.\footnote{ed è segnalato come BUG - nella pagina di manuale.} + \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}. + tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}. Fino al + kernel 2.2 terminava semplicemente il processo, a partire dal kernel 2.4, + seguendo le indicazioni dello standard POSIX.1-2001 viene anche generato un + \itindex{core~dump} \textit{core dump}. + \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}. + file, vedi sez.~\ref{sec:sys_resource_limit}. Fino al kernel 2.2 terminava + semplicemente il processo, a partire dal kernel 2.4, seguendo le indicazioni + dello standard POSIX.1-2001 viene anche generato un \itindex{core~dump} + \textit{core dump}. + +\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 \signal{SIGIO} e non viene più usato. \end{basedescript} @@ -744,8 +787,8 @@ classificabili in maniera omogenea. Questi segnali sono: 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[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Vedi - quanto appena detto per \signal{SIGUSR1}. +\item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per + il suo utilizzo vale esattamente 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 @@ -754,7 +797,17 @@ classificabili in maniera omogenea. Questi segnali sono: \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. + altri processi lo ignorano. Su Linux però viene utilizzato come sinonimo di + \signal{SIGPWR} e l'azione predefinita è di terminare il processo. +\item[\signal{SIGPWR}] Il segnale indica un cambio nello stato di + alimentazione di un eventuale gruppo di continuità e viene usato + principalmente per segnalare l'assenza ed il ritorno della corrente. Viene + usato principalmente con \cmd{init} per attivare o fermare le procedure di + spegnimento automatico all'esaurimento delle batterie. L'azione predefinita + è di terminare il processo. +\item[\signal{SIGSTKFLT}] Indica un errore nello stack del coprocessore + matematico, è definito solo per le architetture PC, ma è completamente + inusato. L'azione predefinita è di terminare il processo. \end{basedescript} @@ -762,33 +815,56 @@ classificabili in maniera omogenea. Questi segnali sono: \label{sec:sig_strsignal} Per la descrizione dei segnali il sistema mette a disposizione due funzioni -che stampano un messaggio di descrizione dato il numero. In genere si usano -quando si vuole notificare all'utente il segnale ricevuto (nel caso di -terminazione di un processo figlio o di un gestore che gestisce più segnali); -la prima funzione, \funcd{strsignal}, è una estensione GNU, accessibile avendo -definito \macro{\_GNU\_SOURCE}, ed è analoga alla funzione \func{strerror} (si -veda sez.~\ref{sec:sys_strerror}) per gli errori: -\begin{prototype}{string.h}{char *strsignal(int signum)} - Ritorna il puntatore ad una stringa che contiene la descrizione del segnale - \param{signum}. -\end{prototype} -\noindent dato che la stringa è allocata staticamente non se ne deve -modificare il contenuto, che resta valido solo fino alla successiva chiamata -di \func{strsignal}. Nel caso si debba mantenere traccia del messaggio sarà -necessario copiarlo. +che stampano un messaggio di descrizione specificando il numero del segnale +con una delle costanti di tab.~\ref{tab:sig_signal_list}. In genere si usano +quando si vuole notificare all'utente il segnale ricevuto, ad esempio nel caso +di terminazione di un processo figlio o di un gestore che gestisce più +segnali. + +La prima funzione, \funcd{strsignal}, è una estensione GNU fornita dalla +\acr{glibc}, ed è accessibile solo avendo definito la macro +\macro{\_GNU\_SOURCE}, il suo comportamento è analogo a quello della funzione +\func{strerror} (si veda sez.~\ref{sec:sys_strerror}) usata per notificare gli +errori: + +\begin{funcproto}{ +\fhead{string.h} +\fdecl{char *strsignal(int signum)} +\fdesc{Ottiene la descrizione di un segnale.} +} + +{La funzione ritorna puntatore ad una stringa che descrive il segnale, non + sono previste condizioni di errore ed \var{errno} non viene modificata.} +\end{funcproto} + + +La funzione ritorna sempre il puntatore ad una stringa che contiene la +descrizione del segnale indicato dall'argomento \param{signum}, se questo non +indica un segnale valido viene restituito il puntatore ad una stringa che +segnale che il valore indicato non è valido. Dato che la stringa è allocata +staticamente non se ne deve modificare il contenuto, che resta valido solo +fino alla successiva chiamata di \func{strsignal}. Nel caso si debba mantenere +traccia del messaggio sarà necessario copiarlo. La seconda funzione, \funcd{psignal}, deriva da BSD ed è analoga alla funzione -\func{perror} descritta sempre in sez.~\ref{sec:sys_strerror}; il suo prototipo -è: -\begin{prototype}{signal.h}{void psignal(int sig, const char *s)} - Stampa sullo standard error un messaggio costituito dalla stringa \param{s}, - seguita da due punti ed una descrizione del segnale indicato da \param{sig}. -\end{prototype} +\func{perror} descritta in sez.~\ref{sec:sys_strerror}, il suo prototipo è: + +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{void psignal(int sig, const char *s)} +\fdesc{Stampa un messaggio di descrizione di un segnale.} +} +{La funzione non ritorna nulla e non prevede errori.} +\end{funcproto} + +La funzione stampa sullo \textit{standard error} un messaggio costituito dalla +stringa passata nell'argomento \param{s}, seguita dal carattere di due punti +ed una descrizione del segnale indicato dall'argomento \param{sig}. 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 \headfile{signal.h} e può essere -acceduta con la dichiarazione: +\func{strsignal} e \func{psignal} è quello di usare la +\index{variabili!globali} variabile globale \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, @@ -808,19 +884,20 @@ effettuata all'interno del normale flusso di esecuzione dello stesso, ma è delegata appunto agli eventuali gestori che si sono installati. In questa sezione vedremo come si effettua la gestione dei segnali, a partire -dalla loro interazione con le system call, passando per le varie funzioni che -permettono di installare i gestori e controllare le reazioni di un processo -alla loro occorrenza. +dalla loro interazione con le \textit{system call}, passando per le varie +funzioni che permettono di installare i gestori e controllare le reazioni di +un processo alla loro occorrenza. \subsection{Il comportamento generale del sistema} \label{sec:sig_gen_beha} -Abbiamo già trattato in sez.~\ref{sec:sig_intro} le modalità con cui il sistema -gestisce l'interazione fra segnali e processi, ci resta da esaminare però il -comportamento delle system call; in particolare due di esse, \func{fork} ed -\func{exec}, dovranno essere prese esplicitamente in considerazione, data la -loro stretta relazione con la creazione di nuovi processi. +Abbiamo già trattato in sez.~\ref{sec:sig_intro} le modalità con cui il +sistema gestisce l'interazione fra segnali e processi, ci resta da esaminare +però il comportamento delle \textit{system call}; in particolare due di esse, +\func{fork} ed \func{exec}, dovranno essere prese esplicitamente in +considerazione, data la loro stretta relazione con la creazione di nuovi +processi. Come accennato in sez.~\ref{sec:proc_fork} quando viene creato un nuovo processo esso eredita dal padre sia le azioni che sono state impostate per i @@ -836,7 +913,7 @@ senso infatti fare riferimento a funzioni definite nel programma originario, 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 +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 \signal{SIGINT} e \signal{SIGQUIT} per i programmi eseguiti in background, che altrimenti sarebbero interrotti da una @@ -847,16 +924,17 @@ 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 +\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ò -attendere la conclusione della system call, perché questo renderebbe -impossibile una risposta pronta al segnale, per cui il gestore viene -eseguito prima che la system call sia ritornata. Un elenco dei casi in cui si +In alcuni casi però alcune \textit{system call} possono bloccarsi +indefinitamente e per questo motivo vengono chiamate \textsl{lente} +\index{system~call~lente} o \textsl{bloccanti}. In questo caso non si può +attendere la conclusione della \textit{system call}, perché questo renderebbe +impossibile una risposta pronta al segnale, per cui il gestore viene eseguito +prima che la \textit{system call} sia ritornata. Un elenco dei casi in cui si presenta questa situazione è il seguente: \begin{itemize*} \item la lettura da file che possono bloccarsi in attesa di dati non ancora @@ -869,68 +947,104 @@ presenta questa situazione è il seguente: essere riavvolto); \item le operazioni eseguite con \func{ioctl} che non è detto possano essere eseguite immediatamente; -\item le funzioni di intercomunicazione che si bloccano in attesa di risposte - da altri processi; -\item la funzione \func{pause} (usata appunto per attendere l'arrivo di un - segnale); -\item la funzione \func{wait} (se nessun processo figlio è ancora terminato). +\item le funzioni di intercomunicazione fra processi (vedi cap.~\ref{cha:IPC}) + che si bloccano in attesa di risposte da altri processi; +\item la funzione \func{pause} (vedi sez.~\ref{sec:sig_pause_sleep}) e le + analoghe \func{sigsuspend}, \func{sigtimedwait}, e \func{sigwaitinfo} (vedi + sez.~\ref{sec:sig_real_time}), usate appunto per attendere l'arrivo di un + segnale; +\item le funzioni associate al \textit{file locking} (vedi + sez.~\ref{sec:file_locking}) +\item la funzione \func{wait} e le analoghe funzioni di attesa se nessun + processo figlio è ancora terminato. \end{itemize*} In questo caso si pone il problema di cosa fare una volta che il gestore sia ritornato. La scelta originaria dei primi Unix era quella di far ritornare -anche la system call restituendo l'errore di \errcode{EINTR}. Questa è a -tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei +anche la \textit{system call} restituendo l'errore di \errcode{EINTR}. Questa +è a tutt'oggi una scelta corrente, ma comporta che i programmi che usano dei gestori controllino lo stato di uscita delle funzioni che eseguono una system call lenta per ripeterne la chiamata qualora l'errore fosse questo. -Dimenticarsi di richiamare una system call interrotta da un segnale è un -errore comune, tanto che le \acr{glibc} provvedono una macro +Dimenticarsi di richiamare una \textit{system call} interrotta da un segnale è +un errore comune, tanto che le \acr{glibc} provvedono una macro \code{TEMP\_FAILURE\_RETRY(expr)} che esegue l'operazione automaticamente, ripetendo l'esecuzione dell'espressione \var{expr} fintanto che il risultato non è diverso dall'uscita con un errore \errcode{EINTR}. La soluzione è comunque poco elegante e BSD ha scelto un approccio molto -diverso, che è quello di fare ripartire automaticamente una system call -interrotta invece di farla fallire. In questo caso ovviamente non c'è bisogno -di preoccuparsi di controllare il codice di errore; si perde però la +diverso, che è quello di fare ripartire automaticamente una \textit{system + call} interrotta invece di farla fallire. In questo caso ovviamente non c'è +bisogno di preoccuparsi di controllare il codice di errore; si perde però la possibilità di eseguire azioni specifiche all'occorrenza di questa particolare condizione. Linux e le \acr{glibc} consentono di utilizzare entrambi gli approcci, attraverso una opportuna opzione di \func{sigaction} (vedi sez.~\ref{sec:sig_sigaction}). È da chiarire comunque che nel caso di -interruzione nel mezzo di un trasferimento parziale di dati, le system call -ritornano sempre indicando i byte trasferiti. +interruzione nel mezzo di un trasferimento parziale di dati, le \textit{system + call} ritornano sempre indicando i byte trasferiti. + +Si tenga presente però che alcune \textit{system call} vengono comunque +interrotte con un errore di \errcode{EINTR} indipendentemente dal fatto che ne +possa essere stato richiesto il riavvio automatico, queste funzioni sono: + +\begin{itemize*} +\item le funzioni di attesa di un segnale, come \func{pause} (vedi + sez.~\ref{sec:sig_pause_sleep}), \func{sigsuspend}, \func{sigtimedwait}, e + \func{sigwaitinfo} (vedi sez.~\ref{sec:sig_real_time}). +\item le funzioni di attesa dell'\textit{I/O multiplexing}, come + \func{select}, \func{pselect}, \func{poll}, \func{ppoll}, \func{epoll\_wait} + e \func{epoll\_pwait} (vedi sez.~\ref{sec:file_multiplexing}). +\item le funzioni del System V IPC che prevedono attese: \func{msgrcv}, + \func{msgsnd} (vedi sez.~\ref{sec:ipc_sysv_mq}), \func{semop} e + \func{semtimedop} (vedi sez.~\ref{sec:ipc_sysv_sem}). +\item le funzioni di attesa di un processo: \func{usleep}, \func{nanosleep} + (vedi sez.~\ref{sec:sig_pause_sleep}) e \func{clock\_nanosleep} (vedi + sez.~\ref{sec:sig_timer_adv}). +\item le funzioni che operano sui socket quando è stato impostato un + \textit{timeout} sugli stessi con \func{setsockopt} (vedi + sez.~\ref{sec:sock_generic_options}) ed in particolare \func{accept}, + \func{recv}, \func{recvfrom}, \func{recvmsg} per un \textit{timeout} in + ricezione e \func{connect}, \func{send}, \func{sendto} e \func{sendmsg} per + un \textit{timeout} in trasmissione. +%\item la funzione \func{io\_getevents} per l'I/O asincrono (vedi sez.??) +\end{itemize*} -% TODO: alcune syscall danno EINTR anche se il segnale è installato con -% SA_RESTART, vedi signal(7) -\subsection{La funzione \func{signal}} +\subsection{L'installazione di un gestore} \label{sec:sig_signal} L'interfaccia più semplice per la gestione dei segnali è costituita dalla -funzione \funcd{signal} che è definita fin dallo standard ANSI C. +funzione di sistema \funcd{signal} che è definita fin dallo standard ANSI C. Quest'ultimo però non considera sistemi multitasking, per cui la definizione è -tanto vaga da essere del tutto inutile in un sistema Unix; è questo il motivo -per cui ogni implementazione successiva ne ha modificato e ridefinito il +tanto vaga da essere del tutto inutile in un sistema Unix. Per questo motivo +ogni implementazione successiva ne ha modificato e ridefinito il comportamento, pur mantenendone immutato il prototipo\footnote{in realtà in alcune vecchie implementazioni (SVr4 e 4.3+BSD in particolare) vengono usati alcuni argomenti aggiuntivi per definire il comportamento della funzione, vedremo in sez.~\ref{sec:sig_sigaction} che questo è possibile usando la funzione \func{sigaction}.} che è: -\begin{prototype}{signal.h} - {sighandler\_t signal(int signum, sighandler\_t handler)} - - Installa la funzione di gestione \param{handler} (il gestore) per il - segnale \param{signum}. - - \bodydesc{La funzione ritorna il precedente gestore in caso di successo - o \const{SIG\_ERR} in caso di errore.} -\end{prototype} -In questa definizione si è usato un tipo di dato, \type{sighandler\_t}, che è -una estensione GNU, definita dalle \acr{glibc}, che permette di riscrivere il +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{sighandler\_t signal(int signum, sighandler\_t handler)} +\fdesc{Installa un gestore di segnale (\textit{signal handler}).} +} + +{La funzione ritorna il precedente gestore in caso di successo in caso di + successo e \const{SIG\_ERR} per un errore, nel qual caso \var{errno} + assumerà il valore: + \begin{errlist} + \item[\errcode{EINVAL}] il numero di segnale \param{signum} non è valido. + \end{errlist} +} +\end{funcproto} + +In questa definizione per l'argomento \param{handler} che indica il gestore da +installare si è usato un tipo di dato, \type{sighandler\_t}, che è una +estensione GNU, definita dalle \acr{glibc}, che permette di riscrivere il prototipo di \func{signal} nella forma appena vista, molto più leggibile di quanto non sia la versione originaria, che di norma è definita come: \includecodesnip{listati/signal.c} @@ -940,39 +1054,40 @@ con il precedente prototipo si può dedurre la definizione di \type{sighandler\_t} che è: \includecodesnip{listati/sighandler_t.c} e cioè un puntatore ad una funzione \ctyp{void} (cioè senza valore di ritorno) -e che prende un argomento di tipo \ctyp{int}.\footnote{si devono usare le - parentesi intorno al nome della funzione per via delle precedenze degli - operatori del C, senza di esse si sarebbe definita una funzione che ritorna - un puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}.} +e che prende un argomento di tipo \ctyp{int}. Si noti come si devono usare le +parentesi intorno al nome della funzione per via delle precedenze degli +operatori del C, senza di esse si sarebbe definita una funzione che ritorna un +puntatore a \ctyp{void} e non un puntatore ad una funzione \ctyp{void}. + La funzione \func{signal} quindi restituisce e prende come secondo argomento un puntatore a una funzione di questo tipo, che è appunto la funzione che -verrà usata come gestore del segnale. +verrà usata come gestore del segnale. Il numero di segnale passato +nell'argomento \param{signum} può essere indicato direttamente con una delle +costanti definite in sez.~\ref{sec:sig_standard}. -Il numero di segnale passato nell'argomento \param{signum} può essere indicato -direttamente con una delle costanti definite in sez.~\ref{sec:sig_standard}. 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 - \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ù - gestire direttamente un segnale.} +due valori costanti \const{SIG\_IGN} e \const{SIG\_DFL}. Il primo indica che +il segnale deve essere ignorato. Il secondo ripristina l'azione predefinita, e +serve a tornare al comportamento di default quando non si intende più gestire +direttamente un segnale. Si ricordi però che i due segnali \signal{SIGKILL} e +\signal{SIGSTOP} non possono essere né ignorati né intercettati e per loro +l'uso di \func{signal} non ha alcun effetto, qualunque cosa si specifichi +per \param{handler}. La funzione restituisce l'indirizzo dell'azione precedente, che può essere salvato per poterlo ripristinare (con un'altra chiamata a \func{signal}) in un -secondo tempo. Si ricordi che se si imposta come azione \const{SIG\_IGN} (o si -imposta un \const{SIG\_DFL} per un segnale la cui azione predefinita è di -essere ignorato), tutti i segnali pendenti saranno scartati, e non verranno -mai notificati. +secondo tempo. Si ricordi che se si imposta come azione \const{SIG\_IGN} o si +imposta \const{SIG\_DFL} per un segnale la cui azione predefinita è di essere +ignorato, tutti i segnali pendenti saranno scartati, e non verranno mai +notificati. L'uso di \func{signal} è soggetto a problemi di compatibilità, dato che essa si comporta in maniera diversa per sistemi derivati da BSD o da System V. In questi ultimi infatti la funzione è conforme al comportamento originale dei 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 +librerie del C come la \acr{libc4} e la \acr{libc5}.\footnote{nelle \acr{libc5} esiste però la possibilità di includere \file{bsd/signal.h} al posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} viene ridefinita per seguire la semantica affidabile usata da BSD.} @@ -985,99 +1100,85 @@ per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto 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}. +processo \itindex{thread} multi-\textit{thread}, è da evitare: tutti i nuovi +programmi devono usare \func{sigaction}. È da tenere presente che, seguendo lo standard POSIX, il comportamento di un 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 +\signal{SIGSEGV}, qualora questi non originino da una chiamata ad una +\func{kill} o altra funzione affine, è indefinito. Un gestore che ritorna da questi segnali può dare luogo ad un ciclo infinito. -\subsection{Le funzioni \func{kill} e \func{raise}} +\subsection{Le funzioni per l'invio di segnali} \label{sec:sig_kill_raise} -Come precedentemente accennato in sez.~\ref{sec:sig_types}, un segnale può -anche essere generato direttamente nell'esecuzione di un programma, attraverso -la chiamata ad una opportuna system call. Le funzioni che si utilizzano di -solito per inviare un segnale generico ad un processo sono due: \func{raise} e +Come accennato in sez.~\ref{sec:sig_types} un segnale può anche essere +generato direttamente nell'esecuzione di un programma, attraverso la chiamata +ad una opportuna \textit{system call}. Le funzioni che si utilizzano di solito +per inviare un segnale generico ad un processo sono \func{raise} e \func{kill}. -La prima funzione è \funcd{raise}, che è definita dallo standard ANSI C, e -serve per inviare un segnale al processo corrente,\footnote{non prevedendo la - presenza di un sistema multiutente lo standard ANSI C non poteva che - definire una funzione che invia il segnale al programma in esecuzione. Nel - caso di Linux questa viene implementata come funzione di compatibilità.} il -suo prototipo è: -\begin{prototype}{signal.h}{int raise(int sig)} - Invia il segnale \param{sig} al processo corrente. +La funzione \funcd{raise}, definita dallo standard ANSI C, serve per inviare +un segnale al processo corrente,\footnote{non prevedendo la presenza di un + sistema multiutente lo standard ANSI C non poteva che definire una funzione + che invia il segnale al programma in esecuzione, nel caso di Linux questa + viene implementata come funzione di compatibilità.} il suo prototipo è: - \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un - errore, il solo errore restituito è \errval{EINVAL} qualora si sia - specificato un numero di segnale invalido.} -\end{prototype} +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{int raise(int sig)} +\fdesc{Invia un segnale al processo corrente.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà il valore: + \begin{errlist} + \item[\errcode{EINVAL}] il segnale \param{sig} non è valido. + \end{errlist} +} +\end{funcproto} Il valore di \param{sig} specifica il segnale che si vuole inviare e può -essere specificato con una delle macro definite in -sez.~\ref{sec:sig_classification}. In genere questa funzione viene usata per +essere specificato con una delle costanti illustrate in +tab.~\ref{tab:sig_signal_list}. In genere questa funzione viene usata per riprodurre il comportamento predefinito di un segnale che sia stato intercettato. In questo caso, una volta eseguite le operazioni volute, il gestore dovrà prima reinstallare l'azione predefinita, per poi attivarla chiamando \func{raise}. -Mentre \func{raise} è una funzione di libreria, quando si vuole inviare un -segnale generico ad un processo occorre utilizzare la apposita system call, -questa può essere chiamata attraverso la funzione \funcd{kill}, il cui -prototipo è: -\begin{functions} - \headdecl{sys/types.h} - \headdecl{signal.h} - \funcdecl{int kill(pid\_t pid, int sig)} Invia il segnale \param{sig} al - processo specificato con \param{pid}. - - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore nel qual caso \var{errno} assumerà uno dei valori: - \begin{errlist} +In realtà \func{raise} è una funzione di libreria, che per i processi ordinari +viene implementata attraverso la funzione di sistema \funcd{kill} che è quella +che consente effettivamente di inviare un segnale generico ad un processo, il + suo prototipo è: + +\begin{funcproto}{ +\fhead{sys/types.h} +\fhead{signal.h} +\fdecl{int kill(pid\_t pid, int sig)} +\fdesc{Invia un segnale ad uno o più processi.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: + \begin{errlist} \item[\errcode{EINVAL}] il segnale specificato non esiste. - \item[\errcode{ESRCH}] il processo selezionato non esiste. + \item[\errcode{ESRCH}] il processo o il gruppo di processi indicato non + esiste. \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il segnale. - \end{errlist}} -\end{functions} - -Lo standard POSIX prevede che il valore 0 per \param{sig} sia usato per -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 \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. - -Il valore dell'argomento \param{pid} specifica il processo (o i processi) di -destinazione a cui il segnale deve essere inviato e può assumere i valori -riportati in tab.~\ref{tab:sig_kill_values}. - -Si noti pertanto che la funzione \code{raise(sig)} può essere definita in -termini di \func{kill}, ed è sostanzialmente equivalente ad una -\code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello -standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale -l'uso di \func{kill} finisce per essere più portabile. - -Una seconda funzione che può essere definita in termini di \func{kill} è -\funcd{killpg}, che è sostanzialmente equivalente a -\code{kill(-pidgrp, signal)}; il suo prototipo è: -\begin{prototype}{signal.h}{int killpg(pid\_t pidgrp, int signal)} - - Invia il segnale \param{signal} al \itindex{process~group} \textit{process - group} \param{pidgrp}. + \end{errlist} +} +\end{funcproto} - \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di - errore, gli errori sono gli stessi di \func{kill}.} -\end{prototype} -\noindent e permette di inviare un segnale a tutto un \itindex{process~group} -\textit{process group} (vedi sez.~\ref{sec:sess_proc_group}). +La funzione invia il segnale specificato dall'argomento \param{sig} al +processo o ai processi specificati con l'argomento \param{pid}. Lo standard +POSIX prevede che il valore 0 per \param{sig} sia usato per 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 o i processi specificati +con \param{pid} non esistono. \begin{table}[htb] \footnotesize @@ -1087,12 +1188,14 @@ 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 \ids{PID} indicato.\\ + $>0$ & Il segnale è mandato al processo con \ids{PID} uguale + a \param{pid}.\\ 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}).\\ - $<-1$ & Il segnale è mandato ad ogni processo del \textit{process group} - \itindex{process~group} $|\code{pid}|$.\\ + $<-1$& Il segnale è mandato ad ogni processo del \textit{process group} + \itindex{process~group} con \ids{PGID} uguale + a $|\param{pid}|$.\\ \hline \end{tabular} \caption{Valori dell'argomento \param{pid} per la funzione @@ -1100,15 +1203,52 @@ Una seconda funzione che può essere definita in termini di \func{kill} è \label{tab:sig_kill_values} \end{table} -Solo l'amministratore può inviare un segnale ad un processo qualunque, in -tutti gli altri casi 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 -un gestore installato. +A seconda del valore dell'argomento \param{pid} si può inviare il segnale ad +uno specifico processo, ad un \textit{process group} (vedi +sez.~\ref{sec:sess_proc_group}) o a tutti i processi, secondo quanto +illustrato in tab.~\ref{tab:sig_kill_values} che riporta i valori possibili +per questo argomento. 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. + +Si noti pertanto che la funzione \code{raise(sig)} può essere definita in +termini di \func{kill}, ed è sostanzialmente equivalente ad una +\code{kill(getpid(), sig)}. Siccome \func{raise}, che è definita nello +standard ISO C, non esiste in alcune vecchie versioni di Unix, in generale +l'uso di \func{kill} finisce per essere più portabile. Una seconda funzione +che può essere definita in termini di \func{kill} è \funcd{killpg}, il suo +prototipo è: + +\begin{funcproto}{ +\fhead{signal.h} +\fdecl{int killpg(pid\_t pidgrp, int signal)} +\fdesc{Invia un segnale ad un \itindex{process~group} \textit{process group}.} +} + +{ La funzione ritorna $0$ in caso di successo e $-1$ per un errore, e gli + errori sono gli stessi di \func{kill}. } +\end{funcproto} + + +La funzione invia il segnale \param{signal} al \itindex{process~group} +\textit{process group} \param{pidgrp} ed è è sostanzialmente equivalente +all'esecuzione di \code{kill(-pidgrp, signal)}. + +Oltre a queste funzioni di base vedremo più avanti che esistono altre funzioni +per inviare segnali, come \func{sigqueue} per i segnali \textit{real-time} +(vedi sez.~\ref{sec:sig_real_time}) e le specifiche funzioni per i +\textit{thread} che tratteremo in sez.~\ref{sec:thread_signal}. + +Ma indipendentemente dalla funzione usata solo l'amministratore può inviare un +segnale ad un processo qualunque, in 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 un gestore installato. Infine, seguendo le specifiche POSIX 1003.1-2001, l'uso della chiamata \code{kill(-1, sig)} comporta che il segnale sia inviato (con la solita @@ -1118,7 +1258,7 @@ escludere alcuni processi specifici: nel caso in questione Linux non invia il segnale al processo che ha effettuato la chiamata. -\subsection{Le funzioni \func{alarm}, \func{abort} ed i \textit{timer}} +\subsection{Le funzioni di allarme ed interruzione ed i \textit{timer}} \label{sec:sig_alarm_abort} Un caso particolare di segnali generati a richiesta è quello che riguarda i @@ -1126,22 +1266,26 @@ 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 \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.} -\end{prototype} -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 \signal{SIGALRM}) dopo il numero di secondi specificato da -\param{seconds}. +\begin{funcproto}{ +\fhead{unistd.h} +\fdecl{unsigned int alarm(unsigned int seconds)} +\fdesc{Predispone l'invio di un allarme.} +} -Se si specifica per \param{seconds} un valore nullo non verrà inviato nessun -segnale; siccome alla chiamata viene cancellato ogni precedente allarme, -questo può essere usato per cancellare una programmazione precedente. +{La funzione ritorna il numero di secondi rimanenti ad un precedente allarme, + o $0$ se non c'erano allarmi pendenti, non sono previste condizioni di + errore.} +\end{funcproto} + +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 \signal{SIGALRM}) dopo il numero di secondi specificato +dall'argomento \param{seconds}. Se si specifica per \param{seconds} un valore +nullo non verrà inviato nessun segnale. Siccome alla chiamata viene cancellato +ogni precedente allarme, questo valore può essere usato per cancellare una +programmazione precedente. La funzione inoltre ritorna il numero di secondi rimanenti all'invio dell'allarme programmato in precedenza. In questo modo è possibile controllare @@ -1161,9 +1305,9 @@ processo tre diversi timer: 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 \signal{SIGPROF}. + \textit{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 \signal{SIGPROF}. \end{itemize*} Il timer usato da \func{alarm} è il \textit{clock time}, e corrisponde cioè al @@ -1630,7 +1774,7 @@ infatti il segnale di allarme interrompe un altro gestore, l'esecuzione non riprenderà nel gestore in questione, ma nel ciclo principale, interrompendone inopportunamente l'esecuzione. Lo stesso tipo di problemi si presenterebbero se si volesse usare \func{alarm} per stabilire un timeout su una qualunque -system call bloccante. +\textit{system call} bloccante. Un secondo esempio è quello in cui si usa il segnale per notificare una qualche forma di evento; in genere quello che si fa in questo caso è impostare @@ -1923,21 +2067,21 @@ altre informazioni specifiche. \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{SI\_USER} & generato da \func{kill} o \func{raise}.\\ - \const{SI\_KERNEL} & inviato dal kernel.\\ - \const{SI\_QUEUE} & inviato con \func{sigqueue} (vedi + \const{SI\_USER} & Generato da \func{kill} o \func{raise}.\\ + \const{SI\_KERNEL} & Inviato dal kernel.\\ + \const{SI\_QUEUE} & Inviato con \func{sigqueue} (vedi sez.~\ref{sec:sig_real_time}).\\ - \const{SI\_TIMER} & scadenza di un POSIX timer + \const{SI\_TIMER} & Scadenza di un POSIX timer (vedi sez.~\ref{sec:sig_timer_adv}).\\ - \const{SI\_MESGQ} & inviato al cambiamento di stato di una coda di + \const{SI\_MESGQ} & Inviato al cambiamento di stato di una coda di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}).\footnotemark\\ - \const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi + \const{SI\_ASYNCIO}& Una operazione di I/O asincrono (vedi sez.~\ref{sec:file_asyncronous_io}) è stata completata.\\ - \const{SI\_SIGIO} & segnale di \signal{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 + \const{SI\_TKILL} & Inviato da \func{tkill} o \func{tgkill} (vedi sez.~\ref{cha:threads_xxx}).\footnotemark\\ \hline \end{tabular} @@ -1968,47 +2112,47 @@ cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{ILL\_ILLOPC} & codice di operazione illegale.\\ - \const{ILL\_ILLOPN} & operando illegale.\\ - \const{ILL\_ILLADR} & modo di indirizzamento illegale.\\ - \const{ILL\_ILLTRP} & trappola di processore illegale.\\ - \const{ILL\_PRVOPC} & codice di operazione privilegiato.\\ - \const{ILL\_PRVREG} & registro privilegiato.\\ - \const{ILL\_COPROC} & errore del coprocessore.\\ - \const{ILL\_BADSTK} & errore nello stack interno.\\ + \const{ILL\_ILLOPC} & Codice di operazione illegale.\\ + \const{ILL\_ILLOPN} & Operando illegale.\\ + \const{ILL\_ILLADR} & Modo di indirizzamento illegale.\\ + \const{ILL\_ILLTRP} & Trappola di processore illegale.\\ + \const{ILL\_PRVOPC} & Codice di operazione privilegiato.\\ + \const{ILL\_PRVREG} & Registro privilegiato.\\ + \const{ILL\_COPROC} & Errore del coprocessore.\\ + \const{ILL\_BADSTK} & Errore nello stack interno.\\ \hline - \const{FPE\_INTDIV} & divisione per zero intera.\\ - \const{FPE\_INTOVF} & overflow intero.\\ - \const{FPE\_FLTDIV} & divisione per zero in virgola mobile.\\ - \const{FPE\_FLTOVF} & overflow in virgola mobile.\\ - \const{FPE\_FLTUND} & underflow in virgola mobile.\\ - \const{FPE\_FLTRES} & risultato in virgola mobile non esatto.\\ - \const{FPE\_FLTINV} & operazione in virgola mobile non valida.\\ - \const{FPE\_FLTSUB} & mantissa? fuori intervallo.\\ + \const{FPE\_INTDIV} & Divisione per zero intera.\\ + \const{FPE\_INTOVF} & Overflow intero.\\ + \const{FPE\_FLTDIV} & Divisione per zero in virgola mobile.\\ + \const{FPE\_FLTOVF} & Overflow in virgola mobile.\\ + \const{FPE\_FLTUND} & Underflow in virgola mobile.\\ + \const{FPE\_FLTRES} & Risultato in virgola mobile non esatto.\\ + \const{FPE\_FLTINV} & Operazione in virgola mobile non valida.\\ + \const{FPE\_FLTSUB} & Mantissa? fuori intervallo.\\ \hline - \const{SEGV\_MAPERR} & indirizzo non mappato.\\ - \const{SEGV\_ACCERR} & permessi non validi per l'indirizzo.\\ + \const{SEGV\_MAPERR} & Indirizzo non mappato.\\ + \const{SEGV\_ACCERR} & Permessi non validi per l'indirizzo.\\ \hline - \const{BUS\_ADRALN} & allineamento dell'indirizzo non valido.\\ - \const{BUS\_ADRERR} & indirizzo fisico inesistente.\\ - \const{BUS\_OBJERR} & errore hardware sull'indirizzo.\\ + \const{BUS\_ADRALN} & Allineamento dell'indirizzo non valido.\\ + \const{BUS\_ADRERR} & Indirizzo fisico inesistente.\\ + \const{BUS\_OBJERR} & Errore hardware sull'indirizzo.\\ \hline - \const{TRAP\_BRKPT} & breakpoint sul processo.\\ - \const{TRAP\_TRACE} & trappola di tracciamento del processo.\\ + \const{TRAP\_BRKPT} & Breakpoint sul processo.\\ + \const{TRAP\_TRACE} & Trappola di tracciamento del processo.\\ \hline - \const{CLD\_EXITED} & il figlio è uscito.\\ - \const{CLD\_KILLED} & il figlio è stato terminato.\\ - \const{CLD\_DUMPED} & il figlio è terminato in modo anormale.\\ - \const{CLD\_TRAPPED} & un figlio tracciato ha raggiunto una trappola.\\ - \const{CLD\_STOPPED} & il figlio è stato fermato.\\ - \const{CLD\_CONTINUED}& il figlio è ripartito.\\ + \const{CLD\_EXITED} & Il figlio è uscito.\\ + \const{CLD\_KILLED} & Il figlio è stato terminato.\\ + \const{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\ + \const{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\ + \const{CLD\_STOPPED} & Il figlio è stato fermato.\\ + \const{CLD\_CONTINUED}& Il figlio è ripartito.\\ \hline - \const{POLL\_IN} & disponibili dati in ingresso.\\ - \const{POLL\_OUT} & spazio disponibile sul buffer di uscita.\\ - \const{POLL\_MSG} & disponibili messaggi in ingresso.\\ - \const{POLL\_ERR} & errore di I/O.\\ - \const{POLL\_PRI} & disponibili dati di alta priorità in ingresso.\\ - \const{POLL\_HUP} & il dispositivo è stato disconnesso.\\ + \const{POLL\_IN} & Disponibili dati in ingresso.\\ + \const{POLL\_OUT} & Spazio disponibile sul buffer di uscita.\\ + \const{POLL\_MSG} & Disponibili messaggi in ingresso.\\ + \const{POLL\_ERR} & Errore di I/O.\\ + \const{POLL\_PRI} & Disponibili dati di alta priorità in ingresso.\\ + \const{POLL\_HUP} & Il dispositivo è stato disconnesso.\\ \hline \end{tabular} \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction} @@ -2918,7 +3062,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 + +% TODO manca clock_nanosleep, referenziata in sez.~\ref{sec:sig_gen_beha} Con l'introduzione degli orologi ad alta risoluzione è divenuto possibile ottenere anche una gestione più avanzata degli allarmi; abbiamo già visto in @@ -3489,10 +3634,11 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a % LocalWords: tick calendar The Epoch list getcpuclockid capability CAP getres % LocalWords: ENOSYS pthread ENOENT NULL attribute itimerspec new old ABSTIME % LocalWords: epoch multiplexing overrun res lpthread sec nsec curr one shot -% LocalWords: delete +% LocalWords: delete stopped gdb alpha mips emulation locking ppoll epoll PGID %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: pwait msgrcv msgsnd semop semtimedop diff --git a/system.tex b/system.tex index 8184dee..ac81bc7 100644 --- a/system.tex +++ b/system.tex @@ -258,7 +258,7 @@ valori ottenuti da \func{sysconf}. \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del gruppo \textit{saved} (vedi sez.~\ref{sec:proc_access_id}) - per il controllo di accesso dei processi\\ + per il controllo di accesso dei processi.\\ \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1 supportata nel formato YYYYMML (ad esempio 199009L).\\ @@ -1503,16 +1503,16 @@ recepita nello standard POSIX.1-2001, che però indica come campi di \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{RUSAGE\_SELF} & ritorna l'uso delle risorse del processo + \const{RUSAGE\_SELF} & Ritorna l'uso delle risorse del processo corrente, che in caso di uso dei \textit{thread} ammonta alla somma delle risorse utilizzate da tutti i \textit{thread} del processo.\\ - \const{RUSAGE\_CHILDREN} & ritorna l'uso delle risorse dell'insieme dei + \const{RUSAGE\_CHILDREN} & Ritorna l'uso delle risorse dell'insieme dei processi figli di cui è ricevuto lo stato di terminazione, che a loro volta comprendono quelle dei loro figli e così via.\\ - \const{RUSAGE\_THREAD} & ritorna l'uso delle risorse del \textit{thread} + \const{RUSAGE\_THREAD} & Ritorna l'uso delle risorse del \textit{thread} chiamante.\\ \hline \end{tabular} @@ -2510,12 +2510,12 @@ delle costanti elencate in tab.~\ref{tab:adjtimex_return}. \textbf{Nome} & \textbf{Valore} & \textbf{Significato}\\ \hline \hline - \const{TIME\_OK} & 0 & orologio sincronizzato.\\ - \const{TIME\_INS} & 1 & inserimento di un \textit{leap second}.\\ - \const{TIME\_DEL} & 2 & cancellazione di un \textit{leap second}.\\ + \const{TIME\_OK} & 0 & Orologio sincronizzato.\\ + \const{TIME\_INS} & 1 & Inserimento di un \textit{leap second}.\\ + \const{TIME\_DEL} & 2 & Cancellazione di un \textit{leap second}.\\ \const{TIME\_OOP} & 3 & \textit{leap second} in corso.\\ \const{TIME\_WAIT} & 4 & \textit{leap second} avvenuto.\\ - \const{TIME\_BAD} & 5 & orologio non sincronizzato.\\ + \const{TIME\_BAD} & 5 & Orologio non sincronizzato.\\ \hline \end{tabular} \caption{Possibili valori ritornati da \func{adjtimex} in caso di successo.} @@ -2874,7 +2874,7 @@ lo stato di \param{s} è indefinito. \var{\%S}&\texttt{50} & Secondo.\\ \var{\%U}&\texttt{16} & Settimana dell'anno (partendo dalla domenica).\\ - \var{\%w}&\texttt{3} & Giorno della settimana. \\ + \var{\%w}&\texttt{3} & Giorno della settimana.\\ \var{\%W}&\texttt{16} & Settimana dell'anno (partendo dal lunedì).\\ \var{\%x}&\texttt{04/24/02} & La data.\\ diff --git a/thread.tex b/thread.tex index cb0117a..687aab2 100644 --- a/thread.tex +++ b/thread.tex @@ -127,14 +127,19 @@ delle \acr{glibc}. \itindend{thread} +\subsection{I \textit{thread} e i segnali.} +\label{sec:thread_signal} + +% TODO trattare tkill e tgkill per l'invio di segnali a thread, fare un +% capitolo apposito su thread e segnali + + + % TODO troppe cose, ma segue list di notizie correlate % aggiunta rt_tgsigqueueinfo con il kernel 2.6.31 -% TODO trattare tkill e tgkill per l'invio di segnali a thread, fare un -% capitolo apposito su thread e segnali - % LocalWords: thread multitasking POSIX sez Posix Library kernel glibc mutex