X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=ef80f9532b5630d8bb1ddc553e42c95a06eb0ca3;hp=b4e869f818714f40360ff416284cad7b27ca10e0;hb=4aa6c51696d2b11c572eccd37238db1691785573;hpb=4cbeb0e4fa1d31da798c8e68108eb6785586ab34 diff --git a/signal.tex b/signal.tex index b4e869f..ef80f95 100644 --- a/signal.tex +++ b/signal.tex @@ -1,6 +1,6 @@ %% signal.tex %% -%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -352,10 +352,10 @@ cui viene salvata un'immagine della memoria del processo (il cosiddetto per esaminare lo stato dello \itindex{stack} \textit{stack} e delle variabili al momento della ricezione del segnale. -\begin{table}[htb] +\begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|c|c|p{8cm}|} + \begin{tabular}[c]{|l|c|c|l|} \hline \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\ \hline @@ -806,14 +806,15 @@ gestore; viene mantenuto invece ogni eventuale impostazione dell'azione a programmi eseguiti in background, che altrimenti sarebbero interrotti da una successiva pressione di \texttt{C-c} o \texttt{C-y}. -Per quanto riguarda il comportamento di tutte le altre system call si danno -sostanzialmente due casi, a seconda che esse siano \index{system~call~lente} -\textsl{lente} (\textit{slow}) o \textsl{veloci} (\textit{fast}). La gran -parte di esse appartiene a quest'ultima categoria, che non è influenzata -dall'arrivo di un segnale. Esse sono dette \textsl{veloci} in quanto la loro -esecuzione è sostanzialmente immediata; la risposta al segnale viene sempre -data dopo che la system call è stata completata, in quanto attendere per -eseguire un gestore non comporta nessun inconveniente. +Per quanto riguarda il comportamento di tutte le altre \textit{system call} si +danno sostanzialmente due casi, a seconda che esse siano +\index{system~call~lente} \textsl{lente} (\textit{slow}) o \textsl{veloci} +(\textit{fast}). La gran parte di esse appartiene a quest'ultima categoria, +che non è influenzata dall'arrivo di un segnale. Esse sono dette +\textsl{veloci} in quanto la loro esecuzione è sostanzialmente immediata; la +risposta al segnale viene sempre data dopo che la \textit{system call} è stata +completata, in quanto attendere per eseguire un gestore non comporta nessun +inconveniente. In alcuni casi però alcune system call (che per questo motivo vengono chiamate \textsl{lente}) possono bloccarsi indefinitamente. In questo caso non si può @@ -1014,7 +1015,7 @@ specificare il segnale nullo. Se la funzione viene chiamata con questo valore non viene inviato nessun segnale, ma viene eseguito il controllo degli errori, in tal caso si otterrà un errore \errcode{EPERM} se non si hanno i permessi necessari ed un errore \errcode{ESRCH} se il processo specificato non esiste. -Si tenga conto però che il sistema ricicla i \acr{pid} (come accennato in +Si tenga conto però che il sistema ricicla i \ids{PID} (come accennato in sez.~\ref{sec:proc_pid}) per cui l'esistenza di un processo non significa che esso sia realmente quello a cui si intendeva mandare il segnale. @@ -1050,7 +1051,7 @@ Una seconda funzione che può essere definita in termini di \func{kill} è \textbf{Valore} & \textbf{Significato} \\ \hline \hline - $>0$ & Il segnale è mandato al processo con il \acr{pid} indicato.\\ + $>0$ & Il segnale è mandato al processo con il \ids{PID} indicato.\\ 0 & Il segnale è mandato ad ogni processo del \itindex{process~group} \textit{process group} del chiamante.\\ $-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\ @@ -1064,9 +1065,9 @@ Una seconda funzione che può essere definita in termini di \func{kill} è \end{table} Solo l'amministratore può inviare un segnale ad un processo qualunque, in -tutti gli altri casi l'user-ID reale o l'user-ID effettivo del processo -chiamante devono corrispondere all'user-ID reale o all'user-ID salvato della -destinazione. Fa eccezione il caso in cui il segnale inviato sia +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 @@ -1438,24 +1439,25 @@ conclusione di un processo è quella di inviare questo segnale al padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il segnale si chiama \signal{SIGCLD} e viene trattato in maniera speciale; in System V infatti se si imposta esplicitamente l'azione a \const{SIG\_IGN} il - segnale non viene generato ed il sistema non genera \index{zombie} zombie - (lo stato di terminazione viene scartato senza dover chiamare una - \func{wait}). L'azione predefinita è sempre quella di ignorare il segnale, - ma non attiva questo comportamento. Linux, come BSD e POSIX, non supporta - questa semantica ed usa il nome di \signal{SIGCLD} come sinonimo di + segnale non viene generato ed il sistema non genera \itindex{zombie} + \textit{zombie} (lo stato di terminazione viene scartato senza dover + chiamare una \func{wait}). L'azione predefinita è sempre quella di ignorare + il segnale, ma non attiva questo comportamento. Linux, come BSD e POSIX, non + supporta questa semantica ed usa il nome di \signal{SIGCLD} come sinonimo di \signal{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo stato di uscita di un processo, si può completare la gestione della terminazione installando un gestore per \signal{SIGCHLD} il cui unico compito sia quello di chiamare \func{waitpid} per completare la procedura di -terminazione in modo da evitare la formazione di \index{zombie} zombie. +terminazione in modo da evitare la formazione di \itindex{zombie} +\textit{zombie}. In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una -implementazione generica di una funzione di gestione per \signal{SIGCHLD}, (che -si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i test -di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione -\cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come -gestore di \signal{SIGCHLD}) potremo verificare che non si ha più la creazione -di \index{zombie} zombie. +implementazione generica di una funzione di gestione per \signal{SIGCHLD}, +(che si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i +test di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con +l'opzione \cmd{-s} (che si limita ad effettuare l'installazione di questa +funzione come gestore di \signal{SIGCHLD}) potremo verificare che non si ha +più la creazione di \itindex{zombie} \textit{zombie}. \begin{figure}[!htbp] \footnotesize \centering @@ -1495,7 +1497,8 @@ rimosso verrà recapitato un solo segnale. Allora, nel caso della terminazione dei processi figli, se si chiamasse \func{waitpid} una sola volta, essa leggerebbe lo stato di terminazione per un solo processo, anche se i processi terminati sono più di uno, e gli altri -resterebbero in stato di \index{zombie} zombie per un tempo indefinito. +resterebbero in stato di \itindex{zombie} \textit{zombie} per un tempo +indefinito. Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non ritorni un valore nullo, segno che non resta nessun processo di cui si debba @@ -1814,8 +1817,8 @@ tab.~\ref{tab:sig_sa_flag}. \var{sa\_sigaction} al posto di \var{sa\_handler}.\\ \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} allora i processi - figli non diventano \textit{zombie} quando - terminano.\footnotemark \\ + figli non diventano \itindex{zombie} + \textit{zombie} quando terminano.\footnotemark \\ \hline \end{tabular} \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.} @@ -2420,7 +2423,7 @@ fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori in forma estesa. In particolare i campi utilizzati dai segnali \textit{real-time} sono \var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il -\acr{pid} e l'user-ID effettivo del processo che ha inviato il segnale, mentre +\ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale, mentre per la restituzione dei dati viene usato il campo \var{si\_value}. \begin{figure}[!htb] @@ -2493,7 +2496,7 @@ Secondo lo standard POSIX la profondità della coda è indicata dalla costante \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux la coda ha una dimensione variabile; fino alla versione 2.6.7 c'era un limite massimo globale che poteva essere impostato come parametro del kernel in -\procfile{/proc/sys/kernel/rtsig-max};\footnote{ed il valore predefinito era +\sysctlfile{kernel/rtsig-max};\footnote{ed il valore predefinito era pari a 1024.} a partire dal kernel 2.6.8 il valore globale è stato rimosso e sostituito dalla risorsa \const{RLIMIT\_SIGPENDING} associata al singolo utente, che può essere modificata con \func{setrlimit} come illustrato in @@ -3389,6 +3392,10 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, è assolutamente identica a \func{longjmp}. +% TODO: se e quando si troverà un argomento adeguato inserire altre funzioni +% sparse attinenti ai segnali, al momento sono note solo: +% * sigreturn (funzione interna, scarsamente interessante) +% argomento a priorità IDLE (fare quando non resta niente altro da trattare) % LocalWords: kernel POSIX timer shell control ctrl kill raise signal handler