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