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