From: Simone Piccardi Date: Thu, 30 Jul 2009 06:39:56 +0000 (+0000) Subject: Sistemazione dei TODO e trattazione dei valori di si_code in sigunfo_t X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=e4436c3ab2cf203d25842993631b4a7b735eac72 Sistemazione dei TODO e trattazione dei valori di si_code in sigunfo_t --- diff --git a/fileadv.tex b/fileadv.tex index 42458e9..8e8cfd8 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -974,12 +974,11 @@ Per far questo per (vedi sez.~\ref{sec:sig_real_time}) impostando esplicitamente con il comando \const{F\_SETSIG} di \func{fcntl} un segnale real-time da inviare in caso di I/O asincrono (il segnale predefinito è \const{SIGIO}). In questo caso il -gestore, tutte le volte che riceverà \const{SI\_SIGIO} come valore del -campo \var{si\_code}\footnote{il valore resta \const{SI\_SIGIO} qualunque sia - il segnale che si è associato all'I/O asincrono, ed indica appunto che il - segnale è stato generato a causa di attività nell'I/O asincrono.} di -\struct{siginfo\_t}, troverà nel campo \var{si\_fd} il valore del file -descriptor che ha generato il segnale. +gestore, tutte le volte che riceverà \const{SI\_SIGIO} come valore del campo +\var{si\_code}\footnote{il valore resta \const{SI\_SIGIO} qualunque sia il + segnale che si è associato all'I/O, ed indica appunto che il segnale è stato + generato a causa di attività di I/O.} di \struct{siginfo\_t}, troverà nel +campo \var{si\_fd} il valore del file descriptor che ha generato il segnale. Un secondo vantaggio dell'uso dei segnali real-time è che essendo questi ultimi dotati di una coda di consegna ogni segnale sarà associato ad uno solo @@ -988,7 +987,7 @@ risposta a seconda del segnale usato, dato che i segnali real-time supportano anche questa funzionalità. In questo modo si può identificare immediatamente un file su cui l'accesso è diventato possibile evitando completamente l'uso di funzioni come \func{poll} e \func{select}, almeno fintanto che non si satura -la coda. +la coda. Se infatti si eccedono le dimensioni di quest'ultima, il kernel, non potendo più assicurare il comportamento corretto per un segnale real-time, invierà al diff --git a/fileunix.tex b/fileunix.tex index e2e0db7..a97db9a 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -1635,7 +1635,6 @@ ma le due funzioni sono rimaste. - % LocalWords: descriptor system call cap like kernel sez l'inode inode VFS tab % LocalWords: process table struct files flags pos all'inode dentry fig shell % LocalWords: error POSIX STDIN FILENO STDOUT STDERR unistd read write lseek diff --git a/signal.tex b/signal.tex index 2653413..5cc9c7a 100644 --- a/signal.tex +++ b/signal.tex @@ -944,8 +944,9 @@ comportamento della versione originale della funzione, il cui uso 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 \macro{\_XOPEN\_SOURCE}. In generale, per evitare questi problemi, l'uso di -\func{signal} (ed ogni eventuale ridefinizione della stessa) è da evitare; -tutti i nuovi programmi dovrebbero usare \func{sigaction}. +\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 @@ -971,7 +972,7 @@ serve per inviare un segnale al processo corrente,\footnote{non prevedendo la suo prototipo è: \begin{prototype}{signal.h}{int raise(int sig)} Invia il segnale \param{sig} al processo corrente. - + \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.} @@ -1216,7 +1217,8 @@ significa circa 10~ms). Il sistema assicura comunque che il segnale non sar mai generato prima della scadenza programmata (l'arrotondamento cioè è sempre effettuato per eccesso). -% TODO: verificare cose è successo con l'introduzione nel kernel degli htrimer +% TODO: verificare cose è successo con l'introduzione nel kernel con i timer +% ad alta risoluzione Una seconda causa di potenziali ritardi è che il segnale viene generato alla scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo @@ -1781,8 +1783,8 @@ 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 o processi - figli non divenire \textit{zombie} quando + \const{SA\_NOCLDWAIT}& Se il segnale è \const{SIGCHLD} allora i processi + figli non diventano \textit{zombie} quando terminano.\footnotemark \\ \hline \end{tabular} @@ -1793,8 +1795,6 @@ tab.~\ref{tab:sig_sa_flag}. \footnotetext{questa funzionalità è stata introdotta nel kernel 2.6 e va a modificare il comportamento di \func{waitpid}.} -% TODO con il 2.6 sono stati aggiunti SA_NOCLDWAIT e altro, documentare - Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x @@ -1804,7 +1804,7 @@ di utilizzare due forme diverse di gestore,\footnote{la possibilit addizionale di tipo \var{sigcontext}, che adesso è deprecato.} da 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 tipi devono essere usati in maniera +\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 \func{signal}, mentre la prima permette di usare un gestore più complesso, in @@ -1830,29 +1830,138 @@ usato dal kernel per specificare maggiori dettagli riguardo l'evento che ha causato l'emissione del segnale. In generale \var{si\_code} contiene, per i segnali generici, per quelli -real-time e per tutti quelli inviati tramite \func{kill}, informazioni circa -l'origine del segnale (se generato dal kernel, da un timer, da \func{kill}, -ecc.). Alcuni segnali però usano \var{si\_code} per fornire una informazione -specifica: ad esempio i vari segnali di errore (\const{SIGFPE}, -\const{SIGILL}, \const{SIGBUS} e \const{SIGSEGV}) 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 +real-time e per tutti quelli inviati tramite da un processo con \func{kill} o +affini, le informazioni circa l'origine del segnale stesso, ad esempio se +generato dal kernel, da un timer, da \func{kill}, ecc. Il valore viene sempre +espresso come una costante,\footnote{le definizioni di tutti i valori + possibili si trovano in \file{bits/siginfo.h}.} ed i valori possibili in +questo caso sono riportati in tab.~\ref{tab:sig_sa_code_generic}. + +\begin{table}[!htb] + \footnotesize + \centering + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \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 + sez.~\ref{sec:sig_real_time}).\\ + \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 + messaggi POSIX (vedi + sez.~\ref{sec:ipc_posix_mq}).\footnotemark\\ + \const{SI\_ASYNCIO}& una operazione di I/O asincrono (vedi + sez.~\ref{sec:file_asyncronous_access}) è stata + completata.\\ + \const{SI\_SIGIO} & segnale di \const{SIGIO} da una coda (vedi + sez.~\ref{sec:file_asyncronous_operation}).\\ + \const{SI\_TKILL} & inviato da \func{tkill} o \func{tgkill} (vedi + sez.~\ref{cha:threads_xxx}).\footnotemark\\ + \hline + \end{tabular} + \caption{Valori del campo \var{sa\_code} della struttura \struct{sigaction} + per i segnali generici.} + \label{tab:sig_sa_code_generic} +\end{table} + +\footnotetext[17]{introdotto con il kernel 2.6.6.} +\footnotetext{introdotto con il kernel 2.4.19.} + +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 +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 -altre informazioni specifiche. In tutti i casi il valore del campo è -riportato attraverso delle costanti (le cui definizioni si trovano -\file{bits/siginfo.h}) il cui elenco dettagliato è disponibile nella pagina di -manuale di \func{sigaction}. +altre informazioni specifiche. + +In questo caso il valore del campo \var{si\_code} deve essere verificato nei +confronti delle diverse costanti previste per ciascuno di detti +segnali;\footnote{dato che si tratta di una costante, e non di una maschera + binaria, i valori numerici vengono riutilizzati e ciascuno di essi avrà un + significato diverso a seconda del segnale a cui è associato.} l'elenco +dettagliato dei nomi di queste costanti è riportato nelle diverse sezioni di +tab.~\ref{tab:sig_sa_code_special} che sono state ordinate nella sequenza in +cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome + indica comunque in maniera diretta il segnale a cui le costanti fanno + riferimento.} + +\begin{table}[!htb] + \footnotesize + \centering + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \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.\\ + \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.\\ + \hline + \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.\\ + \hline + \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.\\ + \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.\\ + \hline + \end{tabular} + \caption{Valori del campo \var{sa\_code} della struttura \struct{sigaction} + impostati rispettivamente dai segnali \const{SIGILL}, \const{SIGFPE}, + \const{SIGSEGV}, \const{SIGBUS}, \const{SIGCHLD}, \const{SIGTRAP} e + \const{SIGPOLL}.} + \label{tab:sig_sa_code_special} +\end{table} -Il resto della struttura è 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 \ctyp{union} ed i +valori eventualmente presenti dipendono dal segnale, così \const{SIGCHLD} ed i segnali 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{SIGILL}, \const{SIGFPE}, -\const{SIGSEGV} e \const{SIGBUS} avvalorano \var{si\_addr} con l'indirizzo in -cui è avvenuto l'errore, \const{SIGIO} (vedi +al processo che ha emesso il segnale, \const{SIGCHLD} avvalora anche i campi +\const{si\_status}, \const{si\_utime} and \const{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 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. +file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti +(vedi sez.~\ref{sec:TCP_urgent_data}) su un socket. Benché sia possibile usare nello stesso programma sia \func{sigaction} che \func{signal} occorre molta attenzione, in quanto le due funzioni possono @@ -1884,24 +1993,26 @@ sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}. Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata che abbia le stesse caratteristiche di \func{signal}, a definire attraverso -\func{sigaction} una funzione equivalente, il cui codice è riportato in -fig.~\ref{fig:sig_Signal_code} (il codice completo si trova nel file -\file{SigHand.c} nei sorgenti allegati). Si noti come, essendo la funzione -estremamente semplice, è definita come \direct{inline}.\footnote{la direttiva - \direct{inline} viene usata per dire al compilatore di trattare la funzione - cui essa fa riferimento in maniera speciale inserendo il codice direttamente - nel testo del programma. Anche se i compilatori più moderni sono in grado - di effettuare da soli queste manipolazioni (impostando le opportune - ottimizzazioni) questa è una tecnica usata per migliorare le prestazioni per - le funzioni piccole ed usate di frequente (in particolare nel kernel, dove - in certi casi le ottimizzazioni dal compilatore, tarate per l'uso in user - space, non sono sempre adatte). In tal caso infatti le istruzioni per creare - un nuovo frame nello \itindex{stack} \textit{stack} per chiamare la funzione - costituirebbero una parte rilevante del codice, appesantendo inutilmente il - programma. Originariamente questo comportamento veniva ottenuto con delle - macro, ma queste hanno tutta una serie di problemi di sintassi nel passaggio - degli argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono - essere evitati.} +\func{sigaction} una funzione equivalente \func{Signal}, il cui codice è +riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si trova nel +file \file{SigHand.c} nei sorgenti allegati). Si noti come, essendo la +funzione estremamente semplice, essa è definita come +\direct{inline};\footnote{la direttiva \direct{inline} viene usata per dire al + compilatore di trattare la funzione cui essa fa riferimento in maniera + speciale inserendo il codice direttamente nel testo del programma. Anche se + i compilatori più moderni sono in grado di effettuare da soli queste + manipolazioni (impostando le opportune ottimizzazioni) questa è una tecnica + usata per migliorare le prestazioni per le funzioni piccole ed usate di + frequente (in particolare nel kernel, dove in certi casi le ottimizzazioni + dal compilatore, tarate per l'uso in user space, non sono sempre adatte). In + tal caso infatti le istruzioni per creare un nuovo frame nello + \itindex{stack} \textit{stack} per chiamare la funzione costituirebbero una + parte rilevante del codice, appesantendo inutilmente il programma. + Originariamente questo comportamento veniva ottenuto con delle macro, ma + queste hanno tutta una serie di problemi di sintassi nel passaggio degli + argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono + essere evitati.} per semplificare ulteriormente la definizione si è poi +definito un apposito tipo \texttt{SigFunc}. @@ -2354,7 +2465,6 @@ segnali classici: certi segnali ha la precedenza rispetto ad altri. \end{basedescript} - Per poter superare queste limitazioni lo standard ha introdotto delle nuove caratteristiche, che sono state associate ad una nuova classe di segnali, che vengono chiamati \textsl{segnali real-time}, in particolare le funzionalità @@ -2634,10 +2744,14 @@ riceverlo fra due chiamate successive. % LocalWords: setsockopt setuid shutdown sigpause socketpair stat symlink page % LocalWords: sysconf tcdrain tcflow tcflush tcgetattr tcgetgrp tcsendbreak % LocalWords: tcsetattr tcsetpgrp getoverrun times umask uname unlink utime -% LocalWords: write sival SIVGTALRM NOCLDWAIT +% LocalWords: write sival SIVGTALRM NOCLDWAIT MESGQ ASYNCIO TKILL tkill tgkill %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: ILL ILLOPC ILLOPN ILLADR ILLTRP PRVOPC PRVREG COPROC BADSTK FPE +% LocalWords: INTDIV INTOVF FLTDIV FLTOVF FLTUND underflow FLTRES FLTINV SEGV +% LocalWords: FLTSUB MAPERR ACCERR ADRALN ADRERR OBJERR BRKPT CLD EXITED MSG +% LocalWords: KILLED DUMPED TRAPPED STOPPED CONTINUED PRI HUP SigFunc diff --git a/thread.tex b/thread.tex index 07c3b63..1770563 100644 --- a/thread.tex +++ b/thread.tex @@ -111,6 +111,10 @@ delle \acr{glibc}. % 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