69bdb16e4224a89cfe216fca14896f760804029b
[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, e daremo una
20 panoramica sull'uso delle principali funzioni per la gestione dei processi.
21
22 \subsection{La gerarchia dei processi}
23 \label{sec:proc_hierarchy}
24
25 A differenza di quanto avviene in altri sistemi (ad esempio nel VMS la
26 generazione di nuovi processi è un'operazione privilegiata) una delle
27 caratteristiche di unix (che esamineremo in dettaglio più avanti) è che
28 qualunque processo può a sua volta generarne altri, detti processi figli
29 (\textit{child process}). Ogni processo è identificato presso il sistema da un
30 numero unico, il \acr{pid} (da \textit{process identifier}).
31
32 Una seconda caratteristica è che la generazione di un processo è una
33 operazione separata rispetto al lancio di un programma. In genere la sequenza
34 è sempre quella di creare un nuovo processo, il quale si eseguirà, in un passo
35 successivo, il programma voluto: questo è ad esempio quello che fa la shell
36 quando mette in esecuzione il programma che gli indichiamo nella linea di
37 comando.
38
39 Una terza caratteristica è che ogni processo viene sempre generato da un altro
40 che viene chiamato processo genitore (\textit{parent process}). Questo vale
41 per tutti i processi, con una eccezione (dato che ci deve essere un punto di
42 partenza), esiste sempre infatti un processo speciale, che normalmente è
43 \cmd{/sbin/init}, che viene lanciato dal kernel quando questo ha finito la
44 fase di avvio, esso essendo il primo processo lanciato ha sempre il \acr{pid}
45 uguale a 1 e non è figlio di nessuno.
46
47 Questo è ovviamente un processo speciale, che in genere si occupa di far
48 partire tutti gli processi altri necessari al funzionamento del sistema,
49 inoltre \cmd{init} è essenziale per svolgere una serie di compiti
50 amministrativi nelle operazioni ordinarie del sistema (torneremo si alcuni di
51 essi in \secref{}) e non può mai essere terminato. La struttura del sistema
52 comunque consente di lanciare al posto di \cmd{init} qualunque altro programma
53 (e in casi di emergenza, ad esempio se il file di \cmd{init} si fosse
54 corrotto, è possibile farlo ad esempio passando la riga \cmd{init=/bin/sh}
55 all'avvio).
56
57 Dato che tutti i processi successivi sono comunque generati da \cmd{init} o da
58 suoi figli tutto ciò comporta che, i processi sono organizzati gerarchicamente
59 dalla relazione fra genitori e figli, in maniera analoga a come i file sono
60 organizzati in un albero di directory con alla base \file{/} (si veda
61 \secref{sec:file_file_struct}); in questo caso alla base dell'albero c'è il
62 processo \cmd{init} che è progenitore di ogni altro processo\footnote{in
63   realtà questo non è del tutto vero, in Linux ci sono alcuni processi che pur
64   comparendo come figli di init (ad esempio in \cmd{pstree}) sono generati
65   direttamente dal kernel, come \cmd{keventd}, \cmd{kswapd}, etc.}.
66
67
68 \subsection{Una panoramica sulle funzioni di gestione}
69 \label{sec:proc_handling_intro}
70
71 I processi vengono creati dalla funzione \func{fork}; in molti unix questa è
72 una system call, Linux però usa un'altra nomenclatura, e la funzione fork è
73 basata a sua volta sulla system call \func{\_\_clone}, che viene usata anche
74 per generare i \textit{thread}.  Il processo figlio creato dalla \func{fork} è
75 una copia identica del processo processo padre, ma ha nuovo \acr{pid} e viene
76 eseguito in maniera indipendente (le differenze fra padre e figlio sono
77 affrontate in dettaglio in \secref{sec:proc_fork}).
78
79 Se si vuole che il processo padre si fermi fino alla conclusione del processo
80 figlio questo deve essere specificato subito dopo la \func{fork} chiamando la
81 funzione \func{wait} o la funzione \func{waitpid}; queste funzioni
82 restituiscono anche una informazione abbastanza limitata (il codice di uscita)
83 sulle cause della terminazione del processo.
84
85 Quando un processo ha concluso il suo compito o ha incontrato un errore non
86 risolvibile esso può essere terminato con la funzione \func{exit} (si veda
87 quanto discusso in \secref{sec:proc_termination}). La vita del processo però
88 termina solo quando la notifica della sua conclusione viene ricevuta dal
89 processo padre, a quel punto tutte le risorse allocate nel sistema ad esso
90 associate vengono rilasciate.
91
92 Avere due processi che eseguono esattamente lo stesso codice non è molto
93 utile, normalmente si genera un secondo processo per affidargli l'esecuzione
94 di un compito specifico (ad esempio gestire una connessione dopo che questa è
95 stata stabilita), o fargli eseguire (come fa la shell) un altro programma. Per
96 quest'ultimo caso si usa la seconda funzione fondamentale per programmazione
97 coi processi che è la \func{exec}.
98
99 Il programma che un processo sta eseguendo si chiama immagine del processo (o
100 \textit{process image}), le funzioni della famiglia \func{exec} permettono di
101 caricare un'altro programma da disco sostituendo quest'ultimo all'immagine
102 corrente; questo fa si che l'immagine precedente venga completamente
103 cancellata. Questo significa che quando il nuovo programma esce anche il
104 processo termina, e non si può tornare alla precedente immagine.
105
106 Per questo motivo la \func{fork} e la \func{exec} sono funzioni molto
107 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
108 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
109 non ritorna mai (in quanto con essa viene eseguito un altro programma).
110
111
112
113 \section{La gestione dei processi}
114 \label{sec:proc_handling}
115
116 In questa sezione tratteremo le funzioni per la gestione dei processi, a
117 partire dalle funzioni elementari che permettono di leggerne gli
118 identificatori, alle varie funzioni di manipolazione dei processi, che
119 riguardano la loro creazione, terminazione, e la messa in esecuzione di altri
120 programmi.
121
122
123 \subsection{Gli identificatori dei processi}
124 \label{sec:proc_pid}
125
126 Come accennato nell'introduzione ogni processo viene identificato dal sistema
127 da un numero identificativo unico, il \textit{process id} o \acr{pid};
128 quest'ultimo è un tipo di dato standard, il \type{pid\_t} che in genere è un
129 intero con segno (nel caso di Linux e delle glibc il tipo usato è \type{int}).
130
131 Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo
132 processo viene creato, fino ad un limite massimo (in genere essendo detto
133 numero memorizzato in un intero a 16 bit si arriva a 32767) oltre il quale si
134 riparte dal numero più basso disponibile (FIXME: verificare, non sono sicuro).
135 Per questo motivo processo il processo di avvio (\cmd{init}) ha sempre il
136 \acr{pid} uguale a uno. 
137
138 Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui
139 sono stati creati, questo viene chiamato in genere \acr{ppid} (da
140 \textit{parent process id}) ed è normalmente utilizzato per il controllo di
141 sessione.  Questi due identificativi possono essere ottenuti da programma
142 usando le funzioni:
143 \begin{functions}
144 \headdecl{sys/types.h}
145 \headdecl{unistd.h}
146 \funcdecl{pid\_t getpid(void)} restituisce il pid del processo corrente.
147 \funcdecl{pid\_t getppid(void)} restituisce il pid del padre del processo
148     corrente.
149
150 Entrambe le funzioni non riportano condizioni di errore. 
151 \end{functions}
152
153 Il fatto che il \acr{pid} sia un numero univoco per il sistema lo rende il
154 candidato ideale per generare ulteriori indicatori associati al processo di
155 cui diventa possibile garantire l'unicità: ad esempio la funzione
156 \func{tmpname} (si veda \secref{sec:file_temp_file}) usa il \acr{pid} per
157 generare un pathname univoco, che non potrà essere replicato da un'altro
158 processo che usi la stessa funzione. 
159
160 Tutti i processi figli dello stesso processo padre sono detti
161 \textit{sibling}, questa è un'altra delle relazioni usate nel controllo di
162 sessione, in cui si raggruppano tutti i processi creati su uno stesso
163 terminale una volta che si è effettuato il login. Torneremo su questo
164 argomento in \secref{cap:terminal}, dove esamineremo tutti gli altri
165 identificativi associati ad un processo relativi al controllo di sessione.
166
167
168 \subsection{La funzione \func{fork}}
169 \label{sec:proc_fork}
170
171 La funzione \func{fork} è la funzione fondamentale della gestione dei processi
172 in unix; come si è detto l'unico modo di creare un nuovo processo è attraverso
173 l'uso di questa funzione, che è quindi la base per il multitasking. Il prototipo
174 della funzione è:
175
176 \begin{functions}
177   \headdecl{sys/types.h} 
178   \headdecl{unistd.h} 
179   \funcdecl{pid\_t fork(void)} 
180   Restituisce zero al padre e il \acr{pid} al figlio in caso di successo,
181   ritorna -1 al padre (senza creare il figlio) in caso di errore;
182   \texttt{errno} può assumere i valori:
183   \begin{errlist}
184   \item \macro{EAGAIN} non ci sono risorse sufficienti per creare un'altro
185     processo (per allocare la tabella delle pagine e le strutture del task) o
186     si è esaurito il numero di processi disponibili.
187   \item \macro{ENOMEM} non è stato possibile allocare la memoria per le
188     strutture necessarie al kernel per creare il nuovo processo.
189   \end{errlist}
190 \end{functions}
191
192 Dopo l'esecuzione di una \func{fork} sia il processo padre che il processo
193 figlio continuano ad essere eseguiti normalmente alla istruzione seguente la
194 \func{fork}; il processo figlio è però una copia del padre, e riceve una copia
195 dei segmenti di testo, stack e dati (vedi \secref{sec:proc_mem_layout}), ed
196 esegue esattamente lo stesso codice del padre, ma la memoria è copiata, non
197 condivisa\footnote{In generale il segmento di testo, che è identico, è
198   condiviso e tenuto in read-only, Linux poi utilizza la tecnica del
199   \textit{copy-on-write}, per cui la memoria degli altri segmenti viene
200   copiata dal kernel per il nuovo processo solo in caso di scrittura, rendendo
201   molto più efficiente il meccanismo} pertanto padre e figlio vedono variabili
202 diverse.
203
204 La differenza che si ha nei due processi è che nel processo padre il valore di
205 ritorno della funzione fork è il \acr{pid} del processo figlio, mentre nel
206 figlio è zero; in questo modo il programma può identificare se viene eseguito
207 dal padre o dal figlio.
208 Si noti come la funzione \func{fork} ritorni \textbf{due} volte: una nel padre
209 e una nel figlio. La sola differenza che si ha nei due processi è il valore di
210 ritorno restituito dalla funzione, che nel padre è il \acr{pid} del figlio
211 mentre nel figlio è zero; in questo modo il programma può identificare se
212 viene eseguito dal padre o dal figlio. 
213
214 La scelta di questi valori non è casuale, un processo infatti può avere più
215 figli, ed il valore di ritorno di \func{fork} è l'unico modo che permette di
216 identificare quello appena creato; al contrario un figlio ha sempre un solo
217 padre (il cui \acr{pid} può sempre essere ottenuto con \func{getppid}, vista
218 in \secref{sec:proc_pid}) e si usa il valore nullo, che non può essere il
219 \acr{pid} di nessun processo.
220
221 \begin{figure}[!htb]
222   \footnotesize
223   \begin{lstlisting}{}
224 #include <errno.h>       /* error definitions and routines */ 
225 #include <stdlib.h>      /* C standard library */
226 #include <unistd.h>      /* unix standard library */
227 #include <stdio.h>       /* standard I/O library */
228 #include <string.h>      /* string functions */
229
230 /* Help printing routine */
231 void usage(void);
232
233 int main(int argc, char *argv[])
234 {
235 /* 
236  * Variables definition  
237  */
238     int nchild, i;
239     pid_t pid;
240     int wait_child=0;
241     int wait_parent=0;
242
243     ...        /* handling options */
244
245     /* There must be remaing parameters */
246     if (optind == argc) {
247         usage();
248     }
249     nchild = atoi(argv[optind]);
250     printf("Test for forking %d child\n", nchild);
251     /* loop to fork children */
252     for (i=0; i<nchild; i++) {
253         if ( (pid = fork()) < 0) {
254             printf("Error on %d child creation, %s\n", i, strerror(errno));
255         }
256         if (pid == 0) {   /* child */
257             printf("Child %d successfully executing\n", ++i);
258             if (wait_child) sleep(wait_child);
259             printf("Child %d exiting\n", i);
260             exit(0);
261         } else {          /* parent */
262             printf("Spawned %d child, pid %d \n", i+1, pid);
263             if (wait_parent) sleep(wait_parent);
264             printf("Go to next child \n");
265         }
266     }
267     /* normal exit */
268     return 0;
269 }
270   \end{lstlisting}
271   \caption{Esempio di codice per la creazione di nuovi processi.}
272   \label{fig:proc_fork_code}
273 \end{figure}
274
275 Normalmente la chiamata a \func{fork} può fallire solo per due ragioni, o ci
276 sono già troppi processi nel sistema (il che di solito è sintomo che
277 qualcos'altro non sta andando per il verso giusto) o si è ecceduto il limite
278 sul numero totale di processi permessi all'utente (il valore della costante
279 \macro{CHILD\_MAX} definito in \file{limits.h}, che fa riferimento ai processo
280 con lo stesso \textit{real user id}).
281
282 L'uso di \func{fork} avviene secondo due modalità principali; la prima è
283 quella in cui all'interno di un programma si creano processi figli per
284 affidargli l'esecuzione di una certa sezione di codice, mentre il processo
285 padre ne esegue un'altra. È il caso tipico dei server di rete in cui il padre
286 riceve ed accetta le richieste da parte dei client, per ciascuna delle quali
287 pone in esecuzione un figlio che è incaricato di fornire il servizio.
288
289 La seconda modalità è quella in cui il processo vuole eseguire un altro
290 programma; questo è ad esempio il caso della shell. In questo caso il processo
291 crea un figlio la cui unica operazione è quella fare una \func{exec} (di cui
292 parleremo in \secref{sec:proc_exec}) subito dopo la \func{fork}.
293
294 Alcuni sistemi operativi (il VMS ad esempio) combinano le operazioni di questa
295 seconda modalità (una \func{fork} seguita da una \func{exec}) in un'unica
296 operazione che viene chiamata \textit{spawn}. Nei sistemi unix-like è stato
297 scelto di mantenere questa separazione, dato che, come visto per la prima
298 modalità d'uso, esistono numerosi scenari in cui si può usare una \func{fork}
299 senza bisogno di una \func{exec}. Inoltre anche nel caso della seconda
300 modalità di operazioni, avere le due funzioni separate permette al figlio di
301 cambiare gli attributi del processo (maschera dei segnali, redirezione
302 dell'output, \textit{user id}) prima della \func{exec}, rendendo molto più
303 flessibile la possibilità di modificare gli attributi del nuovo processo.
304
305 In \curfig\ si è riportato il corpo del codice del programma di esempio
306 \cmd{forktest}, che ci permette di illustrare l'uso della funzione
307 \func{fork}. Il programma permette di creare un numero di figli specificato a
308 linea di comando, e prende anche due opzioni \cmd{-p} e \cmd{-c} per indicare
309 degli eventuali tempi di attesa (in secondi, eseguiti tramite la funzione
310 \func{sleep}) per il padre ed il figlio; il codice completo, compresa la parte
311 che gestisce le opzioni a riga di comando, è disponibile nel file
312 \file{ForkTest.c}.
313
314 Decifrato il numero di figli da creare, il ciclo principale del programma
315 (\texttt{\small 28--40}) esegue in successione la creazione dei processi figli
316 controllando il successo della chiamata a \func{fork} (\texttt{\small
317   29--31}); ciascun figlio (\texttt{\small 29--31}) si limita a stampare il
318 suo numero di successione, eventualmente attendere il numero di secondi
319 specificato e scrivere un messaggio prima di uscire. Il processo padre invece
320 (\texttt{\small 29--31}) stampa un messaggio di creazione, eventualmente
321 attende il numero di secondi specificato, e procede nell'esecuzione del ciclo.
322 Se eseguiamo il comando senza specificare attese (il default è non attendere),
323 otterremo come output sul terminale:
324 \begin{verbatim}
325 [piccardi@selidor sources]$ ./forktest 3
326 Test for forking 3 child
327 Spawned 1 child, pid 2038 
328 Child 1 successfully executing
329 Child 1 exiting
330 Go to next child 
331 Spawned 2 child, pid 2039 
332 Child 2 successfully executing
333 Child 2 exiting
334 Go to next child 
335 Child 3 successfully executing
336 Child 3 exiting
337 Spawned 3 child, pid 2040 
338 Go to next child 
339 \end{verbatim} %$
340
341 Esaminiamo questo risultato: una prima conclusione che si può trarre è non si
342 può dire quale processo fra il padre ed il figlio venga eseguito per
343 primo\footnote{anche se nel kernel 2.4.x era stato introdotto un meccanismo
344   che metteva in esecuzione sempre il xxx per primo (TODO recuperare le
345   informazioni esatte)} dopo la chiamata a \func{fork}; dall'esempio si può
346 notare infatti come nei primi due cicli sia stato eseguito per primo il padre
347 (con la stampa del \acr{pid} del nuovo processo) per poi passare
348 all'esecuzione del figlio (completata con i due avvisi di esecuzione ed
349 uscita), e tornare all'esecuzione del padre (con la stampa del passaggio al
350 ciclo successivo), mentre la terza volta è stato prima eseguito il figlio
351 (fino alla conclusione) e poi il padre.
352
353 In generale l'ordine di esecuzione dipenderà, oltre che dall'algoritmo di
354 scheduling usato dal kernel, dalla particolare situazione in si trova la
355 macchina al momento della chiamata, risultando del tutto impredicibile.
356 Eseguendo più volte il programma di prova e producendo un numero diverso di
357 figli, si sono ottenute situazioni completamente diverse, compreso il caso in
358 cui il processo padre ha eseguito più di una \func{fork} prima che uno dei
359 figli venisse messo in esecuzione.
360
361 Pertanto non si può fare nessuna assunzione sulla sequenza di esecuzione delle
362 istruzioni del codice fra padre e figli, nè sull'ordine in cui questi potranno
363 essere messi in esecuzione, e se è necessaria una qualche forma di precedenza
364 occorrerà provvedere ad espliciti meccanismi di sincronizzazione, pena il
365 rischio di incorrere nelle cosiddette \textit{race conditions}.
366
367 Si noti inoltre che, come accennato, essendo i segmenti di memoria utilizzati
368 dai singoli processi completamente separati, le modifiche delle variabili nei
369 processi figli (come l'incremento di \var{i} in \texttt{\small 33}) sono
370 visibili solo al loro interno, e non hanno alcun effetto sul valore che le
371 stesse variabili hanno nel processo padre (ed in eventuali altri processi
372 figli che eseguano lo stesso codice).
373
374 Un secondo aspetto molto importante nella creazione dei processi figli è
375 quello dell'interazione dei vari processi con i file; per illustrarlo meglio
376 proviamo a redirigere su un file l'output del nostro programma di test, quello
377 che otterremo è:
378 \begin{verbatim}
379 [piccardi@selidor sources]$ ./forktest 3 > output
380 [piccardi@selidor sources]$ cat output
381 Test for forking 3 child
382 Child 1 successfully executing
383 Child 1 exiting
384 Test for forking 3 child
385 Spawned 1 child, pid 836 
386 Go to next child 
387 Child 2 successfully executing
388 Child 2 exiting
389 Test for forking 3 child
390 Spawned 1 child, pid 836 
391 Go to next child 
392 Spawned 2 child, pid 837 
393 Go to next child 
394 Child 3 successfully executing
395 Child 3 exiting
396 Test for forking 3 child
397 Spawned 1 child, pid 836 
398 Go to next child 
399 Spawned 2 child, pid 837 
400 Go to next child 
401 Spawned 3 child, pid 838 
402 Go to next child 
403 \end{verbatim}
404 che come si vede è completamente diverso da quanto ottenevamo sul terminale.
405
406 Il comportamento delle varie funzioni di interfaccia con i file è analizzato
407 in gran dettaglio in \capref{cha:file_unix_interface} e in
408 \secref{cha:files_std_interface}. Qui basta accennare che si sono usate le
409 funzioni standard della libreria del C che prevedono l'output bufferizzato; e
410 questa bufferizzazione varia a seconda che si tratti di un file su disco (in
411 cui il buffer viene scaricato su disco solo quando necessario) o di un
412 terminale (nel qual caso il buffer viene scaricato ad ogni a capo).
413
414 Nel primo esempio allora avevamo che ad ogni chiamata a \func{printf} il
415 buffer veniva scaricato, e le singole righe erano stampate a video subito dopo
416 l'esecuzione della \func{printf}. Ma con la redirezione su file la scrittura
417 non avviene più alla fine di ogni riga e l'output resta nel buffer, per questo
418 motivo, dato che ogni figlio riceve una copia della memoria del padre, esso
419 riceverà anche quanto c'è nel buffer delle funzioni di I/O, comprese le linee
420 scritte dal padre fino allora. Così quando all'uscita del figlio il buffer
421 viene scritto su disco, troveremo nel file anche tutto quello che il processo
422 padre aveva scritto prima della sua creazione.  E alla fine del file, dato che
423 in questo caso il padre esce per ultimo, troviamo anche l'output del padre.
424
425 Ma l'esempio ci mostra un'altro aspetto fondamentale dell'interazione con i
426 file, che era valido anche per l'esempio precedente, ma meno evidente; il
427 fatto cioè che non solo processi diversi possono scrivere in contemporanea
428 sullo stesso file (l'argomento della condivisione dei file in unix è trattato
429 in dettaglio in \secref{sec:file_sharing}), ma anche che, a differenza di
430 quanto avviene per le variabili, la posizione corrente sul file è condivisa 
431 fra il padre e tutti i processi figli. 
432
433 Quello che succede è che quando lo standard output del padre viene rediretto,
434 lo stesso avviene anche per tutti i figli; la funzione \func{fork} infatti ha
435 la caratteristica di duplicare (allo stesso modo in cui lo fa la funzione
436 \func{dup}, trattata in \secref{sec:file_dup}) nei figli tutti i file
437 descriptor aperti nel padre, il che comporta che padre e figli condividono
438 le stesse voci della file table (per la spiegazione di questi termini si veda
439 \secref{sec:file_sharing} e referenza a figura da fare) e quindi anche
440 l'offset corrente nel file.
441
442 In questo modo se un processo scrive sul file aggiornerà l'offset sulla file
443 table, e tutti gli altri processi che condividono la file table vedranno il
444 nuovo valore; in questo modo si evita, in casi come quello appena mostrato in
445 cui diversi processi scrivono sullo stesso file, che l'output successivo di un
446 processo vada a sovrapporsi a quello dei precedenti (l'output potrà risultare
447 mescolato, ma non ci saranno parti perdute per via di una sovrascrittura).
448
449 Questo tipo di comportamento è essenziale in tutti quei casi in cui il padre
450 crea un figlio ed attende la sua conclusione per proseguire, ed entrambi
451 scrivono sullo stesso file, ad esempio lo standard output (un caso tipico è la
452 shell). Se l'output viene rediretto con questo comportamento avremo che il
453 padre potrà continuare a scrivere automaticamente in coda a quanto scritto dal
454 figlio; se così non fosse ottenere questo comportamento sarebbe estremamente
455 complesso necessitando di una qualche forma di comunicazione fra i due
456 processi.
457
458 In generale comunque non è buona norma far scrivere più processi sullo stesso
459 file senza una qualche forma di sincronizzazione in quanto, come visto con il
460 nostro esempio, le varie scritture risulteranno mescolate fra loro in una
461 sequenza impredicibile. Le modalità con cui in genere si usano i file dopo una
462 \func{fork} sono sostanzialmente due:
463 \begin{enumerate}
464 \item Il processo padre aspetta la conclusione del figlio. In questo caso non
465   è necessaria nessuna azione riguardo ai file, in quanto la sincronizzazione
466   degli offset dopo eventuali operazioni di lettura e scrittura effettuate dal
467   figlio è automatica.
468 \item L'esecuzione di padre e figlio procede indipendentemente. In questo caso
469   ciascuno dei due deve chiudere i file che non gli servono una volta che la
470   \func{fork} è stata eseguita, per evitare ogni forma di interferenza.
471 \end{enumerate}
472
473 Oltre ai file aperti i processi figli ereditano dal padre una serie di altre
474 proprietà comuni; in dettaglio avremo che dopo l'esecuzione di una \func{fork}
475 padre e figlio avranno in comune:
476 \begin{itemize}
477 \item i file aperti (e gli eventuali flag di \textit{close-on-exec} se
478   settati).
479 \item gli identificatori per il controllo di accesso: il \textit{real user
480     id}, il \textit{real group id}, l'\textit{effective user id},
481   l'\textit{effective group id} e i \textit{supplementary group id} (vedi
482   \secref{tab:proc_uid_gid}).
483 \item gli identificatori per il controllo di sessione: il \textit{process
484     group id} e il \textit{session id} e il terminale di controllo.
485 \item i flag \acr{suid} e \acr{suid} (vedi \secref{sec:file_suid_sgid}).
486 \item la directory di lavoro e la directory radice (vedi
487   \secref{sec:file_work_dir}).
488 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
489 \item la maschera dei segnali.
490 \item i segmenti di memoria condivisa agganciati al processo. 
491 \item i limiti sulle risorse
492 \item le variabili di ambiente (vedi \secref{sec:proc_environ}).
493 \end{itemize}
494 le differenze invece sono:
495 \begin{itemize}
496 \item il valore di ritorno di \func{fork}.
497 \item il \textit{process id}. 
498 \item il \textit{parent process id} (quello del figlio viene settato al
499   \acr{pid} del padre).
500 \item i valori dei tempi di esecuzione (\var{tms\_utime}, \var{tms\_stime},
501   \var{tms\_cutime}, \var{tms\_uetime}) che nel figlio sono posti a zero.
502 \item i \textit{file lock}, che non vengono ereditati dal figlio.
503 \item gli allarmi pendenti, che per il figlio vengono cancellati.
504 \end{itemize}
505
506
507 \subsection{La funzione \func{vfork}}
508 \label{sec:proc_vfork}
509
510 La funzione \func{vfork} è esattamente identica a \func{fork} ed ha la stessa
511 semantica e gli stessi errori; la sola differenza è che non viene creata la
512 tabella delle pagine né la struttura dei task per il nuovo processo. Il
513 processo padre è posto in attesa fintanto che il figlio non ha eseguito una
514 \func{execve} o non è uscito con una \func{\_exit}. Il figlio condivide la
515 memoria del padre (e modifiche possono avere effetti imprevedibili) e non deve
516 ritornare o uscire con \func{exit} ma usare esplicitamente \func{\_exit}.
517
518 Questa funzione è un rimasuglio dei vecchi tempi in cui eseguire una
519 \func{fork} comportava anche la copia completa del segmento dati del processo
520 padre, che costituiva un inutile appesantimento in tutti quei casi in cui la
521 \func{fork} veniva fatto solo per poi eseguire una \func{exec}. La funzione
522 venne introdotta in BSD per migliorare le prestazioni.
523
524 Dato che Linux supporta il \textit{copy on write} la perdita di prestazioni è
525 assolutamente trascurabile, e l'uso di questa funzione (che resta un caso
526 speciale della funzione \func{clone}), è deprecato, per questo eviteremo di
527 trattarla ulteriormente.
528
529
530 \subsection{La conclusione di un processo.}
531 \label{sec:proc_termination}
532
533 In \secref{sec:proc_conclusion} abbiamo già affrontato le tre modalità con cui
534 si conclude un programma in maniera normale: la chiamata di \func{exit} (che
535 esegue le funzioni registrate e chiude gli stream), il ritorno dalla funzione
536 \func{main} (equivalente alla chiamata di \func{exit}), e la chiamata ad
537 \func{\_exit} (che esegue direttamente la terminazione del processo).
538
539 Ma oltre alla conclusione normale abbiamo accennato che esistono anche delle
540 modalità di conclusione anomala; queste sono in sostanza due: il programma può
541 chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere
542 terminato da un segnale.  In realtà anche la prima modalità si riconduce alla
543 seconda, dato che \func{abort} si limita a generare il segnale
544 \macro{SIGABRT}.
545
546 Qualunque sia la modalità di conclusione di un processo, il kernel esegue
547 comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
548 memoria che stava usando, e così via. Ma per ciascuna delle varie modalità
549 di chiusura al padre deve essere riportato come il figlio è terminato. 
550
551 Nel caso di conclusione normale per riportare lo stato di uscita del processo
552 viene usato l'\textit{exit status} specificato dal valore passato alle
553 funzioni \func{exit} o \func{\_exit} (o dal valore di ritorno per
554 \func{main}).  Ma se il processo viene concluso in maniera anomala è il kernel
555 che deve generare un \textit{termination status} per indicare le ragioni della
556 conclusione anomala. Si noti che si è distinto fra \textit{exit status} e
557 \textit{termination status} in quanto anche in caso di conclusione normale, il
558 kernel usa il primo per produrre il secondo.
559
560 In ogni caso il valore dello stato di conclusione del processo può essere
561 letto attraverso le funzioni \func{wait} o \func{waitpid}.
562
563
564 \subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
565 \label{sec:proc_wait}
566
567
568
569 \subsection{Le funzioni \texttt{exec}}
570 \label{sec:proc_exec}
571
572
573
574
575 \section{Il controllo di accesso}
576 \label{sec:proc_perms}
577
578 In questa sezione esamineremo le problematiche relative al controllo di
579 accesso dal punto di vista del processi; gli identificativi usati, come questi
580 vengono modificati nella creazione e nel lancio di nuovi processi, e le varie
581 funzioni per la loro manipolazione diretta.
582
583
584 \subsection{Utente e gruppo di un processo}
585 \label{sec:proc_user_group}
586
587 Abbiamo già accennato in \secref{sec:intro_multiuser} ad ogni utente ed gruppo
588 sono associati due identificatori univoci, lo \acr{uid} e il \acr{gid} che li
589 contraddistinguono nei confronti del kernel. Questi identificatori stanno alla
590 base del sistema di permessi e protezioni di un sistema unix, e vengono usati
591 anche nella gestione dei privilegi di accesso dei processi.
592
593 In realtà ad ogni processo è associato un certo numero di identificatori, il
594 cui elenco è riportato \ntab, in genere questi derivano direttamente
595 dall'utente che ha lanciato il processo (attraverso i valori di \acr{uid} e
596 \acr{gid}), e vengono usati sia per il controllo di accesso ai file che per la
597 gestione dei privilegi associati ai processi stessi.
598 \begin{table}[htb]
599   \centering
600   \begin{tabular}[c]{|c|l|l|}
601     \hline
602     Sigla & Significato & Utilizzo \\ 
603     \hline
604     \hline
605     \acr{ruid} & \textit{real user id} & indica l'utente reale che ha lanciato
606     il programma\\ 
607     \acr{rgid} & \textit{real group id} & indica il gruppo reale dell'utente 
608     che ha lanciato il programma \\ 
609     \acr{euid} & \textit{effective user id} & indica l'utente effettivo usato
610     dal programma \\ 
611     \acr{egid} & \textit{effective group id} & indica il gruppo effettivo usato
612     dal programma \\ 
613                & \textit{supplementary group id} & indica i gruppi cui
614     l'utente appartiene  \\ 
615     \acr{suid} & \textit{saved user id} & indica l'utente  \\ 
616     \acr{sgid} & \textit{daved group id} & indica il gruppo  \\ 
617     \acr{fsuid} & \textit{filesystem user id} & indica l'utente effettivo per
618     il filesystem \\ 
619     \acr{fsgid} & \textit{filesystem group id} & indica il gruppo effettivo
620     per il filesystem  \\ 
621     \hline
622   \end{tabular}
623   \caption{Identificatori di utente e gruppo associati a ciascun processo.}
624   \label{tab:proc_uid_gid}
625 \end{table}
626
627 Il \textit{real user id} e il \textit{real group id} indicano l'utente che ha
628 lanciato il processo, e vengono settati al login al valore standard di
629 \acr{uid} e \acr{gid} dell'utente letti direttamente da \file{/etc/passwd}.
630 Questi non vengono mai cambiati nella creazione di nuovi processi e restano
631 sempre gli stessi per tutti i processi avviati in una sessione. In realtà è
632 possibile modificarli (vedi \secref{sec:proc_setuid}), ma solo per un processo
633 che abbia i privilegi di amministratore (ed è così infatti che \cmd{login},
634 che gira con i privilegi di amministratore, li setta ai valori corrispondenti
635 all'utente che entra nel sistema).
636
637 L'\textit{effective user id}, l'\textit{effective group id} e gli eventuali
638 \textit{supplementary group id} sono gli identificativi usati per il controllo
639 di accesso ai file secondo quanto descritto in dettaglio in
640 \secref{sec:file_perm_overview}. Normalmente sono uguali al \textit{real user
641   id} e al \textit{real group id}, a meno che il file posto in esecuzione non
642 abbia i bit \acr{suid} o \acr{sgid} settati, nel qual caso vengono settati
643 rispettivamente all'\acr{uid} e \acr{gid} del file.
644
645 Il \textit{saved user id} e il \textit{saved group id} sono copie
646 dell'\textit{effective user id} e dell'\textit{effective group id} del
647 processo padre, e vengono settati all'avvio del processo, prima che
648 \textit{effective user id} e \textit{effective group id} vengano modificati
649 per tener conto di eventuali \acr{suid} o \acr{sgid}.
650
651
652 \subsection{Le funzioni \texttt{setuid} e \texttt{setgid}}
653 \label{sec:proc_setuid}
654
655
656 \subsection{Le funzioni \texttt{seteuid} e \texttt{setegid}}
657 \label{sec:proc_seteuid}
658