X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=prochand.tex;h=a6b8484628ed44335402b1bd7d0ce95b56dd9508;hb=60e20d29c0515f95b8a171fb33c7214c9bf92021;hp=ada9b4f555ff5818b315056fecccf83a9a422c15;hpb=6ffcce00491cea4ac7c621fe412269f15ee23f57;p=gapil.git diff --git a/prochand.tex b/prochand.tex index ada9b4f..a6b8484 100644 --- a/prochand.tex +++ b/prochand.tex @@ -44,8 +44,8 @@ caratteristiche di Unix (che esamineremo in dettaglio pi qualunque processo può a sua volta generarne altri, detti processi figli (\textit{child process}). Ogni processo è identificato presso il sistema da un numero univoco, il cosiddetto \textit{process identifier} o, più brevemente, -\acr{pid}, assegnato in forma progressiva (vedi sez.~\ref{sec:proc_pid}) quando -il processo viene creato. +\acr{pid}, assegnato in forma progressiva (vedi sez.~\ref{sec:proc_pid}) +quando il processo viene creato. Una seconda caratteristica di un sistema Unix è che la generazione di un processo è un'operazione separata rispetto al lancio di un programma. In @@ -672,9 +672,9 @@ terminazione del processo da parte del kernel). Ma abbiamo accennato che oltre alla conclusione normale esistono anche delle 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. In realtà anche la prima modalità si riconduce alla -seconda, dato che \func{abort} si limita a generare il segnale -\const{SIGABRT}. +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}. Qualunque sia la modalità di conclusione di un processo, il kernel esegue comunque una serie di operazioni: chiude tutti i file aperti, rilascia la @@ -828,7 +828,8 @@ terminare il processo che li ha generati, in modo che \cmd{init} possa adottarli e provvedere a concluderne la terminazione. -\subsection{Le funzioni \func{wait} e \func{waitpid}} +\subsection{La funzione \func{waitpid} e le funzioni di ricezione degli stati + di uscita} \label{sec:proc_wait} Uno degli usi più comuni delle capacità multitasking di un sistema unix-like @@ -837,7 +838,7 @@ principale attende le richieste che vengono poi soddisfatte da una serie di processi figli. Si è già sottolineato al paragrafo precedente come in questo caso diventi necessario gestire esplicitamente la conclusione dei figli onde evitare di riempire di \index{zombie} \textit{zombie} la tabella dei processi; -le funzioni deputate a questo compito sono sostanzialmente due, \funcd{wait} e +le funzioni deputate a questo compito sono principalmente due, \funcd{wait} e \func{waitpid}. La prima, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} @@ -876,10 +877,10 @@ Per questo motivo lo standard POSIX.1 ha introdotto la funzione \funcd{waitpid} che effettua lo stesso servizio, ma dispone di una serie di funzionalità più ampie, legate anche al controllo di sessione (si veda sez.~\ref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso -comportamento di \func{wait}\footnote{in effetti eseguire il codice - \code{wait(\&s)} è del tutto equivalente a \code{waitpid(WAIT\_ANY}, \&s, - 0)}. } si consiglia di utilizzare sempre questa funzione, il cui prototipo -è: +comportamento di \func{wait}\footnote{in effetti il codice + \code{wait(\&status)} è del tutto equivalente a \code{waitpid(WAIT\_ANY, + \&status, 0)}.} si consiglia di utilizzare sempre questa funzione, il cui +prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/wait.h} @@ -890,19 +891,20 @@ Attende la conclusione di un processo figlio. è stata specificata l'opzione \const{WNOHANG} e il processo non è uscito e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINTR}] se non è stata specificata l'opzione \const{WNOHANG} e + \item[\errcode{EINTR}] non è stata specificata l'opzione \const{WNOHANG} e la funzione è stata interrotta da un segnale. \item[\errcode{ECHILD}] il processo specificato da \param{pid} non esiste o non è figlio del processo chiamante. + \item[\errcode{EINVAL}] si è specificato un valore non valido per + l'argomento \param{options}. \end{errlist}} \end{functions} -Le differenze principali fra le due funzioni sono che \func{wait} si blocca -sempre fino a che un processo figlio non termina, mentre \func{waitpid} ha la -possibilità si specificare un'opzione \const{WNOHANG} che ne previene il -blocco; inoltre \func{waitpid} può specificare in maniera flessibile quale -processo attendere, sulla base del valore fornito dall'argomento \param{pid}, -secondo lo specchietto riportato in tab.~\ref{tab:proc_waidpid_pid}. +La prima differenza fra le due funzioni è che con \func{waitpid} si può +specificare in maniera flessibile quale processo attendere, sulla base del +valore fornito dall'argomento \param{pid}, questo può assumere diversi valori, +secondo lo specchietto riportato in tab.~\ref{tab:proc_waidpid_pid}, dove si +sono riportate anche le costanti definite per indicare alcuni di essi. \begin{table}[!htb] \centering @@ -912,16 +914,18 @@ secondo lo specchietto riportato in tab.~\ref{tab:proc_waidpid_pid}. \textbf{Valore} & \textbf{Costante} &\textbf{Significato}\\ \hline \hline - $<-1$& -- & attende per un figlio il cui + $<-1$& -- & Attende per un figlio il cui \itindex{process~group} \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) è uguale al valore assoluto di \param{pid}. \\ - $-1$& \const{WAIT\_ANY} & attende per un figlio qualsiasi, usata in - questa maniera è equivalente a \func{wait}.\\ - $0$ &\const{WAIT\_MYPGRP}&attende per un figlio il cui - \itindex{process~group} \textit{process group} è + $-1$&\const{WAIT\_ANY} & Attende per un figlio qualsiasi, usata in + questa maniera senza specificare nessuna opzione + è equivalente a \func{wait}.\\ + $ 0$&\const{WAIT\_MYPGRP}&Attende per un figlio il cui + \itindex{process~group} \textit{process group} + (vedi sez.~\ref{sec:sess_proc_group}) è uguale a quello del processo chiamante. \\ - $>0$& -- & attende per un figlio il cui \acr{pid} è uguale + $>0$& -- & Attende per un figlio il cui \acr{pid} è uguale al valore di \param{pid}.\\ \hline \end{tabular} @@ -930,45 +934,123 @@ secondo lo specchietto riportato in tab.~\ref{tab:proc_waidpid_pid}. \label{tab:proc_waidpid_pid} \end{table} -Il comportamento di \func{waitpid} può inoltre essere modificato passando -delle opportune opzioni tramite l'argomento \param{option}. I valori possibili -sono il già citato \const{WNOHANG}, che previene il blocco della funzione -quando il processo figlio non è terminato, e \const{WUNTRACED} che permette di -tracciare i processi bloccati. Il valore dell'opzione deve essere specificato -come maschera binaria ottenuta con l'OR delle suddette costanti con zero. - -In genere si utilizza \const{WUNTRACED} all'interno del controllo di sessione, -(l'argomento è trattato in sez.~\ref{sec:sess_job_control}). In tal caso -infatti la funzione ritorna, restituendone il \acr{pid}, quando c'è un -processo figlio che è entrato in stato di sleep (vedi -tab.~\ref{tab:proc_proc_states}) e del quale non si è ancora letto lo stato -(con questa stessa opzione). In Linux sono previste altre opzioni non standard -relative al comportamento con i thread, che riprenderemo in -sez.~\ref{sec:thread_xxx}. - -La terminazione di un processo figlio è 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 +Il comportamento di \func{waitpid} può inoltre essere modificato passando alla +funzione delle opportune opzioni tramite l'argomento \param{options}; questo +deve essere specificato come maschera binaria dei flag riportati in +tab.~\ref{tab:proc_waitpid_options},\footnote{oltre a queste in Linux sono + previste del altre opzioni non standard, relative al comportamento con i + thread, che riprenderemo in sez.~\ref{sec:thread_xxx}.} che possono essere +combinati fra loro con un OR aritmetico. + +L'uso dell'opzione \const{WNOHANG} consente di prevenire il blocco della +funzione qualora nessun figlio sia uscito (o non si siano verificate le altre +condizioni per l'uscita della funzione); in tal caso la funzione ritornerà un +valore nullo anziché positivo.\footnote{anche in questo caso un valore + positivo indicherà il \acr{pid} del processo di cui si è ricevuto lo stato + ed un valore negativo un errore.} + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Macro} & \textbf{Descrizione}\\ + \hline + \hline + \const{WNOHANG} & La funzione ritorna immediatamente anche se non è + terminato nessun processo figlio. \\ + \const{WUNTRACED} & Ritorna anche se un processo figlio è stato fermato. \\ + \const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato + fermato ha ripreso l'esecuzione.\footnotemark \\ + \hline + \end{tabular} + \caption{Costanti che identificano i bit dell'argomento \param{options} + della funzione \func{waitpid}.} + \label{tab:proc_waitpid_options} +\end{table} + +\footnotetext{disponibile solo a partire dal kernel 2.6.10.} + +Le altre due opzioni \const{WUNTRACED} e \const{WCONTINUED} consentono +rispettivamente di tracciare non la terminazione di un processo, ma il fatto +che esso sia stato fermato, o fatto ripartire, e sono utilizzate per la +gestione del controllo di sessione (vedi sez.~\ref{sec:sess_job_control}). + +Nel caso di \const{WUNTRACED} la funzione ritorna, restituendone il \acr{pid}, +quando un processo figlio entra nello stato \textit{stopped}\footnote{in + realtà viene notificato soltanto il caso in cui il processo è stato fermato + da un segnale di stop (vedi sez.~\ref{sec:sess_ctrl_term}), e non quello in + cui lo stato \textit{stopped} è dovuto all'uso di \func{ptrace} (vedi + sez.~\ref{sec:xxx_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 è +dettagliato in sez.~\ref{sec:sess_ctrl_term}). + +La terminazione di un processo figlio (così come gli altri eventi osservabili +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 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. -In genere in un programma non si vuole essere forzati ad attendere la -conclusione di un processo per proseguire, specie se tutto questo serve solo -per leggerne lo stato di chiusura (ed evitare la presenza di \index{zombie} -\textit{zombie}), per questo la modalità più usata per 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 questo caso infatti, dato che il segnale è -generato dalla terminazione di un figlio, avremo la certezza che la chiamata a -\func{wait} non si bloccherà. +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 +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 +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}.} + +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: +attendono la terminazione di un processo figlio e ritornano il relativo +\acr{pid} e lo stato di terminazione nell'argomento \param{status}. + +In generale in un programma non si vuole essere forzati ad attendere la +conclusione di un processo figlio per proseguire l'esecuzione, specie se tutto +questo serve solo per leggerne lo stato di chiusura (ed evitare eventualmente +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 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à. + +Come accennato sia \func{wait} che \func{waitpid} restituiscono lo stato di +terminazione del processo tramite il puntatore \param{status} (se non +interessa memorizzare lo stato si può passare un puntatore nullo). Il valore +restituito da entrambe le funzioni dipende dall'implementazione, ma +tradizionalmente alcuni bit (in genere 8) sono riservati per memorizzare lo +stato di uscita, e altri per indicare il segnale che ha causato la +terminazione (in caso di conclusione anomala), uno per indicare se è stato +generato un \itindex{core~dump} \textit{core dump}, ecc.\footnote{le + definizioni esatte si possono trovare in \file{} ma + questo file non deve mai essere usato direttamente, esso viene incluso + attraverso \file{}.} + +Lo standard POSIX.1 definisce una serie di macro di preprocessore da usare per +analizzare lo stato di uscita. Esse sono definite sempre in +\file{} ed elencate in tab.~\ref{tab:proc_status_macro} (si tenga +presente che queste macro prendono come parametro la variabile di tipo +\ctyp{int} puntata da \param{status}). \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|c|p{10cm}|} + \begin{tabular}[c]{|l|p{10cm}|} \hline \textbf{Macro} & \textbf{Descrizione}\\ \hline @@ -978,29 +1060,33 @@ generato dalla terminazione di un figlio, avremo la certezza che la chiamata a \macro{WEXITSTATUS(s)} & Restituisce gli otto bit meno significativi dello stato di uscita del processo (passato attraverso \func{\_exit}, \func{exit} o come valore di - ritorno di \func{main}). Può essere valutata solo + ritorno di \func{main}); può essere valutata solo se \val{WIFEXITED} ha restituito un valore non nullo.\\ - \macro{WIFSIGNALED(s)} & Vera se il processo figlio è terminato + \macro{WIFSIGNALED(s)} & Condizione vera se il processo figlio è terminato in maniera anomala a causa di un segnale che non è stato catturato (vedi sez.~\ref{sec:sig_notification}).\\ \macro{WTERMSIG(s)} & Restituisce il numero del segnale che ha causato - la terminazione anomala del processo. Può essere + la terminazione anomala del processo; può essere valutata solo se \val{WIFSIGNALED} ha restituito un valore non nullo.\\ \macro{WCOREDUMP(s)} & Vera se il processo terminato ha generato un file di \itindex{core~dump} \textit{core - dump}. Può essere valutata solo se + dump}; può essere valutata solo se \val{WIFSIGNALED} ha restituito un valore non nullo.\footnotemark \\ \macro{WIFSTOPPED(s)} & Vera se il processo che ha causato il ritorno di - \func{waitpid} è bloccato. L'uso è possibile solo - avendo specificato l'opzione \const{WUNTRACED}. \\ + \func{waitpid} è bloccato; l'uso è possibile solo + con \func{waitpid} avendo specificato l'opzione + \const{WUNTRACED}.\\ \macro{WSTOPSIG(s)} & Restituisce il numero del segnale che ha bloccato - il processo. Può essere valutata solo se + il processo; può essere valutata solo se \val{WIFSTOPPED} ha restituito un valore non nullo. \\ + \macro{WIFCONTINUED(s)}& Vera se il processo che ha causato il ritorno è + stato riavviato da un + \const{SIGCONT}.\footnotemark \\ \hline \end{tabular} \caption{Descrizione delle varie macro di preprocessore utilizzabili per @@ -1008,39 +1094,147 @@ generato dalla terminazione di un figlio, avremo la certezza che la chiamata a \label{tab:proc_status_macro} \end{table} -\footnotetext{questa macro non è definita dallo standard POSIX.1, ma è - presente come estensione sia in Linux che in altri Unix.} - -Entrambe le funzioni di attesa restituiscono lo stato di terminazione del -processo tramite il puntatore \param{status} (se non interessa memorizzare -lo stato si può passare un puntatore nullo). Il valore restituito da -entrambe le funzioni dipende dall'implementazione, e tradizionalmente alcuni -bit (in genere 8) sono riservati per memorizzare lo stato di uscita, e altri -per indicare il segnale che ha causato la terminazione (in caso di -conclusione anomala), uno per indicare se è stato generato un -\itindex{core~dump} \textit{core dump}, ecc.\footnote{le definizioni esatte - si possono trovare in \file{} ma questo file non deve - mai essere usato direttamente, esso viene incluso attraverso - \file{}.} +\footnotetext[18]{questa macro non è definita dallo standard POSIX.1-2001, ma è + presente come estensione sia in Linux che in altri Unix, deve essere + pertanto utilizzata con attenzione (ad esempio è il caso di usarla in un + blocco \texttt{\#ifdef WCOREDUMP ... \#endif}.} -Lo standard POSIX.1 definisce una serie di macro di preprocessore da usare per -analizzare lo stato di uscita. Esse sono definite sempre in -\file{} ed elencate in tab.~\ref{tab:proc_status_macro} (si tenga -presente che queste macro prendono come parametro la variabile di tipo -\ctyp{int} puntata da \param{status}). +\footnotetext{è presente solo a partire dal kernel 2.6.10.} Si tenga conto che nel caso di conclusione anomala il valore restituito da \val{WTERMSIG} può essere confrontato con le costanti definite in \file{signal.h} ed elencate in tab.~\ref{tab:sig_signal_list}, e stampato usando le apposite funzioni trattate in sez.~\ref{sec:sig_strsignal}. -Linux, seguendo un'estensione di BSD, supporta altre due funzioni per la -lettura dello stato di terminazione di un processo, analoghe alle precedenti -ma che prevedono un ulteriore argomento attraverso il quale il kernel può -restituire al padre informazioni sulle risorse usate dal processo terminato e -dai vari figli. Le due funzioni sono \funcd{wait3} e \funcd{wait4}, che -diventano accessibili definendo la macro \macro{\_USE\_BSD}; i loro prototipi -sono: +A partire dal kernel 2.6.9, sempre in conformità allo standard POSIX.1-2001, è +stata introdotta una nuova funzione di attesa che consente di avere un +controllo molto più preciso sui possibili cambiamenti di stato dei processi +figli e più dettagli sullo stato di uscita; la funzione è \funcd{waitid} ed il +suo prototipo è: +\begin{functions} + \headdecl{sys/types.h} + + \headdecl{sys/wait.h} + + \funcdecl{int waitid(idtype\_t idtype, id\_t id, siginfo\_t *infop, int + options)} + + Attende la conclusione di un processo figlio. + + \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore, + nel qual caso \var{errno} assumerà i valori: + \begin{errlist} + \item[\errcode{EINTR}] se non è stata specificata l'opzione \const{WNOHANG} e + la funzione è stata interrotta da un segnale. + \item[\errcode{ECHILD}] il processo specificato da \param{pid} non esiste o + non è figlio del processo chiamante. + \item[\errcode{EINVAL}] si è specificato un valore non valido per + l'argomento \param{options}. + \end{errlist}} +\end{functions} + +La funzione prevede che si specifichi quali processi si intendono osservare +usando i due argomenti \param{idtype} ed \param{id}; il primo indica se si +vuole porsi in attesa su un singolo processo, un gruppo di processi o un +processo qualsiasi, e deve essere specificato secondo uno dei valori di +tab.~\ref{tab:proc_waitid_idtype}; il secondo indica, a seconda del valore del +primo, quale processo o quale gruppo di processi selezionare. + + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Macro} & \textbf{Descrizione}\\ + \hline + \hline + \const{P\_PID} & Indica la richiesta di attendere per un processo figlio + il cui \acr{pid} corrisponda al valore dell'argomento + \param{id}.\\ + \const{P\_PGID}& Indica la richiesta di attendere per un processo figlio + appartenente al \textit{process group} (vedi + sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid} + corrisponda al valore dell'argomento \param{id}.\\ + \const{P\_ALL} & Indica la richiesta di attendere per un processo figlio + generico, il valore dell'argomento \param{id} viene + ignorato.\\ + \hline + \end{tabular} + \caption{Costanti per i valori dell'argomento \param{idtype} della funzione + \func{waitid}.} + \label{tab:proc_waitid_idtype} +\end{table} + +Come per \func{waitpid} anche il comportamento di \func{waitid} viene +controllato dall'argomento \param{options}, da specificare come maschera +binaria dei valori riportati in tab.~\ref{tab:proc_waitid_options}. Benché +alcuni di questi siano identici come significato ed effetto ai precedenti di +tab.~\ref{tab:proc_waitpid_options}, ci sono delle differenze significative: +in questo caso si dovrà specificare esplicitamente l'attesa della terminazione +di un processo impostando l'opzione \const{WEXITED}, mentre il precedente +\const{WUNTRACED} è sostituito da \const{WSTOPPED}. Infine è stata aggiunta +l'opzione \const{WNOWAIT} che consente una lettura dello stato mantenendo il +processo in attesa di ricezione, così che una successiva chiamata possa di +nuovo riceverne lo stato. + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Macro} & \textbf{Descrizione}\\ + \hline + \hline + \const{WEXITED} & Ritorna quando un processo figlio è terminato. \\ + \const{WNOHANG} & Ritorna immediatamente anche se non c'è niente da + notificare. \\ + \const{WSTOPPED} & Ritorna quando un processo figlio è stato fermato. \\ + \const{WCONTINUED}& ritorna quando un processo figlio che era stato + fermato ha ripreso l'esecuzione. \\ + \const{WNOWAIT} & Lascia il processo ancora in attesa di ricezione, così + che una successiva chiamata possa di nuovo riceverne + lo stato. \\ + \hline + \end{tabular} + \caption{Costanti che identificano i bit dell'argomento \param{options} + della funzione \func{waitid}.} + \label{tab:proc_waitid_options} +\end{table} + +La funzione \func{waitid} restituisce un valore nullo in caso di successo, e +$-1$ in caso di errore; viene restituito un valore nullo anche se è stata +specificata l'opzione \const{WNOHANG} e la funzione è ritornata immediatamente +senza che nessun figlio sia terminato. Pertanto per verificare il motivo del +ritorno della funzione occorre analizzare le informazioni che essa +restituisce; queste, al contrario delle precedenti \func{wait} e +\func{waitpid}, sono ritornate nella struttura di tipo \struct{siginfo\_t} +(vedi fig.~\ref{fig:sig_siginfo_t}) all'indirizzo puntato dall'argomento +\param{infop}. + +Tratteremo nei dettagli questa struttura ed il significato dei suoi vari campi +in sez.~\ref{sec:sig_sigaction}, per quanto ci interessa qui basta dire che al +ritorno di \func{waitid} verranno avvalorati i seguenti campi: +\begin{basedescript}{\desclabelwidth{2.0cm}} +\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\_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}, + \const{CLD\_STOPPED}, \const{CLD\_CONTINUED} (vedi tab.~\ref{xxx_si_code}). +\end{basedescript} + +%TODO mettere riferimento alla tabella giusta + +Infine Linux, seguendo un'estensione di BSD, supporta altre due funzioni per +la lettura dello stato di terminazione di un processo, analoghe alle +precedenti ma che prevedono un ulteriore argomento attraverso il quale il +kernel può restituire al padre informazioni sulle risorse usate dal processo +terminato e dai vari figli. Le due funzioni sono \funcd{wait3} e +\funcd{wait4}, che diventano accessibili definendo la macro +\macro{\_USE\_BSD}; i loro prototipi sono: \begin{functions} \headdecl{sys/times.h} \headdecl{sys/types.h} \headdecl{sys/wait.h} \headdecl{sys/resource.h} @@ -1061,7 +1255,6 @@ utilizzata anche dalla funzione \func{getrusage} (vedi sez.~\ref{sec:sys_resource_use}) per ottenere le risorse di sistema usate da un processo; la sua definizione è riportata in fig.~\ref{fig:sys_rusage_struct}. - \subsection{Le funzioni \func{exec}} \label{sec:proc_exec} @@ -1935,10 +2128,10 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e % % POSIX-draft defined capabilities. % - \const{CAP\_CHOWN} & la capacità di cambiare proprietario e gruppo + \const{CAP\_CHOWN} & La capacità di cambiare proprietario e gruppo proprietario di un file (vedi sez.~\ref{sec:file_ownership_management}).\\ - \const{CAP\_DAC\_OVERRIDE}& la capacità di evitare il controllo dei + \const{CAP\_DAC\_OVERRIDE}& La capacità di evitare il controllo dei permessi di lettura, scrittura ed esecuzione dei file, (vedi sez.~\ref{sec:file_access_control}) caratteristici del modello classico del @@ -1946,11 +2139,11 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \itindex{Discrectionary~Access~Control~(DAC)} \textit{Discrectionary Access Control} (da cui il nome DAC).\\ - \const{CAP\_DAC\_READ\_SEARCH}& la capacità di evitare il controllo dei + \const{CAP\_DAC\_READ\_SEARCH}& La capacità di evitare il controllo dei permessi di lettura, scrittura ed esecuzione per le directory (vedi sez.~\ref{sec:file_access_control}).\\ - \const{CAP\_FOWNER} & la capacità di evitare il controllo che + \const{CAP\_FOWNER} & La capacità di evitare il controllo che l'user-ID effettivo del processo (o meglio il \textit{filesystem user-ID}, vedi sez.~\ref{sec:proc_setuid}) coincida con @@ -1971,7 +2164,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \func{open} e \func{fcntl} (vedi sez.~\ref{sec:file_open} e sez.~\ref{sec:file_fcntl}).\\ - \const{CAP\_FSETID} & la capacità di evitare la cancellazione + \const{CAP\_FSETID} & La capacità di evitare la cancellazione automatica dei bit \itindex{suid~bit} \acr{suid} e \itindex{sgid~bit} \acr{sgid} quando un file per i quali sono impostati viene modificato da @@ -1980,14 +2173,14 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e quando questo è relativo ad un gruppo cui non si appartiene (vedi sez.~\ref{sec:file_perm_management}).\\ - \const{CAP\_KILL} & la capacità di mandare segnali a qualunque + \const{CAP\_KILL} & La capacità di mandare segnali a qualunque processo (vedi sez.~\ref{sec:sig_kill_raise}).\\ - \const{CAP\_SETGID} & la capacità di manipolare i group ID dei + \const{CAP\_SETGID} & La capacità di manipolare i group ID dei processi, sia il principale che i supplementari, (vedi sez.~\ref{sec:proc_setgroups} che quelli trasmessi tramite i socket \textit{unix domain} (vedi sez.~\ref{sec:unix_socket}).\\ - \const{CAP\_SETUID} & la capacità di manipolare gli user ID del + \const{CAP\_SETUID} & La capacità di manipolare gli user ID del processo (con \func{setuid}, \func{setreuid}, \func{setresuid}, \func{setfsuid}) e di trasmettere un valore arbitrario @@ -1998,7 +2191,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e % Linux specific capabilities % \hline - \const{CAP\_SETPCAP} & la capacità di impostare o rimuovere una capacità + \const{CAP\_SETPCAP} & La capacità di impostare o rimuovere una capacità (limitatamente a quelle che il processo chiamante ha nel suo insieme di capacità permesse) da qualunque processo.\\ @@ -2007,10 +2200,10 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \textit{append only} per i file su un filesystem che supporta questi attributi estesi.\\ - \const{CAP\_NET\_BIND\_SERVICE}& la capacità di porre in ascolto server + \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porre in ascolto server su porte riservate (vedi sez.~\ref{sec:TCP_func_bind}).\\ - \const{CAP\_NET\_BROADCAST}& la capacità di consentire l'uso di socket in + \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in \itindex{broadcast} \textit{broadcast} e \itindex{multicast} \textit{multicast}.\\ \const{CAP\_NET\_ADMIN} & la capacità di eseguire alcune operazioni @@ -2019,59 +2212,58 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e \itindex{multicast} \textit{multicasting}, impostare interfacce di rete e tabella di instradamento).\\ - \const{CAP\_NET\_RAW} & la capacità di usare socket \texttt{RAW} e + \const{CAP\_NET\_RAW} & La capacità di usare socket \texttt{RAW} e \texttt{PACKET} (quelli che permettono di creare pacchetti nei protocolli di basso livello).\\ - \const{CAP\_IPC\_LOCK} & la capacità di effettuare il \textit{memory + \const{CAP\_IPC\_LOCK} & La capacità di effettuare il \textit{memory locking} \itindex{memory~locking} con le funzioni \func{mlock}, \func{mlockall}, \func{shmctl}, \func{mmap} (vedi sez.~\ref{sec:proc_mem_lock} e sez.~\ref{sec:file_memory_map}). \\ - \const{CAP\_IPC\_OWNER} & la capacità di evitare il controllo dei permessi + \const{CAP\_IPC\_OWNER} & La capacità di evitare il controllo dei permessi per le operazioni sugli oggetti di intercomunicazione fra processi (vedi sez.~\ref{sec:ipc_sysv}).\\ - \const{CAP\_SYS\_MODULE}& la capacità di caricare e rimuovere moduli del + \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del kernel. \\ - \const{CAP\_SYS\_RAWIO} & la capacità di eseguire operazioni sulle porte + \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte di I/O con \func{ioperm} e \func{iopl} (vedi sez.~\ref{sec:file_io_port}).\\ - \const{CAP\_SYS\_CHROOT}& la capacità di eseguire la funzione + \const{CAP\_SYS\_CHROOT}& La capacità di eseguire la funzione \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\ - \const{CAP\_SYS\_PTRACE}& consente di tracciare qualunque processo con + \const{CAP\_SYS\_PTRACE}& Consente di tracciare qualunque processo con \func{ptrace} (vedi sez.~\ref{sec:xxx_ptrace}).\\ -% TODO documentatare ptrace - \const{CAP\_SYS\_PACCT} & la capacità di usare le funzioni di + \const{CAP\_SYS\_PACCT} & La capacità di usare le funzioni di \textit{accounting} dei processi (vedi sez.~\ref{sec:sys_bsd_accounting}).\\ - \const{CAP\_SYS\_ADMIN} & la capacità di eseguire una serie di compiti + \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti amministrativi (come impostare le quote, attivare e disattivare la swap, montare, rimontare e smontare filesystem, ecc.). \\ - \const{CAP\_SYS\_BOOT} & la capacità di fare eseguire un riavvio del + \const{CAP\_SYS\_BOOT} & La capacità di fare eseguire un riavvio del sistema.\\ - \const{CAP\_SYS\_NICE} & la capacità di modificare le priorità dei + \const{CAP\_SYS\_NICE} & La capacità di modificare le priorità dei processi (vedi sez.~\ref{sec:proc_priority}). \\ \const{CAP\_SYS\_RESOURCE}& la capacità di superare le limitazioni sulle risorse, aumentare le quote disco, usare lo spazio disco riservato all'amministratore.\\ - \const{CAP\_SYS\_TIME} & la capacità di modificare il tempo di sistema + \const{CAP\_SYS\_TIME} & La capacità di modificare il tempo di sistema (vedi sez.~\ref{sec:sys_time}).\\ \const{CAP\_SYS\_TTY\_CONFIG}& la capacità di simulare un \textit{hangup} della console, con la funzione \func{vhangup}.\\ - \const{CAP\_MKNOD} & la capacità di creare file di dispositivo con la + \const{CAP\_MKNOD} & La capacità di creare file di dispositivo con la funzione \func{mknod} (vedi sez.~\ref{sec:file_mknod}).\footnotemark\\ - \const{CAP\_LEASE} & la capacità di creare dei \textit{file lease} + \const{CAP\_LEASE} & La capacità di creare dei \textit{file lease} \index{file!lease} su di un file (vedi sez.~\ref{sec:file_asyncronous_lease}) indipendentemente dalla proprietà dello stesso.\footnotemark\\ - \const{CAP\_SETFCAP} & la capacità di impostare le + \const{CAP\_SETFCAP} & La capacità di impostare le \textit{capabilities} di un file (non supportata).\\ \hline @@ -2953,10 +3145,10 @@ assolute diverse da zero o politiche \const{SCHED\_FIFO} e \const{SCHED\_RR}. \textbf{Policy} & \textbf{Significato} \\ \hline \hline - \const{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO} \\ + \const{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO}. \\ \const{SCHED\_RR} & Scheduling real-time con politica \textit{Round - Robin} \\ - \const{SCHED\_OTHER}& Scheduling ordinario\\ + Robin}. \\ + \const{SCHED\_OTHER}& Scheduling ordinario.\\ \hline \end{tabular} \caption{Valori dell'argomento \param{policy} per la funzione @@ -3502,7 +3694,10 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso % LocalWords: PACCT RESOURCE TTY CONFIG SETFCAP hdrp datap libcap lcap text tp % LocalWords: get ncap caps CapInh CapPrm fffffeff CapEff getcap STAT dall'I % LocalWords: inc PRIO SUSv PRGR prio SysV SunOS Ultrix sched timespec len sig -% LocalWords: cpusetsize cpuset atomic +% LocalWords: cpusetsize cpuset atomic tickless redirezione WCONTINUED stopped +% LocalWords: waitid NOCLDSTOP ENOCHLD WIFCONTINUED ifdef endif idtype siginfo +% LocalWords: infop ALL WEXITED WSTOPPED WNOWAIT signo CLD EXITED KILLED page +% LocalWords: CONTINUED %%% Local Variables: %%% mode: latex