Sistemate cross-reference dei processi.
[gapil.git] / prochand.tex
1 \chapter{La gestione dei processi}
2 \label{cha:process_handling}
3
4 Come accennato nell'introduzione in un sistema unix ogni attività del sistema
5 viene svolta tramite i processi.  In sostanza i processi costituiscono l'unità
6 base per l'allocazione e l'uso delle risorse del sistema.
7
8 Nel precedente capitolo abbiamo visto come funziona un singolo processo, in
9 questo capitolo affronteremo i dettagli della creazione e della distruzione
10 dei processi, della gestione dei loro attributi e privilegi, e di tutte le
11 funzioni a questo connesse.
12
13
14 \section{Introduzione}
15 \label{sec:proc_gen}
16
17 Partiremo con una introduzione generale ai concetti che stanno alla base della
18 gestione dei processi in unix. Introdurremo in questa sezione l'architettura
19 della gestione dei processi e le sue principali caratteristiche.  
20
21 \subsection{La gerarchia dei processi}
22 \label{sec:proc_hierarchy}
23
24 Una delle caratteristiche essenziali di unix (che esamineremo in dettaglio più
25 avanti) è che ogni processo può a sua volta generare altri processi figli
26 (\textit{child}): questo è ad esempio quello che fa la shell quando mette in
27 esecuzione il programma che gli indichiamo nella linea di comando.
28
29 Una seconda caratteristica di unix è che ogni processo viene sempre generato
30 in tale modo da un processo genitore (\textit{parent}) attraverso una apposita
31 system call. Questo vale per tutti i processi, tranne per un processo
32 speciale, che normalmente è \file{/sbin/init}, che invece viene lanciato dal
33 kernel finita la fase di avvio e che quindi non è figlio di nessuno.
34
35 Tutto ciò significa che, come per i file su disco, i processi sono organizzati
36 gerarchicamente dalla relazione fra genitori e figli; alla base dell'albero in
37 questo caso c'è \file{init} che è progenitore di ogni altro processo.
38
39
40 \subsection{La gestione dei processi}
41 \label{sec:proc_handling_intro}
42
43 I processi vengono creati dalla funzione \texttt{fork}; in genere questa è una
44 system call, ma Linux però usa un'altra nomenclatura, e la funzione fork è
45 basata a sua volta sulla system call \texttt{clone}, che viene usata anche per
46 generare i \textit{thread}.  Il processo figlio creato dalla \textit{fork} è
47 una copia identica del processo processo padre, solo che ha un suo pid
48 proprio.
49
50 Se si vuole che il processo padre si fermi fino alla conclusione del processo
51 figlio questo deve essere specificato subito dopo la fork chiamando la
52 funzione \texttt{wait} o la funzione \texttt{waitpid}, che restituiscono anche
53 una informazione abbastanza limitata (il codice di uscita) sulle cause della
54 terminazione del processo.
55
56 Quando un processo ha concluso il suo compito o ha incontrato un errore non
57 risolvibile esso può essere terminato con la funzione \texttt{exit} (si veda
58 quanto discusso in \secref{sec:proc_termination}). La vita del processo
59 però termina solo quando viene chiamata la quando la sua conclusione viene
60 ricevuta dal processo padre, a quel punto tutte le risorse allocate nel
61 sistema ad esso associate vengono rilasciate.
62
63 Avere due processi che eseguono esattamente lo stesso codice non è molto
64 utile, normalmente si genera un secondo processo per affidargli l'esecuzione di
65 un compito specifico (ad esempio gestire una connessione dopo che questa è
66 stata stabilita), o fargli eseguire (come fa la shell) un altro programma. Per
67 questo si usa la seconda funzione fondamentale per programmazione coi processi
68 che è la \texttt{exec}.
69
70 Il programma che un processo sta eseguendo si chiama immagine del processo
71 (\textit{process image}), le funzioni della famiglia \func{exec} permettono
72 di caricare un'altro programma da disco sostituendo quest'ultimo alla process
73 image corrente, questo fa si che la precedente immagine venga completamente
74 cancellata e quando il nuovo programma esce anche il processo termina, senza
75 ritornare alla precedente immagine.
76
77 Per questo motivo la \func{fork} e la \func{exec} sono funzioni molto
78 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
79 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
80 non ritorna mai (in quanto con essa viene eseguito un altro programma).
81
82 I processi vengono creati dalla funzione \texttt{fork}; in genere questa è una
83 system call, ma Linux però usa un'altra nomenclatura, e la funzione fork è
84 basata a sua volta sulla system call \texttt{clone}, che viene usata anche per
85 generare i \textit{thread}.  Il processo figlio creato dalla \textit{fork} è
86 una copia identica del processo processo padre, solo che ha un suo pid
87 proprio.
88
89 Se si vuole che il processo padre si fermi fino alla conclusione del processo
90 figlio questo deve essere specificato subito dopo la fork chiamando la
91 funzione \texttt{wait} o la funzione \texttt{waitpid}, che restituiscono anche
92 una informazione abbastanza limitata (il codice di uscita) sulle cause della
93 terminazione del processo.
94
95 Quando un processo ha concluso il suo compito o ha incontrato un errore non
96 risolvibile esso può essere terminato con la funzione \texttt{exit} (si veda
97 quanto discusso in \secref{sec:proc_termination}). La vita del processo
98 però termina solo quando viene chiamata la quando la sua conclusione viene
99 ricevuta dal processo padre, a quel punto tutte le risorse allocate nel
100 sistema ad esso associate vengono rilasciate.
101
102 Avere due processi che eseguono esattamente lo stesso codice non è molto
103 utile, normalmente si genera un secondo processo per affidargli l'esecuzione di
104 un compito specifico (ad esempio gestire una connessione dopo che questa è
105 stata stabilita), o fargli eseguire (come fa la shell) un altro programma. Per
106 questo si usa la seconda funzione fondamentale per programmazione coi processi
107 che è la \texttt{exec}.
108
109 Il programma che un processo sta eseguendo si chiama immagine del processo
110 (\textit{process image}), le funzioni della famiglia \func{exec} permettono
111 di caricare un'altro programma da disco sostituendo quest'ultimo alla process
112 image corrente, questo fa si che la precedente immagine venga completamente
113 cancellata e quando il nuovo programma esce anche il processo termina, senza
114 ritornare alla precedente immagine.
115
116 Per questo motivo la \func{fork} e la \func{exec} sono funzioni molto
117 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
118 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
119 non ritorna mai (in quanto con essa viene eseguito un altro programma).
120
121
122
123 \section{Il controllo dei processi}
124 \label{sec:proc_control}
125
126 Esamineremo in questa sezione le varie funzioni per il controllo dei processi:
127 la loro creazione, la terminazione, l'esecuzione di altri programmi. Prima di
128 trattare in dettaglio le singole funzioni, 
129
130 \subsection{Gli identificatori dei processi}
131 \label{sec:proc_id}
132
133 Ogni processo viene identificato dal sistema da un numero identificativo
134 unico, il \textit{process id} o \acr{pid}. Questo viene assegnato in forma
135 progressiva ogni volta che un nuovo processo viene creato, fino ad un limite
136 massimo (in genere essendo detto numero memorizzato in un intero a 16 bit si
137 arriva a 32767) oltre il quale si riparte dal numero più basso disponibile
138 (FIXME: verificare, non sono sicuro).  Per questo motivo processo il processo
139 di avvio (init) ha sempre il pid uguale a uno.
140
141 Ogni processo è identificato univocamente dal sistema per il suo pid;
142 quest'ultimo è un tipo di dato standard, il \texttt{pid\_t} che in genere è un
143 intero con segno (nel caso di Linux e delle glibc il tipo usato è
144 \texttt{int}).
145
146 Tutti i processi inoltre portano traccia del pid del genitore, chiamato in
147 genere \textit{ppid} (da \textit{Parente Process Id}). Questi identificativi
148 possono essere ottenuti da un programma usando le funzioni:
149 \begin{functions}
150 \headdecl{sys/types.h}
151 \headdecl{unistd.h}
152 \funcdecl{pid\_t getpid(void)} restituisce il pid del processo corrente.
153 \funcdecl{pid\_t getppid(void)} restituisce il pid del padre del processo
154     corrente.
155 \end{functions}
156
157
158
159 \subsection{La funzione \func{fork}}
160 \label{sec:proc_fork}
161
162 La funzione \func{fork} 
163
164
165 Dopo l'esecuzione di una fork sia il processo padre che il processo figlio
166 continuano ad essere eseguiti normalmente, ed il processo figlio esegue
167 esattamente lo stesso codice del padre. La sola differenza è che nel processo
168 padre il valore di ritorno della funzione fork è il pid del processo figlio,
169 mentre nel figlio è zero; in questo modo il programma può identificare se
170 viene eseguito dal padre o dal figlio. 
171
172
173
174
175 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
176 \label{sec:proc_wait}
177
178 \subsection{Le funzioni \texttt{exec}}
179 \label{sec:proc_exec}
180
181
182
183
184 \section{Il controllo di accesso}
185 \label{sec:proc_perms}
186
187 Va messo qui tutta la storia su effective, real, saved uid, e pure le cose di
188 Linux come il filesystem uid.
189
190 \subsection{Le funzioni \texttt{setuid} e \texttt{setgid}}
191 \label{sec:proc_setuid}
192
193
194 \subsection{Le funzioni \texttt{seteuid} e \texttt{setegid}}
195 \label{sec:proc_seteuid}
196