X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=41d7a348c2e7a9702ea2f4a97d2786cc41e66d1f;hp=8f8beaffd588c9f45d0654c6a40cde391548d823;hb=54d27b07aee6d293931ee274a3ede927f517f2cf;hpb=0d1802dcd969187e6133ba143ebc473c9fefc259 diff --git a/prochand.tex b/prochand.tex index 8f8beaf..41d7a34 100644 --- a/prochand.tex +++ b/prochand.tex @@ -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}}