Piccole modifiche
[gapil.git] / prochand.tex
index 41d7a348c2e7a9702ea2f4a97d2786cc41e66d1f..90da68176a6c4159f16cd0eb25900d6530d0008f 100644 (file)
@@ -272,40 +272,38 @@ sempre un solo padre (il cui \acr{pid} pu
 \func{getppid}, vista in \secref{sec:proc_pid}) e si usa il valore nullo, che
 non può essere il \acr{pid} di nessun processo.
 
 \func{getppid}, vista in \secref{sec:proc_pid}) e si usa il valore nullo, che
 non può essere il \acr{pid} di nessun processo.
 
-In \curfig\ si è riportato il corpo del codice dell'esempio \cmd{forktest},
-che ci permette di illustrare l'uso della funzione \func{fork}, creando un
-numero di figli specificato a linea di comando; il codice completo, compresa
-la parte che gestisce le opzioni a riga di comando, è disponibile nel file
-\file{ForkTest.c}.
+In \curfig\ si è riportato il corpo del codice del programma di esempio
+\cmd{forktest}, che ci permette di illustrare l'uso della funzione
+\func{fork}. Il programma permette di creare un numero di figli specificato a
+linea di comando, e prende anche due opzioni \cmd{-p} e \cmd{-c} per indicare
+dei tempi di attesa (in seconda) per il padre ed il figlio; il codice
+completo, compresa la parte che gestisce le opzioni a riga di comando, è
+disponibile nel file \file{ForkTest.c}.
 
 Decifrato il numero di figli da creare, il ciclo principale del programma
 (\texttt{\small 28--40}) esegue in successione la creazione dei processi figli
 controllando il successo della chiamata a \func{fork} (\texttt{\small
   29--31}); ciascun figlio (\texttt{\small 29--31}) si limita a stampare il
 
 Decifrato il numero di figli da creare, il ciclo principale del programma
 (\texttt{\small 28--40}) esegue in successione la creazione dei processi figli
 controllando il successo della chiamata a \func{fork} (\texttt{\small
   29--31}); ciascun figlio (\texttt{\small 29--31}) si limita a stampare il
-suo numero di successione, attendere 2 secondi e scrivere un messaggio prima
+suo numero di successione, attendere 3 secondi e scrivere un messaggio prima
 di uscire. Il processo padre invece (\texttt{\small 29--31}) stampa un
 messaggio di creazione e procede nell'esecuzione del ciclo. Se eseguiamo il
 di uscire. Il processo padre invece (\texttt{\small 29--31}) stampa un
 messaggio di creazione e procede nell'esecuzione del ciclo. Se eseguiamo il
-comando otterremo:
+comando otterremo come output sul terminale:
 \begin{verbatim}
 \begin{verbatim}
-[piccardi@selidor sources]$ ./forktest 5
-Test for forking 5 child
-Spawned 1 child, pid 840 
+[piccardi@selidor sources]$ ./forktest 3
+Test for forking 3 child
+Spawned 1 child, pid 2038 
 Child 1 successfully executing
 Child 1 successfully executing
+Child 1 exiting
+Go to next child 
+Spawned 2 child, pid 2039 
 Child 2 successfully executing
 Child 2 successfully executing
-Spawned 2 child, pid 841 
-Spawned 3 child, pid 842 
+Child 2 exiting
+Go to next child 
 Child 3 successfully executing
 Child 3 successfully executing
-Spawned 4 child, pid 843 
-Child 4 successfully executing
-Child 5 successfully executing
-Spawned 5 child, pid 844 
-[piccardi@selidor sources]$ Child 2 exiting
-Child 1 exiting
-Child 4 exiting
 Child 3 exiting
 Child 3 exiting
-Child 5 exiting
-\end{verbatim}
-
+Spawned 3 child, pid 2040 
+Go to next child 
+\end{verbatim} %$
 
 Come si vede non si può dire quale processo fra il padre ed il figlio venga
 eseguito per primo\footnote{anche se nel kernel 2.4.x era stato introdotto un
 
 Come si vede non si può dire quale processo fra il padre ed il figlio venga
 eseguito per primo\footnote{anche se nel kernel 2.4.x era stato introdotto un
@@ -313,19 +311,29 @@ eseguito per primo\footnote{anche se nel kernel 2.4.x era stato introdotto un
   recuperare le informazioni esatte)} dopo la chiamata a \func{fork}, nel caso
 mostrato sopra ad esempio si può notare come dopo la creazione il secondo ed
 il quinto figlio sia stato stati eseguiti per primi, mantre per gli altri
   recuperare le informazioni esatte)} dopo la chiamata a \func{fork}, nel caso
 mostrato sopra ad esempio si può notare come dopo la creazione il secondo ed
 il quinto figlio sia stato stati eseguiti per primi, mantre per gli altri
-figli è stato eseguito per primo il padre. In generale l'ordine di esecuzione
-dipenderà dalla situazione particolare in si trova la macchina al momento
-della chiamata, risultando del tutto impredicibile, per questo motivo se i due
-processi devono essere sincronizzati occorrerà ricorrere ad un opportuno
-meccanismo di intercomunicazione.
-
-Si ricordi inoltre che, essendo i segmenti di memoria utilizzati dai singoli
-processi completamente separati, le modifiche delle variabili nei processi
-figli (come l'incremento di \var{i} in \texttt{\small 33}) saranno effettive
-solo per essi, e non hanno alcun effetto sul valore che le stesse variabili
-hanno nel processo padre.
-
-
+figli è stato eseguito per primo il padre. 
+
+In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
+scheduling usato dal kernel, dalla particolare situazione in si trova la
+macchina al momento della chiamata, risultando del tutto impredicibile.
+Eseguendo più volte il programma di prova, si sono ottenute situazioni
+completamente diverse, compreso caso in cui il processo padre ha eseguito più
+di una \func{fork} prima che uno dei figli venisse messo in
+esecuzione. 
+
+Pertanto non si può fare nessuna assunzione sulla sequenza di esecuzione delle
+istruzioni del codice fra padre e figli, e se è necessaria una qualche forma
+di precedenza occorrerà provvedere ad espliciti meccanismi di
+sincronizzazione, pena il rischio di incorrere nelle cosiddette \textit{race
+  conditions}.
+
+Si ricordi inoltre che come accennato, essendo i segmenti di memoria
+utilizzati dai singoli processi completamente separati, le modifiche delle
+variabili nei processi figli (come l'incremento di \var{i} in \texttt{\small
+  33}) saranno effettive solo per essi, e non hanno alcun effetto sul valore
+che le stesse variabili hanno nel processo padre.
+
+L'esempio mostra anche 
 
 
 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
 
 
 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}