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,
 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}
 
 
 \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
 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
 
 \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}
     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}
 
 \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
 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
     \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
     \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.
 
 
 determinare quali segnali sono bloccati e quali sono pendenti.
 
 
-
 \subsection{Tipi di segnali}
 \label{sec:sig_types}
 
 \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.
 
 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}
 
 \subsection{Segnali di errore di programma}
 \label{sec:sig_prog_error}