Completate le aggiunte della GPL per i programmi
[gapil.git] / prochand.tex
index 8f8beaffd588c9f45d0654c6a40cde391548d823..41d7a348c2e7a9702ea2f4a97d2786cc41e66d1f 100644 (file)
@@ -278,20 +278,54 @@ 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}.
 
-Decifrato il numero di figli da creare il ciclo principale del programma
+Decifrato il numero di figli da creare, il ciclo principale del programma
 (\texttt{\small 28--40}) esegue in successione la creazione dei processi figli
-(\texttt{\small 29--31}) controllando il successo della chiamata a
-\func{fork}; ciascun figlio (\texttt{\small 29--31}) si limita a stampare il
+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
 di uscire. Il processo padre invece (\texttt{\small 29--31}) stampa un
-messaggio di creazione e procede nell'esecuzione del ciclo.
-
-In generale\footnote{anche se nel kernel 2.4.x è stato introdotto un
+messaggio di creazione e procede nell'esecuzione del ciclo. Se eseguiamo il
+comando otterremo:
+\begin{verbatim}
+[piccardi@selidor sources]$ ./forktest 5
+Test for forking 5 child
+Spawned 1 child, pid 840 
+Child 1 successfully executing
+Child 2 successfully executing
+Spawned 2 child, pid 841 
+Spawned 3 child, pid 842 
+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 5 exiting
+\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
   meccanismo che metteva in esecuzione sempre il xxx per primo (TODO
-  recuperare le informazioni esatte)} non si può dire quale processo fra il
-padre ed il figlio venga eseguito per primo dopo la chiamata a \func{fork},
-per cui se i due processi devono essere sincronizzati occorre ricorrere ad un
-qualche meccanismo di intercomunicazione.
+  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.
+
+
 
 
 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}