X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=2f5516b0fe4f563df3c5cf235e6116d957d0534c;hp=bde6dfcedc1619d500a0a1e99b5f7cd015b7585e;hb=5afbcf1d6a84ab2a527859d8fd05b75a31e39736;hpb=7b43a7843d483c826a6ed13224208c615a23c4d6 diff --git a/signal.tex b/signal.tex index bde6dfc..2f5516b 100644 --- a/signal.tex +++ b/signal.tex @@ -341,7 +341,7 @@ esse sono definite nell'header di sistema \headfile{signal.h}. \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}.\\ + \signald{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.\\ @@ -373,7 +373,7 @@ esse sono definite nell'header di sistema \headfile{signal.h}. \signal{SIGSYS} &VS& C & \textit{system call} sbagliata.\\ \hline \signal{SIGSTKFLT}&?& T & Errore sullo stack del coprocessore (inusato).\\ - \signal{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di + \signald{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di \signal{SIGSYS}).\\ \hline \signal{SIGCLD} &V & I & Sinonimo di \signal{SIGCHLD}.\\ @@ -498,7 +498,7 @@ la registrazione su disco di un file di \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 +\item[\signald{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome derivi da \textit{floating point exception} si applica a tutti gli errori aritmetici compresa la divisione per zero e l'overflow. Se il gestore ritorna il comportamento del processo è indefinito, ed ignorare questo @@ -510,7 +510,7 @@ terminazione. Questi segnali sono: % aritmetiche e richiede che esse siano notificate. % TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni -\item[\signal{SIGILL}] Il nome deriva da \textit{illegal instruction}, +\item[\signald{SIGILL}] Il nome deriva da \textit{illegal instruction}, significa che il programma sta cercando di eseguire una istruzione privilegiata o inesistente, in generale del codice illecito. Poiché il compilatore del C genera del codice valido si ottiene questo segnale se il @@ -522,16 +522,16 @@ terminazione. Questi segnali sono: 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. È 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. +\item[\signald{SIGSEGV}] Il nome deriva da \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. È 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. -\item[\signal{SIGBUS}] Il nome deriva da \textit{bus error}. Come +\item[\signald{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 @@ -539,19 +539,19 @@ terminazione. Questi segnali sono: \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 +\item[\signald{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 +\item[\signald{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 +\item[\signald{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che 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 +\item[\signald{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. @@ -573,20 +573,20 @@ 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: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale +\item[\signald{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale 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 +\item[\signald{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di interruzione per il programma. È quello che viene generato di default dal 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 è +\item[\signald{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è 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, @@ -597,7 +597,7 @@ processo, questi segnali sono: (tipo la cancellazione di file temporanei), dato che in certi casi esse possono eliminare informazioni utili nell'esame dei \textit{core dump}. -\item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata +\item[\signald{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata qualunque programma. Questo segnale non può essere né intercettato, né ignorato, né bloccato, per cui causa comunque la terminazione del processo. In genere esso viene generato solo per richiesta esplicita dell'utente dal @@ -612,7 +612,7 @@ processo, questi segnali sono: per condizioni particolari il processo non può più essere eseguito neanche per eseguire un gestore. -\item[\signal{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il +\item[\signald{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 (vedi @@ -634,15 +634,15 @@ causare la terminazione del programma, ma con questi segnali la scelta predefinita è irrilevante, in quanto il loro uso presuppone sempre la necessità di un gestore. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\signal{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di +\item[\signald{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente usato dalla funzione \func{alarm}. -\item[\const{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al +\item[\signald{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal processo. -\item[\signal{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza +\item[\signald{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza di un timer che misura sia il tempo di CPU speso direttamente dal processo che quello che il sistema ha speso per conto di quest'ultimo. In genere viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo @@ -658,18 +658,18 @@ questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a generare questi segnali. L'azione predefinita è di essere ignorati. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\signal{SIGIO}] Questo segnale viene inviato quando un file descriptor è +\item[\signald{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 chiamata a \func{fcntl} che lo attiva abbia avuto successo. -\item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati +\item[\signald{SIGURG}] Questo segnale è inviato quando arrivano dei dati urgenti o \itindex{out-of-band} \textit{out-of-band} su di un socket; per maggiori dettagli al proposito si veda sez.~\ref{sec:TCP_urgent_data}. -\item[\signal{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001, +\item[\signald{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} @@ -682,15 +682,15 @@ Questi sono i segnali usati dal controllo delle sessioni e dei processi, il loro uso è specializzato e viene trattato in maniera specifica nelle sezioni in cui si trattano gli argomenti relativi. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\signal{SIGCHLD}] Questo è il segnale mandato al processo padre quando un +\item[\signald{SIGCHLD}] Questo è il segnale mandato al processo padre quando un figlio termina o viene fermato. L'azione predefinita è di ignorare il segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}. -\item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al +\item[\signald{SIGCLD}] Per Linux questo è solo un segnale identico al 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 +\item[\signald{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene usato per fare ripartire un programma precedentemente fermato da \signal{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre ripartire il processo prima della sua consegna. Il comportamento predefinito @@ -705,11 +705,11 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: se viene fermato e riavviato, come per esempio riscrivere un prompt, o inviare un avviso. -\item[\signal{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta +\item[\signald{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 +\item[\signald{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale 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 @@ -718,14 +718,14 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: 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 +\item[\signald{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 +\item[\signald{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma 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 @@ -742,7 +742,7 @@ che impediscono il completamento dell'esecuzione dovute all'interazione con il 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 +\item[\signald{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle \textit{pipe}, (o delle FIFO o dei socket) è necessario, prima che un processo inizi a scrivere su una di esse, che un altro l'abbia aperta in lettura (si veda sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è @@ -751,21 +751,21 @@ quella di terminare il processo, questi segnali sono: ignorato la chiamata che lo ha causato fallisce, restituendo l'errore \errcode{EPIPE}. -\item[\signal{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo +\item[\signald{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}. 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 \textit{core dump}. -\item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo +\item[\signald{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}. 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 \textit{core dump}. -\item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il +\item[\signald{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 è @@ -779,31 +779,31 @@ quella di terminare il processo, questi segnali sono: Raccogliamo qui infine una serie di segnali che hanno scopi differenti non classificabili in maniera omogenea. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\signal{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione +\item[\signald{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione dell'utente che lo può usare per quello che vuole. Viene generato solo attraverso l'invocazione della funzione \func{kill}. Entrambi i segnali possono essere utili per implementare una comunicazione elementare fra processi diversi, o per eseguire a richiesta una operazione utilizzando un gestore. L'azione predefinita è di terminare il processo. -\item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per +\item[\signald{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 +\item[\signald{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni programmi testuali per riformattare l'uscita su schermo quando si cambia dimensione a quest'ultimo. L'azione predefinita è di essere ignorato. -\item[\signal{SIGINFO}] Il segnale indica una richiesta di informazioni. È +\item[\signald{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. 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 +\item[\signald{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 +\item[\signald{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} @@ -1048,7 +1048,7 @@ quanto non sia la versione originaria, che di norma è definita come: questa infatti, per la poca chiarezza della sintassi del C quando si vanno a trattare puntatori a funzioni, è molto meno comprensibile. Da un confronto con il precedente prototipo si può dedurre la definizione di -\type{sighandler\_t} che è: +\typed{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}. Si noti come si devono usare le @@ -1097,8 +1097,8 @@ 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 devono usare \func{sigaction}. +processo 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 @@ -1437,22 +1437,21 @@ Si deve comunque tenere presente che fino al kernel 2.6.16 la precisione di queste funzioni era limitata dalla frequenza del timer di sistema, determinato dal valore della costante \texttt{HZ} di cui abbiamo già parlato in sez.~\ref{sec:proc_hierarchy}, in quanto le temporizzazioni erano calcolate in -numero di interruzioni del timer (i cosiddetti \itindex{jiffies} -``\textit{jiffies}''), ed era assicurato soltanto che il segnale non sarebbe -stato mai generato prima della scadenza programmata (l'arrotondamento cioè era -effettuato per eccesso).\footnote{questo in realtà non è del tutto vero a - causa di un bug, presente fino al kernel 2.6.12, che in certe circostanze - causava l'emissione del segnale con un arrotondamento per difetto.} - -L'uso del contatore dei \itindex{jiffies} \textit{jiffies}, un intero a 32 bit -nella maggior parte dei casi, comportava inoltre l'impossibilità di -specificare tempi molto lunghi. superiori al valore della costante -\const{MAX\_SEC\_IN\_JIFFIES}, pari, nel caso di default di un valore di -\const{HZ} di 250, a circa 99 giorni e mezzo. Con il cambiamento della -rappresentazione effettuato nel kernel 2.6.16 questo problema è scomparso e -con l'introduzione dei timer ad alta risoluzione (vedi -sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la precisione è diventata -quella fornita dall'hardware disponibile. +numero di interruzioni del timer (i cosiddetti ``\textit{jiffies}''), ed era +assicurato soltanto che il segnale non sarebbe stato mai generato prima della +scadenza programmata (l'arrotondamento cioè era effettuato per +eccesso).\footnote{questo in realtà non è del tutto vero a causa di un bug, + presente fino al kernel 2.6.12, che in certe circostanze causava l'emissione + del segnale con un arrotondamento per difetto.} + +L'uso del contatore dei \textit{jiffies}, un intero a 32 bit nella maggior +parte dei casi, comportava inoltre l'impossibilità di specificare tempi molto +lunghi. superiori al valore della costante \const{MAX\_SEC\_IN\_JIFFIES}, +pari, nel caso di default di un valore di \const{HZ} di 250, a circa 99 giorni +e mezzo. Con il cambiamento della rappresentazione effettuato nel kernel +2.6.16 questo problema è scomparso e con l'introduzione dei timer ad alta +risoluzione (vedi sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la +precisione è diventata quella fornita dall'hardware disponibile. 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 @@ -1466,9 +1465,8 @@ in cui un timer scade prima che il segnale di una precedente scadenza sia stato consegnato. In questo caso, per il comportamento dei segnali descritto in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo oggi l'uso di questa funzione è deprecato a favore degli -\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della -cosiddetta \itindex{POSIX~Timer~API} \textit{POSIX Timer API}, che tratteremo -in sez.~\ref{sec:sig_timer_adv}. +\textit{high-resolution timer} e della cosiddetta \itindex{POSIX~Timer~API} +\textit{POSIX Timer API}, che tratteremo in sez.~\ref{sec:sig_timer_adv}. Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il valore corrente di un timer senza modificarlo, è possibile usare la funzione @@ -2148,7 +2146,10 @@ permette di usare un gestore più complesso, in grado di ricevere informazioni più dettagliate dal sistema, attraverso la struttura \struct{siginfo\_t}, riportata in fig.~\ref{fig:sig_siginfo_t}. I due campi devono essere usati in maniera alternativa, in certe implementazioni questi campi vengono addirittura -definiti come una \direct{union}. +definiti come una \direct{union}.\footnote{la direttiva \direct{union} del + linguaggio C definisce una variabile complessa, analoga a una stuttura, i + cui campi indicano i diversi tipi di valori che possono essere salvati, in + maniera alternativa, all'interno della stessa.} Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile accedere alle informazioni restituite attraverso il puntatore a questa @@ -2188,7 +2189,7 @@ altre informazioni specifiche. \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{8cm}|} + \begin{tabular}[c]{|l|p{10cm}|} \hline \textbf{Valore} & \textbf{Significato} \\ \hline @@ -2266,12 +2267,12 @@ riferimento. \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.\\ + \constd{CLD\_EXITED} & Il figlio è uscito.\\ + \constd{CLD\_KILLED} & Il figlio è stato terminato.\\ + \constd{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\ + \constd{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\ + \constd{CLD\_STOPPED} & Il figlio è stato fermato.\\ + \constd{CLD\_CONTINUED}& Il figlio è ripartito.\\ \hline \const{POLL\_IN} & Disponibili dati in ingresso.\\ \const{POLL\_OUT} & Spazio disponibile sul buffer di uscita.\\ @@ -2289,7 +2290,7 @@ riferimento. \end{table} Il resto della struttura \struct{siginfo\_t} è definito come una -\direct{union} ed i valori eventualmente presenti dipendono dal segnale +\dirct{union} ed i valori eventualmente presenti dipendono dal segnale ricevuto, così \signal{SIGCHLD} ed i segnali \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) inviati tramite \func{kill} avvalorano \var{si\_pid} e \var{si\_uid} coi valori corrispondenti al processo che ha @@ -2344,7 +2345,7 @@ semplificare la definizione si è poi definito un apposito tipo gestore di segnale. Si noti come, essendo la funzione estremamente semplice, essa è definita come -\direct{inline}. Questa direttiva viene usata per dire al compilatore di +\dirct{inline}. Questa direttiva 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 @@ -2547,7 +2548,7 @@ principale, cosa che ad esempio può rendere problematico chiamare all'interno di un gestore di segnali la stessa funzione che dal segnale è stata interrotta. -\index{funzioni!sicure|(} +\index{funzioni!\textit{signal safe}|(} Il concetto è comunque più generale e porta ad una distinzione fra quelle che POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e @@ -2610,7 +2611,7 @@ fig.~\ref{fig:sig_safe_functions}. \label{fig:sig_safe_functions} \end{figure} -\index{funzioni!sicure|)} +\index{funzioni!\textit{signal safe}|)} Lo standard POSIX.1-2004 modifica la lista di fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e @@ -2698,7 +2699,7 @@ Tutte queste nuove funzionalità eccetto l'ultima, che, come illustrato in sez.~\ref{sec:sig_sigaction}, è disponibile anche con i segnali ordinari, si applicano solo ai nuovi segnali \textit{real-time}; questi ultimi sono accessibili in un intervallo di valori specificati dalle due costanti -\const{SIGRTMIN} e \const{SIGRTMAX}, che specificano il numero minimo e +\constd{SIGRTMIN} e \constd{SIGRTMAX}, che specificano il numero minimo e massimo associato ad un segnale \textit{real-time}. Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1}, @@ -2755,12 +2756,12 @@ mentre per la restituzione dei dati viene usato il campo \var{si\_value}. \end{minipage} \normalsize \caption{La definizione dell'unione \structd{sigval}, definita anche come - tipo \type{sigval\_t}.} + tipo \typed{sigval\_t}.} \label{fig:sig_sigval} \end{figure} Detto campo, identificato con il tipo di dato \type{sigval\_t}, è una -\direct{union} di tipo \struct{sigval} (la sua definizione è in +\dirct{union} di tipo \struct{sigval} (la sua definizione è in fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico, se usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma \var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da @@ -2832,9 +2833,9 @@ sez.~\ref{sec:sys_resource_limit}. Lo standard POSIX.1b definisce inoltre delle nuove funzioni di sistema che permettono di gestire l'attesa di segnali specifici su una coda, esse servono -in particolar modo nel caso dei \itindex{thread} \textit{thread}, in cui si -possono usare i segnali \textit{real-time} come meccanismi di comunicazione -elementare; la prima di queste è \funcd{sigwait}, il cui prototipo è: +in particolar modo nel caso dei \textit{thread}, in cui si possono usare i +segnali \textit{real-time} come meccanismi di comunicazione elementare; la +prima di queste è \funcd{sigwait}, il cui prototipo è: \begin{funcproto}{ \fhead{signal.h} @@ -2869,7 +2870,7 @@ consegnato che essere ricevuto da \func{sigwait}, il tutto in maniera non prevedibile. Lo standard POSIX.1b definisce altre due funzioni di sistema, anch'esse usate -prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e +prevalentemente con i \textit{thread}; \funcd{sigwaitinfo} e \funcd{sigtimedwait}, i relativi prototipi sono: \begin{funcproto}{ @@ -2938,12 +2939,12 @@ dalla frequenza dello stesso che si ricordi, come già illustrato in sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}. I contatori usati per il calcolo dei tempi infatti erano basati sul numero di -\itindex{jiffies} \textit{jiffies} che vengono incrementati ad ogni -\textit{clock tick} del timer di sistema, il che comportava anche, come -accennato in sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per -il massimo periodo di tempo copribile da alcuni di questi orologi, come quelli -associati al \textit{process time} almeno fino a quando, con il kernel 2.6.16, -non è stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}. +\textit{jiffies} che vengono incrementati ad ogni \textit{clock tick} del +timer di sistema, il che comportava anche, come accennato in +sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per il massimo +periodo di tempo copribile da alcuni di questi orologi, come quelli associati +al \textit{process time} almeno fino a quando, con il kernel 2.6.16, non è +stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}. \itindbeg{POSIX~Timer~API} @@ -3009,12 +3010,10 @@ tab.~\ref{tab:sig_timer_clockid_types}. sez.~\ref{sec:sys_cpu_times}, nel totale di \textit{system time} e \textit{user time}) comprensivo di tutto il tempo di CPU usato - da eventuali \itindex{thread} - \textit{thread}.\\ + da eventuali \textit{thread}.\\ \const{CLOCK\_THREAD\_CPUTIME\_ID}& Contatore del tempo di CPU (\textit{user time} e \textit{system time}) - usato da un singolo \itindex{thread} - \textit{thread}.\\ + usato da un singolo \textit{thread}.\\ \hline \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli aggiustamenti dovuti all'uso di NTP (viene @@ -3042,7 +3041,7 @@ tab.~\ref{tab:sig_timer_clockid_types}. % \const{} & .\\ \hline \end{tabular} - \caption{Valori possibili per una variabile di tipo \type{clockid\_t} + \caption{Valori possibili per una variabile di tipo \typed{clockid\_t} usata per indicare a quale tipo di orologio si vuole fare riferimento.} \label{tab:sig_timer_clockid_types} \end{table} @@ -3340,12 +3339,12 @@ effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione segnale è stato installato con \const{SA\_SIGINFO} gli verrà restituito il valore specificato con \var{sigev\_value} (una - \direct{union} \texttt{sigval}, la cui definizione + \dirct{union} \texttt{sigval}, la cui definizione è in fig.~\ref{fig:sig_sigval}) come valore del campo \var{si\_value} di \struct{siginfo\_t}.\\ \const{SIGEV\_THREAD} & La notifica viene effettuata creando un nuovo - \itindex{thread} \textit{thread} che esegue la - funzione di notifica specificata da + \textit{thread} che esegue la funzione di + notifica specificata da \var{sigev\_notify\_function} con argomento \var{sigev\_value}. Se questo è diverso da \val{NULL}, il \textit{thread} viene creato con @@ -3382,7 +3381,7 @@ per \var{sigev\_notify}, \signal{SIGALRM} per \var{sigev\_signo} e l'identificatore del timer come valore per \var{sigev\_value.sival\_int}. Il terzo argomento deve essere l'indirizzo di una variabile di tipo -\type{timer\_t} dove sarà scritto l'identificativo associato al timer appena +\typed{timer\_t} dove sarà scritto l'identificativo associato al timer appena creato, da usare in tutte le successive funzioni di gestione. Una volta creato questo identificativo resterà univoco all'interno del processo stesso fintanto che il timer non viene cancellato. @@ -3810,7 +3809,7 @@ prototipi sono: Le due funzioni prendono come primo argomento la variabile su cui viene salvato il contesto dello \textit{stack} per permettere il salto non-locale; -nel caso specifico essa è di tipo \type{sigjmp\_buf}, e non \type{jmp\_buf} +nel caso specifico essa è di tipo \typed{sigjmp\_buf}, e non \type{jmp\_buf} come per le analoghe di sez.~\ref{sec:proc_longjmp} in quanto in questo caso viene salvata anche la maschera dei segnali.