X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=5c526dfec4e17a394d79ef291303a8a759b25b5f;hp=7e882abcd86f9ebdc60a8a247c572a1ebe8160e0;hb=4cbeb0e4fa1d31da798c8e68108eb6785586ab34;hpb=9a577c89dd563aacbc619e09bf8b6d99b533274a diff --git a/prochand.tex b/prochand.tex index 7e882ab..5c526df 100644 --- a/prochand.tex +++ b/prochand.tex @@ -671,7 +671,7 @@ Le differenze fra padre e figlio dopo la \func{fork} invece sono:\footnote{a sez.~\ref{sec:file_memory_map}) che non vengono ereditate dal figlio; \item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:process_prctl}) che notifica al figlio la terminazione del padre viene cancellata; -\item il segnale di terminazione del figlio è sempre \const{SIGCHLD} anche +\item il segnale di terminazione del figlio è sempre \signal{SIGCHLD} anche qualora nel padre fosse stato modificato (vedi sez.~\ref{sec:process_clone}). \end{itemize*} @@ -717,7 +717,7 @@ modalità di conclusione anomala; queste sono in sostanza due: il programma può chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere terminato da un segnale (torneremo sui segnali in cap.~\ref{cha:signals}). In realtà anche la prima modalità si riconduce alla seconda, dato che -\func{abort} si limita a generare il segnale \const{SIGABRT}. +\func{abort} si limita a generare il segnale \signal{SIGABRT}. Qualunque sia la modalità di conclusione di un processo, il kernel esegue comunque una serie di operazioni: chiude tutti i file aperti, rilascia la @@ -728,15 +728,15 @@ eseguite alla chiusura di un processo è il seguente: \item viene memorizzato lo stato di terminazione del processo; \item ad ogni processo figlio viene assegnato un nuovo padre (in genere \cmd{init}); -\item viene inviato il segnale \const{SIGCHLD} al processo padre (vedi +\item viene inviato il segnale \signal{SIGCHLD} al processo padre (vedi sez.~\ref{sec:sig_sigchld}); \item se il processo è un leader di sessione ed il suo terminale di controllo - è quello della sessione viene mandato un segnale di \const{SIGHUP} a tutti i + è quello della sessione viene mandato un segnale di \signal{SIGHUP} a tutti i processi del gruppo di \textit{foreground} e il terminale di controllo viene disconnesso (vedi sez.~\ref{sec:sess_ctrl_term}); \item se la conclusione di un processo rende orfano un \textit{process group} ciascun membro del gruppo viene bloccato, e poi gli vengono - inviati in successione i segnali \const{SIGHUP} e \const{SIGCONT} + inviati in successione i segnali \signal{SIGHUP} e \signal{SIGCONT} (vedi ancora sez.~\ref{sec:sess_ctrl_term}). \end{itemize*} @@ -1004,7 +1004,7 @@ sez.~\ref{sec:thread_xxx}). \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone} (vedi sez.~\ref{sec:process_clone}), vale a dire processi che non emettono nessun segnale - o emettono un segnale diverso da \const{SIGCHLD} alla + o emettono un segnale diverso da \signal{SIGCHLD} alla terminazione. \\ \const{\_\_WALL} & Attende per qualunque processo figlio. \\ \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread} @@ -1038,7 +1038,7 @@ quando un processo figlio entra nello stato \textit{stopped}\footnote{in sez.~\ref{sec:process_ptrace}).} (vedi tab.~\ref{tab:proc_proc_states}), mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato \textit{stopped} riprende l'esecuzione per la ricezione del segnale -\const{SIGCONT} (l'uso di questi segnali per il controllo di sessione è +\signal{SIGCONT} (l'uso di questi segnali per il controllo di sessione è dettagliato in sez.~\ref{sec:sess_ctrl_term}). La terminazione di un processo figlio (così come gli altri eventi osservabili @@ -1046,7 +1046,7 @@ con \func{waitpid}) è chiaramente un evento asincrono rispetto all'esecuzione di un programma e può avvenire in un qualunque momento. Per questo motivo, come accennato nella sezione precedente, una delle azioni prese dal kernel alla conclusione di un processo è quella di mandare un segnale di -\const{SIGCHLD} al padre. L'azione predefinita (si veda +\signal{SIGCHLD} al padre. L'azione predefinita (si veda sez.~\ref{sec:sig_base}) per questo segnale è di essere ignorato, ma la sua generazione costituisce il meccanismo di comunicazione asincrona con cui il kernel avverte il processo padre che uno dei suoi figli è terminato. @@ -1055,7 +1055,7 @@ Il comportamento delle funzioni è però cambiato nel passaggio dal kernel 2.4 al kernel 2.6, quest'ultimo infatti si è adeguato alle prescrizioni dello standard POSIX.1-2001,\footnote{una revisione del 2001 dello standard POSIX.1 che ha aggiunto dei requisiti e delle nuove funzioni, come \func{waitid}.} -e come da esso richiesto se \const{SIGCHLD} viene ignorato, o se si imposta il +e come da esso richiesto se \signal{SIGCHLD} viene ignorato, o se si imposta il flag di \const{SA\_NOCLDSTOP} nella ricezione dello stesso (si veda sez.~\ref{sec:sig_sigaction}) i processi figli che terminano non diventano \textit{zombie} e sia \func{wait} che \func{waitpid} si bloccano fintanto che @@ -1063,13 +1063,13 @@ tutti i processi figli non sono terminati, dopo di che falliscono con un errore di \errcode{ENOCHLD}.\footnote{questo è anche il motivo per cui le opzioni \const{WUNTRACED} e \const{WCONTINUED} sono utilizzabili soltanto qualora non si sia impostato il flag di \const{SA\_NOCLDSTOP} per il segnale - \const{SIGCHLD}.} + \signal{SIGCHLD}.} Con i kernel della serie 2.4 e tutti i kernel delle serie precedenti entrambe le funzioni di attesa ignorano questa prescrizione\footnote{lo standard POSIX.1 originale infatti lascia indefinito il comportamento di queste funzioni - quando \const{SIGCHLD} viene ignorato.} e si comportano sempre nello stesso -modo, indipendentemente dal fatto \const{SIGCHLD} sia ignorato o meno: + quando \signal{SIGCHLD} viene ignorato.} e si comportano sempre nello stesso +modo, indipendentemente dal fatto \signal{SIGCHLD} sia ignorato o meno: attendono la terminazione di un processo figlio e ritornano il relativo \acr{pid} e lo stato di terminazione nell'argomento \param{status}. @@ -1112,7 +1112,7 @@ attendono la terminazione di un processo figlio e ritornano il relativo nullo. \\ \macro{WIFCONTINUED(s)}& Vera se il processo che ha causato il ritorno è stato riavviato da un - \const{SIGCONT}.\footnotemark \\ + \signal{SIGCONT}.\footnotemark \\ \hline \end{tabular} \caption{Descrizione delle varie macro di preprocessore utilizzabili per @@ -1134,7 +1134,7 @@ la presenza di \index{zombie} \textit{zombie}). Per questo la modalità più comune di chiamare queste funzioni è quella di utilizzarle all'interno di un \textit{signal handler} (vedremo un esempio di -come gestire \const{SIGCHLD} con i segnali in sez.~\ref{sec:sig_example}). In +come gestire \signal{SIGCHLD} con i segnali in sez.~\ref{sec:sig_example}). In questo caso infatti, dato che il segnale è generato dalla terminazione di un figlio, avremo la certezza che la chiamata a \func{waitpid} non si bloccherà. @@ -1276,7 +1276,7 @@ campi: \item[\var{si\_pid}] con il \acr{pid} del figlio. \item[\var{si\_uid}] con l'user-ID reale (vedi sez.~\ref{sec:proc_perms}) del figlio. -\item[\var{si\_signo}] con \const{SIGCHLD}. +\item[\var{si\_signo}] con \signal{SIGCHLD}. \item[\var{si\_status}] con lo stato di uscita del figlio o con il segnale che lo ha terminato, fermato o riavviato. \item[\var{si\_code}] con uno fra \const{CLD\_EXITED}, \const{CLD\_KILLED}, @@ -1521,7 +1521,7 @@ I segnali che sono stati impostati per essere ignorati nel processo chiamante mantengono la stessa impostazione pure nel nuovo programma, ma tutti gli altri segnali, ed in particolare quelli per i quali è stato installato un gestore vengono impostati alla loro azione predefinita (vedi -sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \const{SIGCHLD} +sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \signal{SIGCHLD} che, quando impostato a \const{SIG\_IGN}, potrebbe anche essere reimpostato a \const{SIG\_DFL}, anche se questo con Linux non avviene.\footnote{lo standard POSIX.1-2001 prevede che questo comportamento sia deciso dalla singola @@ -1548,7 +1548,7 @@ nell'esecuzione della funzione \func{exec}, queste sono: sez.~\ref{sec:process_prctl}) viene cancellato; \item il nome del processo viene impostato al nome del file contenente il programma messo in esecuzione; -\item il segnale di terminazione viene reimpostato a \const{SIGCHLD}; +\item il segnale di terminazione viene reimpostato a \signal{SIGCHLD}; \item l'ambiente viene reinizializzato impostando le variabili attinenti alla localizzazione al valore di default POSIX. \end{itemize*} @@ -2260,7 +2260,7 @@ fintanto che esso si trova in uno qualunque degli altri stati. genere per I/O), e non può essere interrotto in nessuna circostanza.\\ \textbf{Stopped} & \texttt{T} & Il processo è stato fermato con un - \const{SIGSTOP}, o è tracciato.\\ + \signal{SIGSTOP}, o è tracciato.\\ \textbf{Zombie}\index{zombie} & \texttt{Z} & Il processo è terminato ma il suo stato di terminazione non è ancora stato letto dal padre.\\ @@ -2268,7 +2268,7 @@ fintanto che esso si trova in uno qualunque degli altri stati. 2.6.25, sostanzialmente identico all'\textbf{Uninterrutible Sleep} con la sola differenza che il processo può - terminato con \const{SIGKILL} (usato per + terminato con \signal{SIGKILL} (usato per lo più per NFS).\\ \hline \end{tabular} @@ -3002,7 +3002,7 @@ nell'evitare la perdita della cache da rendere conveniente l'uso dell'affinità di processore. Per facilitare l'uso dell'argomento \param{cpuset} le \acr{glibc} hanno -introdotto un apposito dato di tipo, \ctyp{cpu\_set\_t},\footnote{questa è una +introdotto un apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione specifica delle \acr{glibc}, da attivare definendo la macro \macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per questo tipo di interfaccia e POSIX al momento non prevede nulla al @@ -3361,7 +3361,7 @@ vedremo a breve, consente anche di passare per \param{child\_stack} il valore \val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un processo, questo ottiene un suo nuovo spazio degli indirizzi,\footnote{è sottinteso cioè che non si stia usando il flag \const{CLONE\_VM}.} ed in -questo caso si applica la semantica del \itindex{copy-on-write} \textit{copy +questo caso si applica la semantica del \itindex{copy~on~write} \textit{copy on write} illustrata in sez.~\ref{sec:proc_fork}, per cui le pagine dello \textit{stack} verranno automaticamente copiate come le altre e il nuovo processo avrà un suo \textit{stack} totalmente indipendente da quello del @@ -3531,14 +3531,14 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: PowerPC. \item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianess} del processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve - essere passata come di tipo \type{(int *)}. Introdotta a partire dal kernel + essere passata come di tipo \ctyp{(int *)}. Introdotta a partire dal kernel 2.6.18, solo su PowerPC. \item[\const{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione della virgola mobile su architettura ia64, secondo il valore di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in maniera trasparente l'accesso alle operazioni in virgola mobile, o \const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale - \const{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire + \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire dal kernel 2.4.18, solo su ia64. \item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo dell'emulazione della virgola mobile, salvato all'indirizzo puntato @@ -3588,7 +3588,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: \item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un segnale, che sarà ricevuto dal processo chiamante, in occorrenza della terminazione del proprio processo padre; in sostanza consente di invertire - il ruolo di \const{SIGCHLD}. Il valore di \param{arg2} deve indicare il + il ruolo di \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il numero del segnale, o 0 per disabilitare l'emissione. Il valore viene automaticamente cancellato per un processo figlio creato con \func{fork}. Introdotta a partire dal kernel 2.1.57. @@ -3646,7 +3646,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la - generazione di un segnale di \const{SIGSEGV} (vedi + generazione di un segnale di \signal{SIGSEGV} (vedi sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente disabilitata se si attiva il \textit{secure computing mode}. Introdotta a partire dal kernel 2.6.26, solo su x86. @@ -3662,7 +3662,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: illegali, da indicare con il valore di \param{arg2}. Si deve specificare il valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di - \const{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non + \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non allineato. Introdotta con diverse versioni su diverse architetture. \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo @@ -3675,7 +3675,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: piattaforme più avanzate che hanno il supporto hardware per questo tipo di controlli.} ma devono essere opportunamente riportati ai processi che usano quella parte di RAM che presenta errori; nel caso specifico questo - avviene attraverso l'emissione di un segnale di \const{SIGBUS} (vedi + avviene attraverso l'emissione di un segnale di \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche impostato il valore di \var{si\_code} in \struct{siginfo\_t} a \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia @@ -3697,7 +3697,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento: due, che corrispondono anche al valore che si trova nell'impostazione generale di sistema di \texttt{memory\_failure\_early\_kill}, con \const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di - \const{SIGBUS} non appena viene rilevato un errore, mentre con + \signal{SIGBUS} non appena viene rilevato un errore, mentre con \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo tenterà un accesso alla memoria corrotta. Questi due valori corrispondono rispettivamente ai valori 1 e 0 di @@ -3881,7 +3881,8 @@ queste infatti vengono allocate nello \itindex{stack} \textit{stack}, ed un'altra invocazione non fa altro che allocarne un'altra copia. Una funzione può non essere rientrante quando opera su memoria che non è nello \itindex{stack} \textit{stack}. Ad esempio una funzione non è mai rientrante -se usa una variabile globale o statica. +se usa una \index{variabili!globali} variabile globale o +\index{variabili!statiche} statica. Nel caso invece la funzione operi su un oggetto allocato dinamicamente, la cosa viene a dipendere da come avvengono le operazioni: se l'oggetto è creato @@ -3894,12 +3895,12 @@ se viene passato lo stesso oggetto; in tutti questi casi occorre molta cura da parte del programmatore. In genere le funzioni di libreria non sono rientranti, molte di esse ad -esempio utilizzano variabili statiche, le \acr{glibc} però mettono a -disposizione due macro di compilatore,\footnote{si ricordi quanto illustrato - in sez.~\ref{sec:intro_gcc_glibc_std}.} \macro{\_REENTRANT} e -\macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di -varie funzioni di libreria, che sono identificate aggiungendo il suffisso -\code{\_r} al nome della versione normale. +esempio utilizzano \index{variabili!statiche} variabili statiche, le +\acr{glibc} però mettono a disposizione due macro di compilatore,\footnote{si + ricordi quanto illustrato in sez.~\ref{sec:intro_gcc_glibc_std}.} +\macro{\_REENTRANT} e \macro{\_THREAD\_SAFE}, la cui definizione attiva le +versioni rientranti di varie funzioni di libreria, che sono identificate +aggiungendo il suffisso \code{\_r} al nome della versione normale. \index{funzioni!rientranti|)}