Finito con wait & C (spero).
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 23 Sep 2001 17:12:49 +0000 (17:12 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 23 Sep 2001 17:12:49 +0000 (17:12 +0000)
prochand.tex
signal.tex

index 3b79276dcf2a0fff0513c72eb72fb78ff9bcf3f0..f7ac31f56ae127fc5484fabc42fd6a30aa98b55b 100644 (file)
@@ -105,7 +105,7 @@ processi con la relazione padre/figlio in una organizzazione gerarchica ad
 albero, in maniera analoga a come i file sono organizzati in un albero di
 directory (si veda \secref{sec:file_file_struct}); in \nfig\ si è mostrato il
 risultato del comando \cmd{pstree} che permette di mostrare questa struttura,
-alla cui base c'è il \cmd{init} che è progenitore di tutti gli altri processi.
+alla cui base c'è \cmd{init} che è progenitore di tutti gli altri processi.
 
 
 \subsection{Una panoramica sulle funzioni di gestione}
@@ -828,25 +828,27 @@ Il comportamento di \func{waitpid} pu
 opportune opzioni tramite la variabile \var{option}. I valori possibili sono
 il già citato \macro{WNOHANG}, che previene il blocco della funzione quando il
 processo figlio non è terminato, e \macro{WUNTRACED} (usata per il controllo
-di sessione) che fa ritornare la funzione anche per i processi figli che sono
-bloccati ed il cui stato non è stato ancora riportato al padre. Il valore
-dell'opzione deve essere specificato come l'OR binario di zero con le suddette
-costanti.
-
-Entrambe le funzioni restituiscono lo stato di terminazione del processo
-tramite il puntatore \var{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 sono riservati per
-memorizzare lo stato di uscita (in genere 8) altri per indicare il segnale che
-ha causato la terminazione (in caso di conclusione anomala), uno per indicare
-se è stato generato un core file, etc.\footnote{le definizioni esatte si
-  possono trovare in \file{<bits/waitstatus.h}, che non deve mai essere usato
-  direttamente ma incluso attraverso \file{<sys/wait.h>}}.  Lo standard
-POSIX.1 definisce una serie di macro di preprocessore da usare per analizzare
-lo stato di uscita; esse sono definite in \file{<sys/wait.h>} ed elencate in
-\ntab\ (si tenga presente che queste macro prendono come parametro la
-variabile di tipo \type{int} puntata da \var{status}).
-
+di sessione, trattato in \capref{cha:session}) che fa ritornare la funzione
+anche per i processi figli che sono bloccati ed il cui stato non è stato
+ancora riportato al padre. Il valore dell'opzione deve essere specificato come
+mashera binaria ottenuta con l'OR delle suddette costanti con zero.
+
+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 si è visto nella sezione precedente, una
+delle azioni prese dal kernel alla conclusione di un processo è quella di
+mandare un segnale di \macro{SIGCHLD} al padre. Questo segnale viene ignorato
+di default, ma costituisce il meccanismo di comunicazione asincrona con cui il
+kernel avverte un 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 \textit{zombie}),
+per questo la modalità più usata per chiamare queste funzioni è quella di
+utilizzarle all'interno di un \textit{signal handler} (torneremo sui segnali e
+su come gestire \macro{SIGCHLD} in \secref{sec:sig_sigwait_xxx}) nel qual
+caso, dato che il segnale è generato dalla terminazione un figlio, avremo la
+certezza che la chiamata a \func{wait} non si bloccherà.
 
 \begin{table}[!htb]
   \centering
@@ -884,13 +886,96 @@ variabile di tipo \type{int} puntata da \var{status}).
     verificare lo stato di terminazione \var{s} di un processo.}
   \label{tab:proc_status_macro}
 \end{table}
 
 
-Come abbiamo appena visto una delle azioni prese dal kernel alla terminazione
-di un processo è quella di salvarne lo stato e mandare un segnale di
-\macro{SIGCHLD} al padre (torneremo su questa parte in \secref{sec:sig_xxx}).
+Entrambe le funzioni restituiscono lo stato di terminazione del processo
+tramite il puntatore \var{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 sono riservati per
+memorizzare lo stato di uscita (in genere 8) altri per indicare il segnale che
+ha causato la terminazione (in caso di conclusione anomala), uno per indicare
+se è stato generato un core file, etc.\footnote{le definizioni esatte si
+  possono trovare in \file{<bits/waitstatus.h} ma questo file non deve mai
+  essere usato direttamente, esso viene incluso attraverso
+  \file{<sys/wait.h>}}.  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{<sys/wait.h>} ed elencate in \curtab\ (si tenga presente che
+queste macro prendono come parametro la variabile di tipo \type{int} puntata
+da \var{status}).
+
+Si tenga conto che nel caso di conclusione anomala il valore restituito da
+\macro{WTERMSIG} può essere controllato contro le costanti definite in
+\file{signal.h}, e stampato usando le funzioni definite in
+\secref{sec:sig_strsignal}.
+
+Linux, seguendo una estensione di BSD, supporta altre due funzioni per la
+lettura dello stato di terminazione di un processo, analoghe a \func{wait} e
+\func{waitpid}, ma che prevedono un ulteriore parametro attraverso il quale il
+kernel può restituire al processo padre ulteriori informazioni sulle risorse
+usate dal processo terminato e dai vari figli. 
+Queste funzioni diventano accessibili definendo la costante \macro{\_USE\_BSD}
+sono:
+
+\begin{functions}
+  \headdecl{sys/times.h} 
+  \headdecl{sys/types.h} 
+  \headdecl{sys/wait.h}        
+  \headdecl{sys/resource.h}
+  \funcdecl{pid\_t wait4(pid\_t pid, int * status, int options, struct rusage
+    * rusage)} 
+  La funzione è identica a \func{waitpid} sia per comportamento che per i
+  valori dei parametri, ma restituisce in \var{rusage} un sommario delle
+  risorse usate dal processo (per i dettagli vedi \secref{sec:xxx_limit_res})
+  \funcdecl{pid\_t wait3(int *status, int options, struct rusage *rusage)}  
+  Prima versione, equivalente a \func{wait4(-1, \&status, opt, rusage)} ormai
+  deprecata in favore di \func{wait4}.
+\end{functions}
+la struttura \type{rusage} è definita in \file{sys/resource.h}, e viene
+utilizzata anche dalla funzione \func{getrusage} per ottenere le risorse di
+sistema usate dal processo; in Linux è definita come:
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+struct rusage {
+     struct timeval ru_utime; /* user time used */
+     struct timeval ru_stime; /* system time used */
+     long ru_maxrss;          /* maximum resident set size */
+     long ru_ixrss;           /* integral shared memory size */
+     long ru_idrss;           /* integral unshared data size */
+     long ru_isrss;           /* integral unshared stack size */
+     long ru_minflt;          /* page reclaims */
+     long ru_majflt;          /* page faults */
+     long ru_nswap;           /* swaps */
+     long ru_inblock;         /* block input operations */
+     long ru_oublock;         /* block output operations */
+     long ru_msgsnd;          /* messages sent */
+     long ru_msgrcv;          /* messages received */
+     long ru_nsignals;   ;    /* signals received */
+     long ru_nvcsw;           /* voluntary context switches */
+     long ru_nivcsw;          /* involuntary context switches */
+};
+    \end{lstlisting}
+  \end{minipage} 
+  \normalsize 
+  \caption{La struttura \texttt{rusage} per la lettura delle informazioni dei 
+    delle risorse usate da un processo.}
+  \label{fig:proc_rusage_struct}
+\end{figure}
+In genere includere esplicitamente \file{<sys/time.h>} non è più necessario,
+ma aumenta la portabiltà, e serve in caso si debba accedere ai campi di
+\var{rusage} definiti come \type{struct timeval}. La struttura è ripresa dalla
+versione 4.3 Reno di BSD, attualmente (con il kernel 2.4.x) i soli campi che
+sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime}, \var{ru\_minflt},
+\var{ru\_majflt}, e \var{ru\_nswap}.
+
+\subsection{Le \textit{race condition}}
+\label{sec:proc_race_cond}
 
+Si definisce una \textit{race condition} il caso in cui diversi processi
+stanno cercando di fare qualcosa con una risorsa comune e e il risultato
+finale viene a dipendere 
 
 \subsection{Le funzioni \texttt{exec}}
 \label{sec:proc_exec}
@@ -923,9 +1008,9 @@ dall'utente che ha lanciato il processo (attraverso i valori di \acr{uid} e
 gestione dei privilegi associati ai processi stessi.
 \begin{table}[htb]
   \centering
-  \begin{tabular}[c]{|c|l|l|}
+  \begin{tabular}[c]{|c|l|p{8cm}|}
     \hline
-    Sigla & Significato & Utilizzo \\ 
+    \textbf{Sigla} & \textbf{Significato} & \textbf{Utilizzo} \\ 
     \hline
     \hline
     \acr{ruid} & \textit{real user id} & indica l'utente reale che ha lanciato
index 82e1452c45460739a2cbcd2947c3e49378fdc68d..f7e8bc5f34d91b6d5d6cff6885365b9452137778 100644 (file)
@@ -163,7 +163,6 @@ usare la funzione \func{sigpending} (vedi \secref{sec:sig_sigpending}) per
 determinare quali segnali sono bloccati e quali sono pendenti.
 
 
-
 \subsection{Tipi di segnali}
 \label{sec:sig_types}
 
@@ -369,6 +368,7 @@ stato dello stack e delle variabili al momento della ricezione del segnale.
 La descrizione dettagliata del significato dei vari segnali, raggruppati per
 tipologia, verrà affrontate nel seguito.
 
+
 \subsection{Segnali di errore di programma}
 \label{sec:sig_prog_error}