Completato il capitolo sui socket elementari, con tanto di spiegazioni delle
[gapil.git] / process.tex
1 \chapter{Il funzionamento di un processo unix}
2 \label{cha:process}
3
4 Prima di entrare nei dettagli di come un sistema unix gestisce la presenza di
5 molti processi concorrenti daremo una descrizione del funzionamento di un
6 singolo processo, come viene posto in esecuzione, come viene terminato, come
7 vede la memoria e la può gestire, come può ricevere e gestire i parametri.
8
9
10 \section{La funzione \texttt{main}} 
11 \label{sec:proc_}
12
13
14
15 \subsection{}
16 \label{sec:proc_}
17
18
19
20 \subsection{La funzione \texttt{exit}}
21 \label{sec:proc_exit}
22
23
24 \section{Gestione di parametri e opzioni}
25 \label{sec:parameter_options}
26
27 Il passaggio dei parametri e delle variabili di ambiente dalla riga di comando
28 al singolo programma quando viene lanciato è effettuato attraverso le
29 variabili \texttt{argc}, \texttt{argv} che vengono passate al programma
30 come argomenti della funzione principale:
31
32 \subsection{Il formato dei parametri}
33 \label{sec:proc_par_format}
34 In genere passaggio dei parametri al programma viene effettuato dalla shell,
35 che si incarica di leggere la linea di comando e di effettuarne la scansione
36 (il cosiddetto \textit{parsing}) per individuare le parole che la compongono,
37 ciascuna delle quali viene considerata un parametro; di default per
38 individuare le parole viene usato come separatore lo spazio (comportamento
39 modificabile attraverso il settaggio della variabile di ambiente IFS).
40
41 Nella scansione viene costruito l'array di puntatori \texttt{argv} inserendo
42 in successione il puntatore alla stringa costituente l'$n$-simo parametro; la
43 variabile \texttt{argc} viene inizializzata al numero di parametri trovati, in
44 questo modo il primo parametro è sempre il nome del programma (vedi \nfig).
45
46 \subsection{La gestione delle opzioni}
47 \label{sec:proc_opt_handling}
48
49 In generale un programma unix riceve da linea di comando sia i parametri che
50 le opzioni, queste ultime sono standardizzate per essere riconosciute come
51 tali: un elemento di \texttt{argv} che inizia con \texttt{-} e che non sia un
52 singolo \texttt{-} o \texttt{--} viene considerato un'opzione.  In in genere
53 le opzioni sono costituite da un lettera preceduta dal meno e possono avere o
54 no un parametro associato; un comando tipico può essere cioè qualcosa del
55 tipo:
56 \begin{verbatim}
57 touch -r riferimento.txt -m questofile.txt
58 \end{verbatim}
59 ed in questo caso le opzioni sono \texttt{m} ed \texttt{r}.
60
61 Per gestire le opzioni all'interno dei parametri passati in \texttt{argv} le
62 librerie standard del C forniscono la funzione \texttt{getopt} (accessibile
63 includendo \texttt{unistd.h}), che ha il prototipo:
64 \begin{verbatim}
65 int getopt(int argc, char * const argv[], const char * optstring);
66 \end{verbatim}
67
68 Questa funzione prende come argomenti le due variabili \texttt{argc} e
69 \texttt{argv} ed una stringa che indica quali sono le opzioni valide; la
70 funzione effettua la scansione della lista dei parametri ricercando ogni
71 stringa che comincia con \texttt{-} e ritorna ogni volta che trova una opzione
72 valida.
73
74 La stringa \texttt{optstring} indica quali sono le opzioni riconosciute ed è
75 costituita da tutti i caratteri usati per identificare le singole opzioni, se
76 l'opzione ha un parametro al carattere deve essere fatto seguire un segno di
77 due punti \texttt{:} nel caso appena accennato ad esempio la stringa di
78 opzioni sarebbe \texttt{"r:m"}.
79
80 La modalità di uso è pertanto quella di chiamare più volte la funzione
81 all'interno di un ciclo di while fintanto che essa non ritorna il valore
82 \texttt{-1} che indica che non ci sono più opzioni. Nel caso si incontri
83 un'opzione non dichiarata in \texttt{optstring} viene ritornato un \texttt{?}
84 mentre se l'opzione non è seguita da un parametro viene ritornato un
85 \texttt{:} infine se viene incontrato il valore \texttt{--} la scansione viene
86 considerata conclusa.
87
88 Quando la funzione trova un'opzione essa ritorna il valore numerico del
89 carattere, in questo modo si possono prendere le azioni relative usando un
90 case; la funzione inizializza inoltre alcune varibili globali:
91 \begin{itemize}
92 \item \texttt{char * optarg} contiene il puntatore alla stringa argomento
93   dell'opzione.
94 \item \texttt{int optind} alla fine della scansione restituisce l'indice del
95   primo argomento che non è un'opzione.
96 \item \texttt{int opterr} previene, se posto a zero, la stampa di un messaggio
97   di errore in caso di riconoscimento di opzioni non definite.
98 \item \texttt{int optopt} contiene il carattere dell'opzione non riconosciuta.
99 \end{itemize}
100
101 In \nfig è mostrato un programma di esempio, 
102
103
104 \begin{figure}[htbp]
105   \footnotesize
106     \begin{lstlisting}{}
107     opterr = 0;  /* don't want writing to stderr */
108     while ( (i = getopt(argc, argv, "o:a:i:hve")) != -1) {
109         switch (i) {
110         case 'i':   /* input file */
111             in_file=open(optarg,O_RDONLY);
112             if (in_file<0) {
113                 perror("Cannot open input file");
114                 exit(1);
115             }
116             break;
117         case 'o':   /* output file (overwrite) */
118             out_file=open(optarg,O_WRONLY|O_CREAT);
119             if (out_file<0) {
120                 perror("Cannot open output file");
121                 exit(1);
122             }
123             break;
124             break;
125         case 'a':   /* output file (append) */
126             out_file=open(optarg,O_WRONLY|O_CREAT|O_APPEND);
127             break;
128         case 'h':   /* print help usage */
129             usage();
130             break;
131         case 'v':   /* set verbose mode */
132             debug("Option -v active\n");
133             verbose=1;
134             break;
135         case '?':   /* unrecognized options */
136             printf("Unrecognized options -%c\n",optopt);
137             usage();
138         default:    /* should not reached */
139             debug("default option\n");
140             usage();
141         }
142     }
143     debug("Optind %d, argc %d\n",optind,argc);
144   \end{lstlisting}
145   \caption{Esempio di codice per la gestione delle opzioni.}
146   \label{fig:proc_options_code}
147 \end{figure}
148
149 \subsection{Opzioni in formato esteso}
150 \label{sec:proc_opt_extended}
151
152 Un'estensione di questo schema è costituito dalle cosiddette
153 \textit{long-options} espresse nella forma \texttt{--option=parameter}, anche
154 la gestione di queste ultime è stata standardizzata attraverso l'uso di una
155 versione estesa di \texttt{getopt}.
156
157
158 \subsection{Le variabili di ambiente}
159 \label{sec:proc_env_var}
160
161 Questo va fatto.
162
163