X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=88145d3f3e8aae5e9562bbc849490dc083a47892;hp=0277d64da17d27527486119d275d02d40daeae06;hb=e2a1ad24365266ea8846b688addd4e7694428969;hpb=d88ea986fbf6b84a802fd8a5665af4324a6c89b3 diff --git a/prochand.tex b/prochand.tex index 0277d64..88145d3 100644 --- a/prochand.tex +++ b/prochand.tex @@ -791,12 +791,12 @@ memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di terminazione, mentre la memoria in uso ed i file aperti vengono rilasciati immediatamente. I processi che sono terminati, ma il cui stato di terminazione non è stato -ancora ricevuto dal padre sono chiamati \textit{zombie}, essi restano presenti -nella tabella dei processi ed in genere possono essere identificati -dall'output di \cmd{ps} per la presenza di una \texttt{Z} nella colonna che ne -indica lo stato (vedi \tabref{tab:proc_proc_states}). Quando il padre -effettuerà la lettura dello stato di uscita anche questa informazione, non più -necessaria, verrà scartata e la terminazione potrà dirsi completamente +ancora ricevuto dal padre sono chiamati \textit{zombie}\index{zombie}, essi +restano presenti nella tabella dei processi ed in genere possono essere +identificati dall'output di \cmd{ps} per la presenza di una \texttt{Z} nella +colonna che ne indica lo stato (vedi \tabref{tab:proc_proc_states}). Quando il +padre effettuerà la lettura dello stato di uscita anche questa informazione, +non più necessaria, verrà scartata e la terminazione potrà dirsi completamente conclusa. Possiamo utilizzare il nostro programma di prova per analizzare anche questa @@ -875,25 +875,26 @@ segnale termina il processo o chiama una funzione di gestione. \noindent è presente fin dalle prime versioni di Unix; la funzione ritorna non appena un processo figlio termina. Se un figlio è già terminato la funzione ritorna -immediatamente. - -Al ritorno, lo stato di terminazione del processo viene salvato nella -variabile puntata da \var{status} e tutte le informazioni relative al -processo (vedi \secref{sec:proc_termination}) vengono rilasciate. Nel -caso un processo abbia più figli il valore di ritorno permette di -identificare qual'è quello che è uscito. - -Questa funzione ha il difetto di essere poco flessibile, in quanto -ritorna all'uscita di un figlio qualunque. Nelle occasioni in cui è -necessario attendere la conclusione di un processo specifico occorre +immediatamente, se più di un figlio è terminato occorre chiamare la funzione +più volte se si vuole recuperare lo stato di terminazione di tutti quanti. + +Al ritorno della funzione lo stato di terminazione del figlio viene salvato +nella variabile puntata da \var{status} e tutte le risorse del kernel relative +al processo (vedi \secref{sec:proc_termination}) vengono rilasciate. Nel caso +un processo abbia più figli il valore di ritorno (il \acr{pid} del figlio) +permette di identificare qual'è quello che è uscito. + +Questa funzione ha il difetto di essere poco flessibile, in quanto ritorna +all'uscita di un qualunque processo figlio. Nelle occasioni in cui è +necessario attendere la conclusione di un processo specifico occorrerebbe predisporre un meccanismo che tenga conto dei processi già terminati, e -provveda a ripetere la chiamata alla funzione nel caso il processo -cercato sia ancora attivo. +provvedere a ripetere la chiamata alla funzione nel caso il processo cercato +sia ancora attivo. Per questo motivo lo standard POSIX.1 ha introdotto la funzione \func{waitpid} che effettua lo stesso servizio, ma dispone di una serie di funzionalità più ampie, legate anche al controllo di sessione (si veda -\ref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso +\secref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre questa funzione, il cui prototipo è: \begin{functions} @@ -916,15 +917,16 @@ Attende la conclusione di un processo figlio. 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 quale processo attendere sulla -base del valore fornito dall'argomento \param{pid}, secondo lo -specchietto riportato in \tabref{tab:proc_waidpid_pid}: +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 \tabref{tab:proc_waidpid_pid}. + \begin{table}[!htb] \centering \footnotesize \begin{tabular}[c]{|c|c|p{8cm}|} \hline - \textbf{Valore} & \textbf{Macro} &\textbf{Significato}\\ + \textbf{Valore} & \textbf{Opzione} &\textbf{Significato}\\ \hline \hline $<-1$& -- & attende per un figlio il cui \textit{process group} (vedi @@ -946,16 +948,17 @@ specchietto riportato in \tabref{tab:proc_waidpid_pid}: 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}. Quest'ultimo -viene generalmente usato per il controllo di sessione, (trattato in -\secref{sec:sess_job_control}) in quanto permette di identificare i processi -bloccati. La funzione infatti in tal caso ritorna, restituendone il \acr{pid}, -se c'è un processo figlio che è entrato in stato di sleep (vedi -\tabref{tab:proc_proc_states}) di cui non si è ancora letto lo stato (con -questa stessa opzione). Il valore dell'opzione deve essere specificato come -maschera binaria ottenuta con l'OR delle suddette costanti con zero. In Linux +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 \secref{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 \tabref{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 saranno trattate in \secref{sec:thread_xxx}. +thread, che riprenderemo in \secref{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 @@ -988,23 +991,23 @@ figlio, avremo la certezza che la chiamata a \func{wait} non si bloccher \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 se - \macro{WIFEXITED} ha restituito un valore non nullo.\\ + \val{WIFEXITED} ha restituito un valore non nullo.\\ \macro{WIFSIGNALED(s)} & Vera se il processo figlio è terminato in maniera anomala a causa di un segnale che non è stato catturato (vedi \secref{sec:sig_notification}).\\ \macro{WTERMSIG(s)} & restituisce il numero del segnale che ha causato la terminazione anomala del processo. Può essere valutata solo se - \macro{WIFSIGNALED} ha restituito un valore non nullo.\\ + \val{WIFSIGNALED} ha restituito un valore non nullo.\\ \macro{WCOREDUMP(s)} & Vera se il processo terminato ha generato un file si \textit{core dump}. Può essere valutata solo se - \macro{WIFSIGNALED} ha restituito un valore non nullo.\footnote{questa + \val{WIFSIGNALED} ha restituito un valore non nullo.\footnote{questa macro non è definita dallo standard POSIX.1, ma è presente come estensione sia in Linux che in altri Unix.}\\ \macro{WIFSTOPPED(s)} & Vera se il processo che ha causato il ritorno di \func{waitpid} è bloccato. L'uso è possibile solo avendo specificato - l'opzione \macro{WUNTRACED}. \\ + l'opzione \const{WUNTRACED}. \\ \macro{WSTOPSIG(s)} & restituisce il numero del segnale che ha bloccato - il processo, Può essere valutata solo se \macro{WIFSTOPPED} ha + il processo, Può essere valutata solo se \val{WIFSTOPPED} ha restituito un valore non nullo. \\ \hline \end{tabular} @@ -1107,9 +1110,9 @@ famiglia di funzioni) che possono essere usate per questo compito, in realt \item[\errcode{ELIBBAD}] Un interprete ELF non è in un formato riconoscibile. \end{errlist} - ed inoltre anche \const{EFAULT}, \const{ENOMEM}, \const{EIO}, - \const{ENAMETOOLONG}, \const{E2BIG}, \const{ELOOP}, \const{ENOTDIR}, - \const{ENFILE}, \const{EMFILE}.} + ed inoltre anche \errval{EFAULT}, \errval{ENOMEM}, \errval{EIO}, + \errval{ENAMETOOLONG}, \errval{E2BIG}, \errval{ELOOP}, \errval{ENOTDIR}, + \errval{ENFILE}, \errval{EMFILE}.} \end{prototype} La funzione \func{exec} esegue il file o lo script indicato da @@ -1171,8 +1174,8 @@ per indicare il nome del file che contiene il programma che verr \multicolumn{1}{|c|}{\textbf{Caratteristiche}} & \multicolumn{6}{|c|}{\textbf{Funzioni}} \\ \hline - &\func{execl\ }&\func{execlp}&\func{execle} - &\func{execv\ }& \func{execvp}& \func{execve} \\ + &\func{execl}\texttt{ }&\func{execlp}&\func{execle} + &\func{execv}\texttt{ }& \func{execvp}& \func{execve} \\ \hline \hline argomenti a lista &$\bullet$&$\bullet$&$\bullet$&&& \\ @@ -1492,7 +1495,7 @@ corrente. corrente. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \const{EPERM}.} + di fallimento: l'unico errore possibile è \errval{EPERM}.} \end{functions} Il funzionamento di queste due funzioni è analogo, per cui considereremo solo @@ -1592,7 +1595,7 @@ specificati da \var{ruid} e \var{euid}. specificati da \var{rgid} e \var{egid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \const{EPERM}.} + di fallimento: l'unico errore possibile è \errval{EPERM}.} \end{functions} La due funzioni sono analoghe ed il loro comportamento è identico; quanto @@ -1644,7 +1647,7 @@ corrente a \var{uid}. corrente a \var{gid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \const{EPERM}.} + di fallimento: l'unico errore è \errval{EPERM}.} \end{functions} Come per le precedenti le due funzioni sono identiche, per cui tratteremo solo @@ -1675,7 +1678,7 @@ corrente ai valori specificati rispettivamente da \var{rgid}, \var{egid} e \var{sgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \const{EPERM}.} + di fallimento: l'unico errore è \errval{EPERM}.} \end{functions} Le due funzioni sono identiche, quanto detto per la prima riguardo gli userid @@ -1700,7 +1703,7 @@ groupid reale, il groupid effettivo e il groupid salvato del processo corrente. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di - fallimento: l'unico errore possibile è \const{EFAULT} se gli indirizzi delle + fallimento: l'unico errore possibile è \errval{EFAULT} se gli indirizzi delle variabili di ritorno non sono validi.} \end{functions} @@ -1747,7 +1750,7 @@ processo corrente a \var{fsuid}. processo corrente a \var{fsgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso - di fallimento: l'unico errore possibile è \const{EPERM}.} + di fallimento: l'unico errore possibile è \errval{EPERM}.} \end{functions} \noindent queste funzioni hanno successo solo se il processo chiamante ha i privilegi di amministratore o, per gli altri utenti, se il valore specificato @@ -1837,8 +1840,8 @@ un utente specifico, si pu \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà gli stessi valori di - \func{setgroups} più \const{ENOMEM} quando non c'è memoria sufficiente per - allocare lo spazio per informazioni dei gruppi.} + \func{setgroups} più \errval{ENOMEM} quando non c'è memoria sufficiente + per allocare lo spazio per informazioni dei gruppi.} \end{functions} La funzione esegue la scansione del database dei gruppi (usualmente