From 2df3e366683f4df738d40a05b97f820fde1648d9 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 14 Sep 2001 22:16:41 +0000 Subject: [PATCH] Piccole modifiche --- prochand.tex | 39 ++++++++++++++++++++------------------- sources/ForkTest.c | 27 +++++++++++++++++++-------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/prochand.tex b/prochand.tex index 22da5c0..90da681 100644 --- a/prochand.tex +++ b/prochand.tex @@ -272,11 +272,13 @@ 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. -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 @@ -287,24 +289,21 @@ 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 come output sul terminale: \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 exiting +Go to next child +Spawned 2 child, pid 2039 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 -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} +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 @@ -334,6 +333,8 @@ 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}} \label{sec:proc_wait} diff --git a/sources/ForkTest.c b/sources/ForkTest.c index 6f73387..d57ef7a 100644 --- a/sources/ForkTest.c +++ b/sources/ForkTest.c @@ -26,7 +26,7 @@ * * Usage: forktest -h give all info's * - * $Id: ForkTest.c,v 1.3 2001/09/11 21:01:09 piccardi Exp $ + * $Id: ForkTest.c,v 1.4 2001/09/14 22:16:41 piccardi Exp $ * ****************************************************************/ /* @@ -46,23 +46,30 @@ int main(int argc, char *argv[]) /* * Variables definition */ - int i; - int nchild; + int nchild, i; pid_t pid; + int wait_child=0; + int wait_parent=0; /* * Input section: decode command line parameters * Use getopt function */ opterr = 0; /* don't want writing to stderr */ - while ( (i = getopt(argc, argv, "h")) != -1) { + while ( (i = getopt(argc, argv, "hp:c:")) != -1) { switch (i) { /* * Handling options */ - case 'h': + case 'h': /* help option */ printf("Wrong -h option use\n"); usage(); - return(0); + return -1; + break; + case 'c': /* take wait time for childen */ + wait_child=strtol(optarg, NULL, 10); /* convert input */ + break; + case 'p': /* take wait time for childen */ + wait_parent=strtol(optarg, NULL, 10); /* convert input */ break; case '?': /* unrecognized options */ printf("Unrecognized options -%c\n",optopt); @@ -86,16 +93,20 @@ int main(int argc, char *argv[]) printf("Test for forking %d child\n", nchild); /* loop to fork children */ for (i=0; i